diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2011-10-14 09:33:07 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2011-10-14 09:33:07 +0200 |
commit | b06b9f60109ad152e8a6ce8c20f9266648d9d70f (patch) | |
tree | 65199dc8d398671431f0fa5af6b65325dacde09e /commitpkg.in | |
parent | 9715ddbe9df6e7a2a37a11c4f3e90a5446459217 (diff) | |
parent | a0c6bf4556e211037b9d9d6de3fd17f798a3c1fb (diff) | |
download | devtools-b06b9f60109ad152e8a6ce8c20f9266648d9d70f.tar.xz |
Merge remote-tracking branch 'cryptocrack/for-pierre'
Diffstat (limited to 'commitpkg.in')
-rw-r--r-- | commitpkg.in | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/commitpkg.in b/commitpkg.in new file mode 100644 index 0000000..2a732b5 --- /dev/null +++ b/commitpkg.in @@ -0,0 +1,207 @@ +#!/bin/bash + +abort() { + echo ${1:-'Cancelled'} + exit 1 +} + +getpkgfile() { + if [[ ${#} -ne 1 ]]; then + echo 'ERROR: No canonical package found!' >&2 + exit 1 + elif [ ! -f "${1}" ]; then + echo "ERROR: Package ${1} not found!" >&2 + exit 1 + fi + + echo ${1} +} + +## +# usage : get_full_version( $epoch, $pkgver, $pkgrel ) +# return : full version spec, including epoch (if necessary), pkgver, pkgrel +## +get_full_version() { + if [[ $1 -eq 0 ]]; then + # zero epoch case, don't include it in version + echo $2-$3 + else + echo $1:$2-$3 + fi +} + +# Source makepkg.conf; fail if it is not found +if [ -r '/etc/makepkg.conf' ]; then + source '/etc/makepkg.conf' +else + abort '/etc/makepkg.conf not found!' +fi + +# Source user-specific makepkg.conf overrides +if [ -r ~/.makepkg.conf ]; then + . ~/.makepkg.conf +fi + +cmd=${0##*/} + +if [ ! -f PKGBUILD ]; then + abort 'No PKGBUILD file' +fi + +. PKGBUILD +pkgbase=${pkgbase:-$pkgname} + +case "$cmd" in + commitpkg) + if [ $# -eq 0 ]; then + abort 'usage: commitpkg <reponame> [-l limit] [-a arch] [commit message]' + fi + repo="$1" + shift + ;; + *pkg) + repo="${cmd%pkg}" + ;; + *) + abort 'usage: commitpkg <reponame> [-l limit] [-a arch] [commit message]' + ;; +esac + +case "$repo" in + core|extra|testing|staging) + server='gerolde.archlinux.org' ;; + community*|multilib*) + server='aur.archlinux.org' ;; + *) + server='gerolde.archlinux.org' + echo "Non-standard repository $repo in use, defaulting to server $server" ;; +esac + +# check if all local source files are under version control +for s in "${source[@]}"; do + if [[ $s != *://* ]] && ! svn status -v "$s" | grep -q '^[ AMRX~]'; then + abort "$s is not under version control" + fi +done + +# check if changelog and install files are under version control +for i in 'changelog' 'install'; do + filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) + for file in $filelist; do + # evaluate any bash variables used + eval file=${file} + if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then + abort "${file} is not under version control" + fi + done +done + +# see if any limit options were passed, we'll send them to rsync +rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y) +while getopts ':l:a:' flag; do + case $flag in + l) rsyncopts+=("--bwlimit=$2") ;; + a) commit_arch=$2 ;; + :) echo "option requires an argument -- '$OPTARG'" >&2 + exit 1 ;; + \?) echo "invalid option -- '$OPTARG'" >&2 + exit 1 ;; + esac +done +shift $(( OPTIND - 1 )) + +if [ -n "$(svn status -q)" ]; then + echo -n 'committing changes to trunk...' + msgtemplate="upgpkg: $pkgbase $(get_full_version ${epoch:-0} $pkgver $pkgrel)"$'\n\n' + if [ -n "$1" ]; then + svn commit -q -m "${msgtemplate}${1}" || abort + else + msgfile="$(mktemp)" + echo "$msgtemplate" > "$msgfile" + if [ -n "$SVN_EDITOR" ]; then + $SVN_EDITOR "$msgfile" + elif [ -n "$VISUAL" ]; then + $VISUAL "$msgfile" + elif [ -n "$EDITOR" ]; then + $EDITOR "$msgfile" + else + vi "$msgfile" + fi + [ -s "$msgfile" ] || abort + svn commit -q -F "$msgfile" || abort + unlink "$msgfile" + fi + echo 'done' +fi + +declare -a uploads + +for _arch in ${arch[@]}; do + if [ -n "$commit_arch" ] && [ "${_arch}" != "$commit_arch" ]; then + echo "skipping ${_arch}" + continue + fi + + for _pkgname in ${pkgname[@]}; do + fullver=$(get_full_version ${epoch:-0} $pkgver $pkgrel) + pkgfile=$(getpkgfile "$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null) + pkgdestfile=$(getpkgfile "$PKGDEST/$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null) + + if [ -f "$pkgfile" ]; then + pkgfile="./$pkgfile" + elif [ -f "$pkgdestfile" ]; then + pkgfile="$pkgdestfile" + else + echo "skipping ${_arch}" + continue 2 + fi + uploads+=("$pkgfile") + + if [[ $SIGNPKG == 'y' ]]; then + echo "Signing package ${pkgfile}..." + if [[ -n $GPGKEY ]]; then + SIGNWITHKEY="-u ${GPGKEY}" + fi + gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || abort + fi + + sigfile="${pkgfile}.sig" + if [ -f "${sigfile}" ]; then + uploads+=("$sigfile") + elif [[ $SIGNPKG == 'y' ]]; then + abort "Signature ${pkgfile}.sig was not found" + fi + done +done + +if [[ -n $commit_arch ]]; then + archrelease "$repo-$commit_arch" || abort +else + archrelease "${arch[@]/#/$repo-}" || abort +fi + +if [[ ${#uploads[*]} -gt 0 ]]; then + echo 'uploading all package and signature files' + rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || abort +fi + +if [ "${arch[*]}" == 'any' ]; then + if [ -d ../repos/$repo-i686 -a -d ../repos/$repo-x86_64 ]; then + pushd ../repos/ >/dev/null + echo "removing $repo-i686 and $repo-x86_64..." + svn rm $repo-i686 + svn rm $repo-x86_64 + svn commit -q -m "removed $repo-i686 and $repo-x86_64 for $pkgname" + echo 'done' + popd >/dev/null + fi +else + if [ -d ../repos/$repo-any ]; then + pushd ../repos/ >/dev/null + echo "removing $repo-any..." + svn rm $repo-any + svn commit -q -m "removed $repo-any for $pkgname" + echo 'done' + popd >/dev/null + fi +fi |