#!/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 [-l limit] [-a arch] [commit message]' fi repo="$1" shift ;; *pkg) repo="${cmd%pkg}" ;; *) abort 'usage: commitpkg [-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