209 lines
4.9 KiB
Bash
209 lines
4.9 KiB
Bash
#!/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
|
|
while read -r file; do
|
|
# evaluate any bash variables used
|
|
eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
|
|
if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then
|
|
abort "${file} is not under version control"
|
|
fi
|
|
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
|
|
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")
|
|
|
|
sigfile="${pkgfile}.sig"
|
|
if [[ $SIGNPKG == 'y' ]] && [ ! -f "${sigfile}" ]; then
|
|
echo "Signing package ${pkgfile}..."
|
|
if [[ -n $GPGKEY ]]; then
|
|
SIGNWITHKEY="-u ${GPGKEY}"
|
|
fi
|
|
gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || abort
|
|
fi
|
|
if [ -f "${sigfile}" ]; then
|
|
if ! gpg --verify "$sigfile" >/dev/null 2>&1; then
|
|
abort "Signature ${pkgfile}.sig is incorrect!"
|
|
fi
|
|
uploads+=("$sigfile")
|
|
else
|
|
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
|