diff options
Diffstat (limited to 'scripts/repo-add.sh.in')
-rw-r--r-- | scripts/repo-add.sh.in | 105 |
1 files changed, 41 insertions, 64 deletions
diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index 32e3a301..b12188ce 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -34,7 +34,6 @@ REPO_DB_FILE="" umask 0022 msg() { - [ $QUIET -ne 0 ] && return local mesg=$1; shift printf "==> ${mesg}\n" "$@" >&1 } @@ -68,8 +67,8 @@ repo-remove will update a package database by removing the package name\n\ specified on the command line from the given repo database. Multiple\n\ packages to remove can be specified on the command line.\n\n")" printf "$(gettext "\ -The -q/--quiet flag to either program will force silent running except\n\ -in the case of warnings or errors.\n\n")" +Use the -q/--quiet flag to minimize output to basic messages, warnings,\n\ +and errors\n\n")" echo "$(gettext "Example: repo-add /path/to/repo.db.tar.gz pacman-3.0.0.pkg.tar.gz")" echo "$(gettext "Example: repo-remove /path/to/repo.db.tar.gz kernel26")" } @@ -83,15 +82,6 @@ This is free software; see the source for copying conditions.\n\ There is NO WARRANTY, to the extent permitted by law.\n")" } -# test if a file is a repository DB -test_repo_db_file () { - if bsdtar -tf "$REPO_DB_FILE" | grep -q "/desc"; then - return 0 # YES - else - return 1 # NO - fi -} - # write a list entry # arg1 - Entry name # arg2 - List @@ -107,8 +97,8 @@ write_list_entry() { # arg1 - path to delta db_write_delta() { - # blank out all variables and set deltafile to absolute path - local deltafile=$($realpath "$1") + # blank out all variables + local deltafile="$1" local filename=$(basename "$deltafile") local deltavars pkgname fromver tover arch csize md5sum @@ -138,12 +128,12 @@ db_write_delta() # arg1 - path to package db_write_entry() { - # blank out all variables and set pkgfile to an absolute path - local pkgfile=$($realpath "$1") + # blank out all variables + local pkgfile="$1" local pkgname pkgver pkgdesc url builddate packager csize size \ group depend backup license replaces provides conflict force \ _groups _depends _backups _licenses _replaces _provides _conflicts \ - startdir optdepend _optdepends + startdir optdepend _optdepends md5sum local OLDIFS="$IFS" # IFS (field separator) is only the newline character @@ -172,19 +162,23 @@ db_write_entry() IFS=$OLDIFS - # get compressed size of package + # get md5sum and compressed size of package + md5sum="$(openssl dgst -md5 "$pkgfile" | awk '{print $NF}')" csize=$(@SIZECMD@ "$pkgfile") - startdir=$(pwd) - pushd "$gstmpdir" 2>&1 >/dev/null - # ensure $pkgname and $pkgver variables were found if [ -z "$pkgname" -o -z "$pkgver" ]; then error "$(gettext "Invalid package file '%s'.")" "$pkgfile" - popd 2>&1 >/dev/null return 1 fi + startdir=$(pwd) + pushd "$gstmpdir" 2>&1 >/dev/null + + if [ -d "$pkgname-$pkgver" ]; then + warning "$(gettext "An entry for '%s' already existed")" "$pkgname-$pkgver" + fi + # remove an existing entry if it exists, ignore failures db_remove_entry "$pkgname" @@ -204,7 +198,7 @@ db_write_entry() # compute checksums msg2 "$(gettext "Computing md5 checksums...")" - echo -e "%MD5SUM%\n$(openssl dgst -md5 "$pkgfile" | awk '{print $NF}')\n" >>desc + echo -e "%MD5SUM%\n$md5sum\n" >>desc [ -n "$url" ] && echo -e "%URL%\n$url\n" >>desc write_list_entry "LICENSE" "$_licenses" "desc" @@ -222,6 +216,7 @@ db_write_entry() write_list_entry "OPTDEPENDS" "$_optdepends" "depends" # create deltas entry if there are delta files + # Xav : why should deltas be in $startdir? for delta in $startdir/$pkgname-*-*_to_*-*-$arch.delta; do # This for loop also pulls in all files that start with the current package # name and are followed by a -whatever. For instance, running this loop for @@ -247,11 +242,15 @@ db_write_entry() # add the final newline [ -f "deltas" ] && echo -e "" >>deltas + popd 2>&1 >/dev/null + # preserve the modification time - touch -r "$pkgfile" desc depends - [ -f "deltas" ] && touch -r "$pkgfile" deltas + # Xav : what for? + pkgdir="$gstmpdir/$pkgname-$pkgver" + touch -r "$pkgfile" "$pkgdir/desc" "$pkgdir/depends" + [ -f "$pkgdir/deltas" ] && touch -r "$pkgfile" "$pkgdir/deltas" - popd 2>&1 >/dev/null + return 0 } # end db_write_entry # remove existing entries from the DB @@ -298,28 +297,6 @@ if [ $# -lt 2 ]; then exit 1 fi -# check for and store the name of a realpath-like program -if [ $(type -t realpath) ]; then - realpath='realpath' -elif [ $(type -t readlink) ]; then - realpath='readlink -f' -else - error "$(gettext "Either realpath or readlink are required by repo-add.")" - exit 1 # $E_MISSING_PROGRAM -fi - -# source system and user makepkg.conf -if [ -r "$confdir/makepkg.conf" ]; then - source "$confdir/makepkg.conf" -else - error "$(gettext "%s not found. Cannot continue.")" "$confdir/makepkg.conf" - exit 1 # $E_CONFIG_ERROR -fi - -if [ -r ~/.makepkg.conf ]; then - source ~/.makepkg.conf -fi - # main routine gstmpdir=$(mktemp -d /tmp/repo-tools.XXXXXXXXXX) || (\ error "$(gettext "Cannot create temp directory for database building.")"; \ @@ -341,10 +318,9 @@ for arg in "$@"; do elif [ "$arg" == "--quiet" -o "$arg" == "-q" ]; then QUIET=1 elif [ -z "$REPO_DB_FILE" ]; then - # store absolute path to repo DB - REPO_DB_FILE=$($realpath "$arg") + REPO_DB_FILE="$arg" if [ -f "$REPO_DB_FILE" ]; then - if ! test_repo_db_file $cmd; then + if ! (bsdtar -tf "$REPO_DB_FILE" | grep -q "/desc"); then error "$(gettext "Repository file '%s' is not a proper pacman database.")" "$REPO_DB_FILE" exit 1 fi @@ -384,26 +360,27 @@ done # if all operations were a success, re-zip database if [ $success -eq 1 ]; then msg "$(gettext "Creating updated database file '%s'")" "$REPO_DB_FILE" - pushd "$gstmpdir" 2>&1 >/dev/null - if [ -n "$(ls)" ]; then - [ -f "${REPO_DB_FILE}.old" ] && rm "${REPO_DB_FILE}.old" - [ -f "$REPO_DB_FILE" ] && mv "$REPO_DB_FILE" "${REPO_DB_FILE}.old" + case "$REPO_DB_FILE" in + *tar.gz) TAR_OPT="z" ;; + *tar.bz2) TAR_OPT="j" ;; + *) warning "$(gettext "'%s' does not have a valid archive extension.")" \ + "$REPO_DB_FILE" ;; + esac - case "$DB_COMPRESSION" in - gz) TAR_OPT="z" ;; - bz2) TAR_OPT="j" ;; - *) warning "$(gettext "No compression set.")" ;; - esac + filename=$(basename "$REPO_DB_FILE") - bsdtar -c${TAR_OPT}f "$REPO_DB_FILE" * + pushd "$gstmpdir" 2>&1 >/dev/null + if [ -n "$(ls)" ]; then + bsdtar -c${TAR_OPT}f "$filename" * else - # we should only end up with an empty db after a remove of the last package in the database + # the database will be moved to .old below, and there will be no new one to replace it error "$(gettext "All packages have been removed from the database. Deleting '%s'.")" "$REPO_DB_FILE" - rm "$REPO_DB_FILE" fi - popd 2>&1 >/dev/null + + [ -f "$REPO_DB_FILE" ] && mv -f "$REPO_DB_FILE" "${REPO_DB_FILE}.old" + [ -f "$gstmpdir/$filename" ] && mv "$gstmpdir/$filename" "$REPO_DB_FILE" else msg "$(gettext "No packages modified, nothing to do.")" fi |