diff options
author | bill-auger <mr.j.spam.me@gmail.com> | 2020-07-14 09:45:44 -0400 |
---|---|---|
committer | bill-auger <mr.j.spam.me@gmail.com> | 2020-11-20 22:53:30 -0500 |
commit | 3c86b7cd19def6c0b9c41ab8868ff3c07bf742a3 (patch) | |
tree | 29cd8e5419d68afb45b13bed691ef030f5e78cfb /src/abslibre-tools | |
parent | d3a4b74c817fc8aa7fbcc67195ac2af3f1c7d66b (diff) |
whitespace
Diffstat (limited to 'src/abslibre-tools')
-rwxr-xr-x | src/abslibre-tools/librerelease | 434 |
1 files changed, 217 insertions, 217 deletions
diff --git a/src/abslibre-tools/librerelease b/src/abslibre-tools/librerelease index c8518fb..83898af 100755 --- a/src/abslibre-tools/librerelease +++ b/src/abslibre-tools/librerelease @@ -47,266 +47,266 @@ setup_traps dryrun="" upload_only=false readonly rsync_flags=( - --no-group - --no-perms - --copy-links - --hard-links - --partial - --human-readable - --progress + --no-group + --no-perms + --copy-links + --hard-links + --partial + --human-readable + --progress ) # Functions #################################################################### list0_files() { - find -L "${WORKDIR}/staging" -type f -not -name '*.lock' \ - -exec realpath -z --relative-to="${WORKDIR}/staging" {} + + find -L "${WORKDIR}/staging" -type f -not -name '*.lock' \ + -exec realpath -z --relative-to="${WORKDIR}/staging" {} + } # This function is taken almost verbatim from makepkg create_signature() { - local ret=$EXIT_SUCCESS - local filename="$1" - msg "Signing package..." + local ret=$EXIT_SUCCESS + local filename="$1" + msg "Signing package..." - local SIGNWITHKEY=() - if [[ -n $GPGKEY ]]; then - SIGNWITHKEY=(-u "${GPGKEY}") - fi + local SIGNWITHKEY=() + if [[ -n $GPGKEY ]]; then + SIGNWITHKEY=(-u "${GPGKEY}") + fi - gpg --detach-sign --use-agent "${SIGNWITHKEY[@]}" --no-armor "$filename" &>/dev/null || ret=$EXIT_FAILURE + gpg --detach-sign --use-agent "${SIGNWITHKEY[@]}" --no-armor "$filename" &>/dev/null || ret=$EXIT_FAILURE - if (( ! ret )); then - msg2 "Created signature file %s." "$filename.sig" - else - error "Failed to sign package file." - return $ret - fi + if (( ! ret )); then + msg2 "Created signature file %s." "$filename.sig" + else + error "Failed to sign package file." + return $ret + fi } sign_packages() { - IFS=$'\n' - local files=($(find "${WORKDIR}/staging/" -type f -not -iname '*.sig' -print)) - local file - for file in "${files[@]}"; do - if [[ -f "${file}.sig" ]]; then - msg2 "File signature found, verifying..." - - # Verify that the signature is correct, else remove for re-signing - if ! gpg --quiet --verify "${file}.sig" >/dev/null 2>&1; then - error "Failed! Re-signing..." - rm -f "${file}.sig" - fi - fi - - if ! [[ -f "${file}.sig" ]]; then - create_signature "$file" || return - fi - done + IFS=$'\n' + local files=($(find "${WORKDIR}/staging/" -type f -not -iname '*.sig' -print)) + local file + for file in "${files[@]}"; do + if [[ -f "${file}.sig" ]]; then + msg2 "File signature found, verifying..." + + # Verify that the signature is correct, else remove for re-signing + if ! gpg --quiet --verify "${file}.sig" >/dev/null 2>&1; then + error "Failed! Re-signing..." + rm -f "${file}.sig" + fi + fi + + if ! [[ -f "${file}.sig" ]]; then + create_signature "$file" || return + fi + done } # Clean everything if not in dry-run mode clean_files() ( - local file_list=$1 - - local rmcmd=(rm -fv) - if [[ -n "${dryrun}" ]]; then - rmcmd=(printf "$(_ "removed '%s' (dry-run)")\n") - fi - - msg "Removing files from local staging directory" - cd "${WORKDIR}/staging" - xargs -0r -a "$file_list" "${rmcmd[@]}" - find . -depth -mindepth 1 -type d \ - -exec rmdir --ignore-fail-on-non-empty -- '{}' + + local file_list=$1 + + local rmcmd=(rm -fv) + if [[ -n "${dryrun}" ]]; then + rmcmd=(printf "$(_ "removed '%s' (dry-run)")\n") + fi + + msg "Removing files from local staging directory" + cd "${WORKDIR}/staging" + xargs -0r -a "$file_list" "${rmcmd[@]}" + find . -depth -mindepth 1 -type d \ + -exec rmdir --ignore-fail-on-non-empty -- '{}' + ) ################################################################################ usage() { - print "Usage: %s [OPTIONS]" "${0##*/}" - print 'Upload packages in $WORKDIR/staging to the Parabola server' - echo - print "Options:" - flag '-c' 'Clean; delete packages in $WORKDIR/staging' - flag '-l' "List; list packages but not upload them" - flag '-u' "Upload-only; do not run db-update on the server" - - flag '-n' "Dry-run; don't actually do anything" - flag '-h' "Show this message" + print "Usage: %s [OPTIONS]" "${0##*/}" + print 'Upload packages in $WORKDIR/staging to the Parabola server' + echo + print "Options:" + flag '-c' 'Clean; delete packages in $WORKDIR/staging' + flag '-l' "List; list packages but not upload them" + flag '-u' "Upload-only; do not run db-update on the server" + + flag '-n' "Dry-run; don't actually do anything" + flag '-h' "Show this message" } main() { - if [[ -w / ]]; then - error "This program should be run as regular user" - return $EXIT_NOPERMISSION - fi - - # Parse options - local mode="release_packages" - while getopts 'clunh' arg; do - case $arg in - c) mode=clean ;; - l) mode=pretty_print_packages ;; - u) upload_only=true ;; - n) dryrun="--dry-run" ;; - h) mode=usage ;; - *) usage >&2; return $EXIT_INVALIDARGUMENT ;; - esac - done - shift $((OPTIND - 1)) - if [[ $# != 0 ]]; then - usage >&2 - return $EXIT_INVALIDARGUMENT - fi - - if [[ $mode == usage ]]; then - usage - return $EXIT_SUCCESS - fi - - declare -i ret=0 - load_conf makepkg.conf GPGKEY || ret=$? - load_conf libretools.conf WORKDIR REPODEST DBSCRIPTS_CONFIG || ret=$? # and HOOK{PRE,POST}RELEASE, which are optional - [[ $ret = 0 ]] || exit $ret - - local re_url='^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$' - local re_authority='^(([^@]*)@)?([^][@:]*|\[[^]]*\])(:([0-9]*))?$' - local REPODEST_ok=false - if [[ "$REPODEST" =~ $re_url ]]; then - REPODEST_ok=true - - REPODEST_scheme=${BASH_REMATCH[2]} - REPODEST_authority=${BASH_REMATCH[4]} - REPODEST_path=${BASH_REMATCH[5]} - REPODEST_query=${BASH_REMATCH[7]} - REPODEST_fragment=${BASH_REMATCH[9]} - - if [[ "$REPODEST_authority" =~ $re_authority ]]; then - REPODEST_userinfo=${BASH_REMATCH[2]} - REPODEST_host=${BASH_REMATCH[3]} - REPODEST_port=${BASH_REMATCH[5]} - - if [[ "$REPODEST_host" = '['*']' ]]; then - REPODEST_host=${REPODEST_HOST#'['} - REPODEST_host=${REPODEST_HOST#']'} - fi - else - REPODEST_ok=false - fi - - [[ $REPODEST_scheme == ssh ]] || REPODEST_ok=false - [[ -n $REPODEST_host ]] || REPODEST_ok=false - [[ -n $REPODEST_path ]] || REPODEST_ok=false - fi - if ! $REPODEST_ok; then - error 'The format of libretools.conf:REPODEST has changed.' - plain 'Merge the /etc/libretools.conf.pacnew file!' - return $EXIT_NOTCONFIGURED - fi - if [[ "$REPODEST_path" = '/~'* ]]; then - if [[ "$REPODEST_path" = '/~/'* ]]; then - REPODEST_path=${REPODEST_path#'/~/'} - else - error 'Unfortunately, `~user` home-directory expansion is not (yet?) supported in libretools.conf:REPODEST' - return $EXIT_NOTCONFIGURED - fi - fi - REPODEST_userhost="${REPODEST_userinfo:+${REPODEST_userinfo%%:*}@}${REPODEST_host}" - - "$mode" + if [[ -w / ]]; then + error "This program should be run as regular user" + return $EXIT_NOPERMISSION + fi + + # Parse options + local mode="release_packages" + while getopts 'clunh' arg; do + case $arg in + c) mode=clean ;; + l) mode=pretty_print_packages ;; + u) upload_only=true ;; + n) dryrun="--dry-run" ;; + h) mode=usage ;; + *) usage >&2; return $EXIT_INVALIDARGUMENT ;; + esac + done + shift $((OPTIND - 1)) + if [[ $# != 0 ]]; then + usage >&2 + return $EXIT_INVALIDARGUMENT + fi + + if [[ $mode == usage ]]; then + usage + return $EXIT_SUCCESS + fi + + declare -i ret=0 + load_conf makepkg.conf GPGKEY || ret=$? + load_conf libretools.conf WORKDIR REPODEST DBSCRIPTS_CONFIG || ret=$? # and HOOK{PRE,POST}RELEASE, which are optional + [[ $ret = 0 ]] || exit $ret + + local re_url='^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$' + local re_authority='^(([^@]*)@)?([^][@:]*|\[[^]]*\])(:([0-9]*))?$' + local REPODEST_ok=false + if [[ "$REPODEST" =~ $re_url ]]; then + REPODEST_ok=true + + REPODEST_scheme=${BASH_REMATCH[2]} + REPODEST_authority=${BASH_REMATCH[4]} + REPODEST_path=${BASH_REMATCH[5]} + REPODEST_query=${BASH_REMATCH[7]} + REPODEST_fragment=${BASH_REMATCH[9]} + + if [[ "$REPODEST_authority" =~ $re_authority ]]; then + REPODEST_userinfo=${BASH_REMATCH[2]} + REPODEST_host=${BASH_REMATCH[3]} + REPODEST_port=${BASH_REMATCH[5]} + + if [[ "$REPODEST_host" = '['*']' ]]; then + REPODEST_host=${REPODEST_HOST#'['} + REPODEST_host=${REPODEST_HOST#']'} + fi + else + REPODEST_ok=false + fi + + [[ $REPODEST_scheme == ssh ]] || REPODEST_ok=false + [[ -n $REPODEST_host ]] || REPODEST_ok=false + [[ -n $REPODEST_path ]] || REPODEST_ok=false + fi + if ! $REPODEST_ok; then + error 'The format of libretools.conf:REPODEST has changed.' + plain 'Merge the /etc/libretools.conf.pacnew file!' + return $EXIT_NOTCONFIGURED + fi + if [[ "$REPODEST_path" = '/~'* ]]; then + if [[ "$REPODEST_path" = '/~/'* ]]; then + REPODEST_path=${REPODEST_path#'/~/'} + else + error 'Unfortunately, `~user` home-directory expansion is not (yet?) supported in libretools.conf:REPODEST' + return $EXIT_NOTCONFIGURED + fi + fi + REPODEST_userhost="${REPODEST_userinfo:+${REPODEST_userinfo%%:*}@}${REPODEST_host}" + + "$mode" } # The different modes (sans 'usage') ########################################### pretty_print_packages() { - find "$WORKDIR/staging/" -mindepth 1 -maxdepth 1 -type d -not -empty | sort | - while read -r path; do - msg2 "${path##*/}" - cd "$path" - find -L . -type f -not -name '*.lock' | sed 's|^\./| |' | sort - done + find "$WORKDIR/staging/" -mindepth 1 -maxdepth 1 -type d -not -empty | sort | + while read -r path; do + msg2 "${path##*/}" + cd "$path" + find -L . -type f -not -name '*.lock' | sed 's|^\./| |' | sort + done } clean() { - lock 8 "${WORKDIR}/staging.lock" \ - 'Waiting for an exclusive lock on the staging directory' + lock 8 "${WORKDIR}/staging.lock" \ + 'Waiting for an exclusive lock on the staging directory' - local file_list - file_list="$(mktemp -t "${0##*/}.XXXXXXXXXX")" - trap "rm -f -- ${file_list@Q}" EXIT - list0_files > "$file_list" + local file_list + file_list="$(mktemp -t "${0##*/}.XXXXXXXXXX")" + trap "rm -f -- ${file_list@Q}" EXIT + list0_files > "$file_list" - lock_close 8 + lock_close 8 - clean_files "$file_list" + clean_files "$file_list" } release_packages() { - if [[ -n $HOOKPRERELEASE ]]; then - msg "Running HOOKPRERELEASE..." - ( - PS4=" \\[$BOLD\\]\$\\[$ALL_OFF\\] " - eval -- "set -x; $HOOKPRERELEASE" - ) - fi - - lock 8 "${WORKDIR}/staging.lock" \ - 'Waiting for an exclusive lock on the staging directory' - - sign_packages || return - - # Make the permissions of the packages 644 otherwise the user will get access - # denied error when they try to download (rsync --no-perms doesn't seem to - # work). - find "${WORKDIR}/staging" -type f -exec chmod 644 {} + - find "${WORKDIR}/staging" -type d -exec chmod 755 {} + - - local file_list="$(mktemp -t ${0##*/}.XXXXXXXXXX)" - trap "rm -f -- ${file_list@Q}" EXIT - list0_files > "$file_list" - - lock_close 8 - - msg "%s to upload" "$(cd "${WORKDIR}/staging" && du -hc --files0-from="$file_list" | sed -n '$s/\t.*//p')" - msg "Uploading packages..." - xargs -0r -a "$file_list" dirname -z | ssh ${REPODEST_port:+-p "$REPODEST_port"} "${REPODEST_userhost}" "mkdir -p -- ${REPODEST_path@Q} && cd ${REPODEST_path@Q} && xargs -0r mkdir -pv --" - if ! rsync ${dryrun} "${rsync_flags[@]}" \ - -e "ssh ${REPODEST_port:+-p $REPODEST_port}" \ - -0 --files-from="$file_list" \ - "${WORKDIR}/staging" \ - "$REPODEST_userhost:$REPODEST_path/" - then - error "Sync failed, try again" - return $EXIT_FAILURE - fi - - clean_files "$file_list" - - if $upload_only; then - return $EXIT_SUCCESS - fi - - msg "Running db-update on repos" - ssh ${REPODEST_port:+-p "$REPODEST_port"} "${REPODEST_userhost}" "STAGING=${REPODEST_path@Q} DBSCRIPTS_CONFIG=${DBSCRIPTS_CONFIG@Q} db-update" - - if [[ -n $HOOKPOSTRELEASE ]]; then - msg "Running HOOKPOSTRELEASE..." - ( - PS4=" \\[$BOLD\\]\$\\[$ALL_OFF\\] " - eval -- "set -x; $HOOKPOSTRELEASE" - ) - fi - - # notify pbot of the excellent work we have done - local packages=$(grep -E '\.pkg\.tar\.[^\.]+$' ${file_list} | sed 's|.*/\([^/ ]*\)/[^\ ]*$|\1|' | xargs) - local login=${REPODEST_userinfo:-somebody} ; login=${login%%:*} ; - local pbot_say_cmd="which pbot-say && pbot-say ${login} just published: ${packages}" - ssh ${REPODEST_port:+-p "$REPODEST_port"} "${REPODEST_userhost}" "${pbot_say_cmd}" - - return $EXIT_SUCCESS + if [[ -n $HOOKPRERELEASE ]]; then + msg "Running HOOKPRERELEASE..." + ( + PS4=" \\[$BOLD\\]\$\\[$ALL_OFF\\] " + eval -- "set -x; $HOOKPRERELEASE" + ) + fi + + lock 8 "${WORKDIR}/staging.lock" \ + 'Waiting for an exclusive lock on the staging directory' + + sign_packages || return + + # Make the permissions of the packages 644 otherwise the user will get access + # denied error when they try to download (rsync --no-perms doesn't seem to + # work). + find "${WORKDIR}/staging" -type f -exec chmod 644 {} + + find "${WORKDIR}/staging" -type d -exec chmod 755 {} + + + local file_list="$(mktemp -t ${0##*/}.XXXXXXXXXX)" + trap "rm -f -- ${file_list@Q}" EXIT + list0_files > "$file_list" + + lock_close 8 + + msg "%s to upload" "$(cd "${WORKDIR}/staging" && du -hc --files0-from="$file_list" | sed -n '$s/\t.*//p')" + msg "Uploading packages..." + xargs -0r -a "$file_list" dirname -z | ssh ${REPODEST_port:+-p "$REPODEST_port"} "${REPODEST_userhost}" "mkdir -p -- ${REPODEST_path@Q} && cd ${REPODEST_path@Q} && xargs -0r mkdir -pv --" + if ! rsync ${dryrun} "${rsync_flags[@]}" \ + -e "ssh ${REPODEST_port:+-p $REPODEST_port}" \ + -0 --files-from="$file_list" \ + "${WORKDIR}/staging" \ + "$REPODEST_userhost:$REPODEST_path/" + then + error "Sync failed, try again" + return $EXIT_FAILURE + fi + + clean_files "$file_list" + + if $upload_only; then + return $EXIT_SUCCESS + fi + + msg "Running db-update on repos" + ssh ${REPODEST_port:+-p "$REPODEST_port"} "${REPODEST_userhost}" "STAGING=${REPODEST_path@Q} DBSCRIPTS_CONFIG=${DBSCRIPTS_CONFIG@Q} db-update" + + if [[ -n $HOOKPOSTRELEASE ]]; then + msg "Running HOOKPOSTRELEASE..." + ( + PS4=" \\[$BOLD\\]\$\\[$ALL_OFF\\] " + eval -- "set -x; $HOOKPOSTRELEASE" + ) + fi + + # notify pbot of the excellent work we have done + local packages=$(grep -E '\.pkg\.tar\.[^\.]+$' ${file_list} | sed 's|.*/\([^/ ]*\)/[^\ ]*$|\1|' | xargs) + local login=${REPODEST_userinfo:-somebody} ; login=${login%%:*} ; + local pbot_say_cmd="which pbot-say && pbot-say ${login} just published: ${packages}" + ssh ${REPODEST_port:+-p "$REPODEST_port"} "${REPODEST_userhost}" "${pbot_say_cmd}" + + return $EXIT_SUCCESS } main "$@" |