diff options
-rwxr-xr-x | src/abslibre-tools/librerelease | 99 |
1 files changed, 58 insertions, 41 deletions
diff --git a/src/abslibre-tools/librerelease b/src/abslibre-tools/librerelease index 08960bc..f3f6259 100755 --- a/src/abslibre-tools/librerelease +++ b/src/abslibre-tools/librerelease @@ -22,65 +22,57 @@ . libremessages . $(librelib conf.sh) -load_files libretools -check_vars libretools WORKDIR PARABOLAHOST LIBREDESTDIR SIGID || exit 1 -# The following variables are actually optional -#check_vars libretools SIGEXT HOOKPRERELEASE || exit 1 function usage { print "Usage: %s [OPTIONS]" "${0##*/}" echo - print "This script uploads packages on $WORKDIR/stagging" + print 'This script uploads packages on $WORKDIR/stagging' print "to parabola server." echo print "Options:" - print " -c Clean packages on $WORKDIR/staging" + print ' -c Clean packages on $WORKDIR/staging' print " -l Only list packages but not upload them" print " -n Dry-run; don't actually do anything" print " -h Show this message" } function list_packages { - repos=($(find "$WORKDIR/staging/" -mindepth 1 -type d \! -empty -printf '%f ' 2>/dev/null)) - for _repo in ${repos[@]}; do - msg2 "$_repo" - find ${WORKDIR}/staging/${_repo} -type f -printf "%f\n" + find "$WORKDIR/staging/" -mindepth 1 -type d -not -empty -printf '%f\n' | + while read -r repo; do + msg2 "$repo" + find "${WORKDIR}/staging/${repo}" -type f -printf "%f\n" done - unset repos } function sign_packages { - if [ -z "${SIGEXT}" ]; then - SIGEXT=.sig - warning "Empty SIGEXT var, using default .sig" - fi - if [ -z "${GPG_AGENT_INFO}" ]; then warning "It's better to use gpg-agent to sign packages in batches" fi - packages=($(find "${WORKDIR}/staging/" -type f -iname '*.pkg.tar.?z')) - for package in ${packages[@]}; do + find "${WORKDIR}/staging/" -type f -iname '*.pkg.tar.?z' -printf '%h/%f\n' | + while read -r package; do if [ -f "${package}${SIGEXT}" ]; then warning "Package signature found, verifying..." # Verify that the signature is correct, else remove for re-signing if ! gpg --quiet --verify "${package}${SIGEXT}" >/dev/null 2>&1; then - error "Failed! Resigning..." + error "Failed! Re-signing..." rm -f "${package}${SIGEXT}" fi fi if ! [ -f "${package}${SIGEXT}" ]; then msg2 "Signing ${package}..." - gpg --default-key "${SIGID}" --output "${package}${SIGEXT}" \ - --detach-sig "${package}" || { + if ! gpg \ + --default-key "${SIGID}" \ + --output "${package}${SIGEXT}" \ + --detach-sig "${package}" + then error "Signing failed" - exit 2 - } + return 2 + fi fi - done } @@ -93,25 +85,53 @@ function clean_non_packages { # Clean everything if not on dry-run mode function clean { - [ -z ${dryrun} ] && \ - rm -f $@ + if [[ -n "${dryrun}" ]]; then + : + else + msg "Removing files from local staging directory" + # use '-exec rm' instead of '-delete' to be verbose + find "${WORKDIR}/staging" -type f -exec rm -fv {} + + fi } function main { if [ -w / ]; then error "This program should be run as regular user" - exit 1 + return 1 fi - while getopts 'hlcn' arg; do + # Parse options + local dryrun="" + local mode="release_packages" + while getopts 'clnh' arg; do case $arg in - h) usage; exit 0 ;; - l) list_packages; exit 0 ;; - c) clean; exit $? ;; + c) mode=clean ;; + l) mode=list_packages ;; n) dryrun="--dry-run" ;; + h) mode=usage ;; + *) usage >/dev/stderr; return 1 ;; esac done + shift $(($OPTIND - 1)) + if [[ $# != 0 ]]; then + usage >/dev/stderr + return 1 + fi + if [[ $mode == usage ]]; then + usage + return 0 + fi + + load_files libretools + check_vars libretools WORKDIR PARABOLAHOST LIBREDESTDIR SIGID SIGEXT || return 1 + # The following variables are actually optional + #check_vars libretools HOOKPRERELEASE || return 1 + + "$mode" +} + +function release_packages { [[ ! -z ${HOOKPRERELEASE} ]] && bash -c "${HOOKPRERELEASE}" clean_non_packages @@ -123,12 +143,9 @@ function main { find ${WORKDIR}/staging -type f -exec chmod 644 {} \; find ${WORKDIR}/staging -type d -exec chmod 755 {} \; - # Get the synced files - SYNCED_FILES=($(find ${WORKDIR}/staging -type f)) - msg "%s to upload" $(du -h -d 0 ${WORKDIR}/staging | tr "\t" " " | cut -d" " -f1) msg "Uploading packages..." - rsync --recursive \ + if ! rsync --recursive \ ${dryrun} \ --no-group \ --no-perms \ @@ -140,18 +157,18 @@ function main { --progress \ -e "ssh " \ ${WORKDIR}/staging \ - ${PARABOLAHOST}:${LIBREDESTDIR}/ || { + ${PARABOLAHOST}:${LIBREDESTDIR}/ + then error "Sync failed, try again" - exit 1 - } + return 1 + fi - msg "Removing ${#SYNCED_FILES[@]} files from local [staging]" - clean ${SYNCED_FILES[@]} + clean msg "Running db-update on repos" ssh ${PARABOLAHOST} dbscripts/db-update - exit 0 + return 0 } main "$@" |