When using the -S/--source option, add source package information to the sync db if one is found alongside the package file. This could be potentially used by a libalpm frontend to build package from source or provide a simple replacement to the Arch Build System. Signed-off-by: Allan McRae <allan@archlinux.org> --- doc/repo-add.8.txt | 4 +++ scripts/repo-add.sh.in | 74 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/doc/repo-add.8.txt b/doc/repo-add.8.txt index d44a8a7..fd7aafb 100644 --- a/doc/repo-add.8.txt +++ b/doc/repo-add.8.txt @@ -82,6 +82,10 @@ repo-add Options Remove old package files from the disk when updating their entry in the database. +*-S, \--source*:: + Add information about source package files to the database if found next to + the package file. + Example ------- diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index 4325dbf..b9175e4 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -30,6 +30,7 @@ declare -r confdir='@sysconfdir@' QUIET=0 DELTA=0 +SOURCE=0 ONLYADDNEW=0 RMEXISTING=0 WITHFILES=0 @@ -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,31 @@ find_pkgentry() { return 1 } +find_sourcepkg() { + local -a files + + for i in $@; do + if [[ ${i##*.} != "sig" ]]; then + files+=("$i") + fi + done + + case ${#files[@]} in + 0|1) + if [[ ! -f $1 ]]; then + warning "$(gettext "No source package found")" + return 1 + fi + ;; + *) + warning "$(gettext "Cannot determine source package - multiple matches found:")" + msg2 '%s' "$@" + return 1 + ;; + esac + echo "$files" +} + # Get the package name from the delta filename get_delta_pkgname() { local tmp @@ -193,6 +220,37 @@ db_remove_delta() { return 1 } # end db_remove_delta +# write source entry +db_write_source() { + local sourcepkg pgpsigsize pgpsig czise md5sum sha256sum + + sourcepkg=$1 + + if [[ -f "$sourcepkg.sig" ]]; then + pgpsigsize=$(@SIZECMD@ -L "$sourcepkg.sig") + if (( pgpsigsize > 16384 )); then + error "$(gettext "Invalid package signature file '%s'.")" "$sourcepkg.sig" + return 1 + fi + local pgpsig=$(openssl base64 -in "$sourcepkg.sig" | tr -d '\n') + fi + + csize=$(@SIZECMD@ -L "$sourcepkg") + + md5sum=$(openssl dgst -md5 "$sourcepkg") + md5sum=${md5sum##* } + sha256sum=$(openssl dgst -sha256 "$sourcepkg") + sha256sum=${sha256sum##* } + + { + format_entry "FILENAME" "${sourcepkg##*/}" + format_entry "CSIZE" "$csize" + format_entry "MD5SUM" "$md5sum" + format_entry "SHA256SUM" "$sha256sum" + format_entry "PGPSIG" "$pgpsig" + } >"$tmpdir/tree/$pkgname-$pkgver/source" +} + check_gpg() { if ! type -p gpg >/dev/null; then error "$(gettext "Cannot find the gpg binary! Is GnuPG installed?")" @@ -264,8 +322,8 @@ db_write_entry() { local pkgfile=$1 local -a _groups _licenses _replaces _depends _conflicts _provides \ _optdepends _makedepends _checkdepends - local pkgname pkgbase pkgver pkgdesc csize size url arch builddate packager \ - md5sum sha256sum pgpsig pgpsigsize + local pkgname pkgbase pkgver basever pkgdesc csize size url arch builddate \ + packager md5sum sha256sum pgpsig pgpsigsize # read info from the zipped package local line var val @@ -398,6 +456,17 @@ db_write_entry() { bsdtar --exclude='^.*' -tf "$pkgfile" >>"$files_path" fi + # create a source file + if (( SOURCE )); then + msg2 "$(gettext "Creating '%s' db entry...")" 'source' + local sourcefile + + if sourcefile=$(find_sourcepkg \ + "${pkgbase:-$pkgname}-${basever:-$pkgver}.src.tar"*); then + db_write_source "$sourcefile" + fi + fi + # create a delta file if (( DELTA )); then if [[ -n $oldfilename ]]; then @@ -624,6 +693,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.9.1