index : devtools32 | |
Archlinux32 fork of devtools | gitolite user |
summaryrefslogtreecommitdiff |
-rw-r--r-- | src/archrelease.in | 87 |
diff --git a/src/archrelease.in b/src/archrelease.in new file mode 100644 index 0000000..3490ee2 --- /dev/null +++ b/src/archrelease.in @@ -0,0 +1,87 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +m4_include(lib/common.sh) +m4_include(lib/valid-tags.sh) + +# parse command line options +FORCE= +while getopts ':f' flag; do + case $flag in + f) FORCE=1 ;; + :) die "Option requires an argument -- '%s'" "$OPTARG" ;; + \?) die "Invalid option -- '%s'" "$OPTARG" ;; + esac +done +shift $(( OPTIND - 1 )) + +if ! (( $# )); then + echo 'Usage: archrelease [-f] <repo>...' + exit 1 +fi + +# validate repo is really repo-arch +if [[ -z $FORCE ]]; then + for tag in "$@"; do + if ! in_array "$tag" "${_tags[@]}"; then + die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag" + fi + done +fi + +if [[ ! -f PKGBUILD ]]; then + die 'archrelease: PKGBUILD not found' +fi + +trunk=${PWD##*/} + +# Normally this should be trunk, but it may be something +# such as 'gnome-unstable' +IFS='/' read -r -d '' -a parts <<< "$PWD" +if [[ "${parts[*]:(-2):1}" == "repos" ]]; then + die 'archrelease: Should not be in repos dir (try from trunk/)' +fi +unset parts + +if [[ $(svn status -q) ]]; then + die 'archrelease: You have not committed your changes yet!' +fi + +pushd .. >/dev/null +mapfile -t known_files < <(svn ls -r HEAD "$trunk") +wait $! || die "failed to discover committed files" + +# gracefully handle files containing an "@" character +known_files=("${known_files[@]/%/@}") + +# update repo directory first to avoid a commit failure +svn up repos + +for tag in "$@"; do + stat_busy "Copying %s to %s" "${trunk}" "${tag}" + + if [[ -d repos/$tag ]]; then + mapfile -t trash < <(svn ls --recursive "repos/$tag") + wait $! || die "failed to discover existing files" + if (( ${#trash[@]} )); then + trash=("${trash[@]/#/repos/$tag/}") + svn rm -q "${trash[@]/%/@}" + fi + else + mkdir -p "repos/$tag" + svn add --parents -q "repos/$tag" + fi + + # copy all files at once from trunk to the subdirectory in repos/ + svn copy -q -r HEAD "${known_files[@]/#/$trunk/}" "repos/$tag/" + + stat_done +done + +stat_busy "Releasing package" +printf -v tag_list ", %s" "$@"; tag_list="${tag_list#, }" +svn commit -q -m "archrelease: copy ${trunk} to $tag_list" || abort +stat_done + +popd >/dev/null |