summaryrefslogtreecommitdiffstats
path: root/commitpkg.in
diff options
context:
space:
mode:
authorLukas Fleischer <archlinux@cryptocrack.de>2011-08-29 10:53:50 +0200
committerLukas Fleischer <archlinux@cryptocrack.de>2011-10-07 21:53:02 +0200
commit46c4def0733a78ce08702d188e3e1a141fb07316 (patch)
tree69fb80eff39981680faeeba01f88be48026fc05f /commitpkg.in
parent142b032212fd94c0fde75a3dd223444c212c2eaa (diff)
downloaddevtools-46c4def0733a78ce08702d188e3e1a141fb07316.tar.gz
devtools-46c4def0733a78ce08702d188e3e1a141fb07316.tar.xz
Support non-standard install locations
This build system overhaul allows for adding (define-style) macros to our scripts. All source files are now suffixed with ".in" to clarify that they might contain unprocessed defines. The Makefile provides a new rule to preprocess source files and generate proper output scripts. Also, add a "@pkgdatadir@" define (as used in GNU Autotools) and use it instead of hardcoded paths to "/usr/share/devtools" everywhere. We missed this when adding PREFIX support to the build system in commit 35fc83ce7d8dc26cd424321f2e8638d05da0a6d4. Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Diffstat (limited to 'commitpkg.in')
-rw-r--r--commitpkg.in207
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