On Sat, Nov 02, 2013 at 12:21:42PM +1000, Allan McRae wrote:
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@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 + ;;
I think if you check for existence here you make this a more robust function which doesn't silently require nullglob. This case label then simply becomes 0|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"
You probably don't want to do this if match_source_package failed...
+} + 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