summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/abslibre-tools/librerelease99
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 "$@"