[pacman-dev] [PATCH 3/3] repo-add: add source package information to sync db
Allan McRae
allan at archlinux.org
Fri Nov 1 22:21:42 EDT 2013
When using the -S/--source option, add source package information to the
sync db if one is found alongside the package file.
TODO: Add documentation
Signed-off-by: Allan McRae <allan at archlinux.org>
---
lib/libalpm/be_sync.c | 2 ++
scripts/repo-add.sh.in | 75 ++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 75 insertions(+), 2 deletions(-)
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 6ebdf3c..eb60b64 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -674,6 +674,8 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive,
/* skip reading delta files if UseDelta is unset */
} else if(strcmp(filename, "files") == 0) {
/* currently do nothing with this file */
+ } else if(strcmp(filename, "source") == 0) {
+ /* currently do nothing with this file */
} else {
/* unknown database file */
_alpm_log(db->handle, ALPM_LOG_DEBUG, "unknown database file: %s\n", filename);
diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
index dbb635a..e4a34d1 100644
--- a/scripts/repo-add.sh.in
+++ b/scripts/repo-add.sh.in
@@ -33,6 +33,7 @@ DELTA=0
ONLYADDNEW=0
RMEXISTING=0
WITHFILES=0
+SOURCE=0
SIGN=0
VERIFY=0
REPO_DB_FILE=
@@ -61,6 +62,7 @@ Multiple packages to add can be specified on the command line.\n")"
printf -- "$(gettext " -n, --new only add packages that are not already in the database\n")"
printf -- "$(gettext " -R, --remove remove package file from disk when updating database entry\n")"
printf -- "$(gettext " -f, --files update database's file list\n")"
+ printf -- "$(gettext " -S, --source add source package information to the database\n")"
elif [[ $cmd == "repo-remove" ]] ; then
printf -- "$(gettext "Usage: repo-remove [options] <path-to-db> <packagename|delta> ...\n")"
printf -- "\n"
@@ -124,6 +126,35 @@ find_pkgentry() {
return 1
}
+match_source_package() {
+ case $# in
+ 0)
+ warning "$(gettext "No source package found")"
+ return 1
+ ;;
+ [!1])
+ warning "$(gettext "Cannot determine source package - multiple matches found:")"
+ msg2 '%s' "$@"
+ return 1
+ ;;
+ esac
+
+ echo "$1"
+}
+
+find_source_package() {
+ local pkgfile pkgname pkgver sourcepkg
+
+ pkgfile=$1
+ pkgname=$2
+ pkgver=$3
+
+ local sourcepkg=$(shopt -s nullglob;
+ match_source_package "$(dirname "$pkgfile")/$pkgname-$pkgver".src.tar!(*.sig))
+
+ echo "$sourcepkg"
+}
+
funcgrep() {
awk -v funcmatch="$1" '
/^[[:space:]]*[[:alnum:]_]+[[:space:]]*\([[:space:]]*\)/ {
@@ -272,8 +303,9 @@ db_write_entry() {
local pkgfile=$1
local -a _groups _licenses _replaces _depends _conflicts _provides \
_optdepends _makedepends _checkdepends
- local pkgname pkgver pkgdesc csize size url arch builddate packager \
- md5sum sha256sum pgpsig pgpsigsize install_functions
+ local pkgname pkgbase pkgver basever pkgdesc csize size url arch builddate \
+ packager md5sum sha256sum pgpsig pgpsigsize install_functions \
+ spkgfile scsize smd5sum ssha256sum spgpsig
# read info from the zipped package
local line var val
@@ -353,6 +385,31 @@ db_write_entry() {
sha256sum=$(openssl dgst -sha256 "$pkgfile")
sha256sum=${sha256sum##* }
+ # gather source package information
+ if (( SOURCE )); then
+ msg2 "$(gettext "Adding source package...")"
+
+ spkgfile=$(find_source_package "$pkgfile" ${pkgbase:-$pkgname} ${basever:-$pkgver})
+
+ if [[ -n "$spkgfile" ]]; then
+ if [[ -f "$spkgfile.sig" ]]; then
+ pgpsigsize=$(@SIZECMD@ -L "$spkgfile.sig")
+ if (( pgpsigsize > 16384 )); then
+ error "$(gettext "Invalid package signature file '%s'.")" "$spkgfile.sig"
+ return 1
+ fi
+ spgpsig=$(openssl base64 -in "$spkgfile.sig" | tr -d '\n')
+ fi
+
+ scsize=$(@SIZECMD@ -L "$spkgfile")
+
+ smd5sum=$(openssl dgst -md5 "$spkgfile")
+ smd5sum=${md5sum##* }
+ ssha256sum=$(openssl dgst -sha256 "$spkgfile")
+ ssha256sum=${sha256sum##* }
+ fi
+ fi
+
# remove an existing entry if it exists, ignore failures
db_remove_entry "$pkgname"
@@ -371,6 +428,7 @@ db_write_entry() {
format_entry "NAME" "$pkgname"
format_entry "BASE" "$pkgbase"
format_entry "VERSION" "$pkgver"
+ format_entry "BASEVER" "$basever"
format_entry "DESC" "$pkgdesc"
format_entry "GROUPS" "${_groups[@]}"
format_entry "CSIZE" "$csize"
@@ -403,6 +461,18 @@ db_write_entry() {
format_entry "CHECKDEPENDS" "${_checkdepends[@]}"
} >'depends'
+ # create source entry
+ if (( SOURCE )) && [[ -n "$spkgfile" ]]; then
+ msg2 "$(gettext "Creating '%s' db entry...")" 'source'
+ {
+ format_entry "FILENAME" "${spkgfile##*/}"
+ format_entry "CSIZE" "$scsize"
+ format_entry "MD5SUM" "$smd5sum"
+ format_entry "SHA256SUM" "$ssha256sum"
+ format_entry "PGPSIG" "$spgpsig"
+ } >'source'
+ fi
+
popd >/dev/null
popd >/dev/null
@@ -640,6 +710,7 @@ while (( $# )); do
-n|--new) ONLYADDNEW=1;;
-R|--remove) RMEXISTING=1;;
-f|--files) WITHFILES=1;;
+ -S|--source) SOURCE=1;;
--nocolor) USE_COLOR='n';;
-s|--sign)
check_gpg
--
1.8.4.2
More information about the pacman-dev
mailing list