2004-07-19 07:16:56 +02:00
|
|
|
#!/bin/bash
|
2021-06-10 19:16:22 +02:00
|
|
|
#
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2004-07-19 07:16:56 +02:00
|
|
|
|
2011-11-01 15:33:08 +01:00
|
|
|
m4_include(lib/common.sh)
|
2009-09-23 21:06:25 +02:00
|
|
|
|
2008-01-13 20:53:29 +01:00
|
|
|
# Source makepkg.conf; fail if it is not found
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ -r '/etc/makepkg.conf' ]]; then
|
2017-05-06 00:41:10 +02:00
|
|
|
# shellcheck source=makepkg-x86_64.conf
|
2010-02-13 19:47:16 +01:00
|
|
|
source '/etc/makepkg.conf'
|
2008-01-13 20:53:29 +01:00
|
|
|
else
|
2011-11-01 15:33:08 +01:00
|
|
|
die '/etc/makepkg.conf not found!'
|
2008-01-13 20:53:29 +01:00
|
|
|
fi
|
|
|
|
|
|
|
|
# Source user-specific makepkg.conf overrides
|
2017-04-05 21:35:57 +02:00
|
|
|
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
|
2017-05-06 00:41:10 +02:00
|
|
|
# shellcheck source=/dev/null
|
2017-04-05 21:35:57 +02:00
|
|
|
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
|
|
|
|
elif [[ -r "$HOME/.makepkg.conf" ]]; then
|
2017-05-06 00:41:10 +02:00
|
|
|
# shellcheck source=/dev/null
|
2017-04-05 21:35:57 +02:00
|
|
|
source "$HOME/.makepkg.conf"
|
2008-01-13 20:53:29 +01:00
|
|
|
fi
|
2004-07-19 07:16:56 +02:00
|
|
|
|
2011-08-28 18:36:54 +02:00
|
|
|
cmd=${0##*/}
|
2004-07-19 07:16:56 +02:00
|
|
|
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ ! -f PKGBUILD ]]; then
|
2011-11-01 15:33:08 +01:00
|
|
|
die 'No PKGBUILD file'
|
2004-07-19 07:16:56 +02:00
|
|
|
fi
|
|
|
|
|
2017-05-06 00:41:10 +02:00
|
|
|
source=()
|
|
|
|
# shellcheck source=PKGBUILD.proto
|
2013-08-12 00:09:25 +02:00
|
|
|
. ./PKGBUILD
|
2009-09-25 10:02:33 +02:00
|
|
|
pkgbase=${pkgbase:-$pkgname}
|
2004-09-28 20:57:58 +02:00
|
|
|
|
2011-04-01 23:35:31 +02:00
|
|
|
case "$cmd" in
|
|
|
|
commitpkg)
|
2011-12-02 08:33:33 +01:00
|
|
|
if (( $# == 0 )); then
|
2012-11-15 15:22:50 +01:00
|
|
|
die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
|
2011-04-01 23:35:31 +02:00
|
|
|
fi
|
|
|
|
repo="$1"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
*pkg)
|
|
|
|
repo="${cmd%pkg}"
|
|
|
|
;;
|
|
|
|
*)
|
2012-11-15 15:22:50 +01:00
|
|
|
die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
|
2011-04-01 23:35:31 +02:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2022-03-29 11:36:16 +02:00
|
|
|
|
|
|
|
if (( ${#validpgpkeys[@]} != 0 )); then
|
|
|
|
if [[ -d keys ]]; then
|
|
|
|
for key in "${validpgpkeys[@]}"; do
|
|
|
|
if [[ ! -f keys/pgp/$key.asc ]]; then
|
|
|
|
export-pkgbuild-keys || die 'Failed to export valid PGP keys for source files'
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
else
|
|
|
|
export-pkgbuild-keys || die 'Failed to export valid PGP keys for source files'
|
|
|
|
fi
|
|
|
|
|
|
|
|
svn add --parents --force keys/pgp/*
|
|
|
|
fi
|
|
|
|
|
2013-10-20 22:17:42 +02:00
|
|
|
# find files which should be under source control
|
|
|
|
needsversioning=()
|
2011-08-10 15:17:58 +02:00
|
|
|
for s in "${source[@]}"; do
|
2013-10-20 22:17:42 +02:00
|
|
|
[[ $s != *://* ]] && needsversioning+=("$s")
|
2011-03-11 21:18:24 +01:00
|
|
|
done
|
|
|
|
for i in 'changelog' 'install'; do
|
2011-10-24 20:15:22 +02:00
|
|
|
while read -r file; do
|
2010-06-28 09:54:50 +02:00
|
|
|
# evaluate any bash variables used
|
2017-05-06 00:41:08 +02:00
|
|
|
eval "file=\"$(sed "s/^\(['\"]\)\(.*\)\1\$/\2/" <<< "$file")\""
|
2013-10-20 22:17:42 +02:00
|
|
|
needsversioning+=("$file")
|
2011-10-24 20:15:22 +02:00
|
|
|
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
|
2011-03-11 21:18:24 +01:00
|
|
|
done
|
2022-03-29 11:36:16 +02:00
|
|
|
for key in "${validpgpkeys[@]}"; do
|
|
|
|
needsversioning+=("keys/pgp/$key.asc")
|
|
|
|
done
|
2010-06-28 09:54:50 +02:00
|
|
|
|
2013-10-20 22:17:42 +02:00
|
|
|
# assert that they really are controlled by SVN
|
|
|
|
if (( ${#needsversioning[*]} )); then
|
|
|
|
# svn status's output is only two columns when the status is unknown
|
|
|
|
while read -r status filename; do
|
|
|
|
[[ $status = '?' ]] && unversioned+=("$filename")
|
|
|
|
done < <(svn status -v "${needsversioning[@]}")
|
|
|
|
(( ${#unversioned[*]} )) && die "%s is not under version control" "${unversioned[@]}"
|
|
|
|
fi
|
|
|
|
|
2017-05-06 00:41:07 +02:00
|
|
|
rsyncopts=(-e ssh -p '--chmod=ug=rw,o=r' -c -h -L --progress --partial -y)
|
2012-03-05 16:48:19 +01:00
|
|
|
archreleaseopts=()
|
|
|
|
while getopts ':l:a:s:f' flag; do
|
2011-08-17 03:35:57 +02:00
|
|
|
case $flag in
|
2012-03-05 16:48:19 +01:00
|
|
|
f) archreleaseopts+=('-f') ;;
|
|
|
|
s) server=$OPTARG ;;
|
|
|
|
l) rsyncopts+=("--bwlimit=$OPTARG") ;;
|
|
|
|
a) commit_arch=$OPTARG ;;
|
2013-07-30 21:24:48 +02:00
|
|
|
:) die "Option requires an argument -- '%s'" "$OPTARG" ;;
|
|
|
|
\?) die "Invalid option -- '%s'" "$OPTARG" ;;
|
2011-08-17 03:35:57 +02:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
shift $(( OPTIND - 1 ))
|
2011-05-16 20:11:59 +02:00
|
|
|
|
2019-09-13 21:17:20 +02:00
|
|
|
# check packages for validity
|
2017-05-06 00:41:08 +02:00
|
|
|
for _arch in "${arch[@]}"; do
|
2012-04-11 07:11:23 +02:00
|
|
|
if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
|
|
|
|
continue
|
|
|
|
fi
|
2017-05-06 00:41:08 +02:00
|
|
|
for _pkgname in "${pkgname[@]}"; do
|
|
|
|
fullver=$(get_full_version "$_pkgname")
|
2012-04-11 07:11:23 +02:00
|
|
|
|
2019-09-13 21:15:23 +02:00
|
|
|
if pkgfile=$(find_cached_package "$_pkgname" "$fullver" "$_arch"); then
|
2021-12-25 15:01:15 +01:00
|
|
|
check_package_validity "$pkgfile"
|
2012-04-11 07:11:23 +02:00
|
|
|
fi
|
|
|
|
done
|
2021-12-25 15:06:35 +01:00
|
|
|
|
|
|
|
fullver=$(get_full_version "$pkgbase")
|
|
|
|
if pkgfile=$(find_cached_package "$pkgbase-debug" "$fullver" "$_arch"); then
|
|
|
|
check_package_validity "$pkgfile"
|
|
|
|
fi
|
2012-04-11 07:11:23 +02:00
|
|
|
done
|
|
|
|
|
2012-03-04 22:38:07 +01:00
|
|
|
if [[ -z $server ]]; then
|
2016-05-27 21:02:46 +02:00
|
|
|
server='repos.archlinux.org'
|
2012-03-04 22:38:07 +01:00
|
|
|
fi
|
|
|
|
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ -n $(svn status -q) ]]; then
|
2019-09-28 00:55:45 +02:00
|
|
|
msgtemplate="upgpkg: $pkgbase $(get_full_version)"
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ -n $1 ]]; then
|
2011-11-02 01:38:42 +01:00
|
|
|
stat_busy 'Committing changes to trunk'
|
2019-11-08 15:40:09 +01:00
|
|
|
svn commit -q -m "${msgtemplate}: ${1}" || die
|
2011-11-01 15:33:08 +01:00
|
|
|
stat_done
|
2011-08-12 18:28:13 +02:00
|
|
|
else
|
2011-08-14 21:30:08 +02:00
|
|
|
msgfile="$(mktemp)"
|
|
|
|
echo "$msgtemplate" > "$msgfile"
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ -n $SVN_EDITOR ]]; then
|
2011-08-14 21:30:08 +02:00
|
|
|
$SVN_EDITOR "$msgfile"
|
2011-12-02 08:33:33 +01:00
|
|
|
elif [[ -n $VISUAL ]]; then
|
2011-08-14 21:30:08 +02:00
|
|
|
$VISUAL "$msgfile"
|
2011-12-02 08:33:33 +01:00
|
|
|
elif [[ -n $EDITOR ]]; then
|
2011-08-14 21:30:08 +02:00
|
|
|
$EDITOR "$msgfile"
|
|
|
|
else
|
|
|
|
vi "$msgfile"
|
|
|
|
fi
|
2011-12-02 08:33:33 +01:00
|
|
|
[[ -s $msgfile ]] || die
|
2011-11-02 01:38:42 +01:00
|
|
|
stat_busy 'Committing changes to trunk'
|
2011-11-01 15:33:08 +01:00
|
|
|
svn commit -q -F "$msgfile" || die
|
2011-08-14 21:30:08 +02:00
|
|
|
unlink "$msgfile"
|
2011-11-01 15:33:08 +01:00
|
|
|
stat_done
|
2011-08-12 18:28:13 +02:00
|
|
|
fi
|
2010-02-11 13:53:30 +01:00
|
|
|
fi
|
|
|
|
|
2011-04-01 23:35:34 +02:00
|
|
|
declare -a uploads
|
2011-11-21 10:24:29 +01:00
|
|
|
declare -a commit_arches
|
|
|
|
declare -a skip_arches
|
2011-04-01 23:35:34 +02:00
|
|
|
|
2017-05-06 00:41:08 +02:00
|
|
|
for _arch in "${arch[@]}"; do
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
|
2017-05-06 00:41:08 +02:00
|
|
|
skip_arches+=("$_arch")
|
2011-05-16 20:11:59 +02:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
2017-05-06 00:41:08 +02:00
|
|
|
for _pkgname in "${pkgname[@]}"; do
|
|
|
|
fullver=$(get_full_version "$_pkgname")
|
2013-10-20 22:17:45 +02:00
|
|
|
if ! pkgfile=$(find_cached_package "$_pkgname" "$fullver" "${_arch}"); then
|
2017-04-02 10:09:55 +02:00
|
|
|
warning "Skipping %s: failed to locate package file" "$_pkgname-$fullver-$_arch"
|
2017-05-06 00:41:08 +02:00
|
|
|
skip_arches+=("$_arch")
|
2010-02-13 19:47:16 +01:00
|
|
|
continue 2
|
|
|
|
fi
|
2011-04-01 23:35:34 +02:00
|
|
|
uploads+=("$pkgfile")
|
2021-12-25 15:04:32 +01:00
|
|
|
done
|
2021-12-25 15:06:35 +01:00
|
|
|
|
|
|
|
fullver=$(get_full_version "$pkgbase")
|
|
|
|
if ! pkgfile=$(find_cached_package "$pkgbase-debug" "$fullver" "$_arch"); then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
if ! is_debug_package "$pkgfile"; then
|
|
|
|
continue
|
|
|
|
fi
|
|
|
|
uploads+=("$pkgfile")
|
2021-12-25 15:04:32 +01:00
|
|
|
done
|
2011-04-01 23:35:35 +02:00
|
|
|
|
2021-12-25 15:04:32 +01:00
|
|
|
for pkgfile in "${uploads[@]}"; do
|
|
|
|
sigfile="${pkgfile}.sig"
|
|
|
|
if [[ ! -f $sigfile ]]; then
|
|
|
|
msg "Signing package %s..." "${pkgfile}"
|
|
|
|
if [[ -n $GPGKEY ]]; then
|
|
|
|
SIGNWITHKEY=(-u "${GPGKEY}")
|
2011-04-01 23:35:35 +02:00
|
|
|
fi
|
2021-12-25 15:04:32 +01:00
|
|
|
gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY[@]}" "${pkgfile}" || die
|
|
|
|
fi
|
|
|
|
if ! gpg --verify "$sigfile" "$pkgfile" >/dev/null 2>&1; then
|
|
|
|
die "Signature %s is incorrect!" "$sigfile"
|
|
|
|
fi
|
|
|
|
uploads+=("$sigfile")
|
2009-09-02 04:35:25 +02:00
|
|
|
done
|
2004-08-22 22:24:02 +02:00
|
|
|
|
2017-05-06 00:41:08 +02:00
|
|
|
for _arch in "${arch[@]}"; do
|
|
|
|
if ! in_array "$_arch" "${skip_arches[@]}"; then
|
|
|
|
commit_arches+=("$_arch")
|
2011-11-21 10:24:29 +01:00
|
|
|
fi
|
|
|
|
done
|
2011-08-20 22:20:19 +02:00
|
|
|
|
2012-06-16 16:56:42 +02:00
|
|
|
if [[ ${#commit_arches[*]} -gt 0 ]]; then
|
|
|
|
archrelease "${archreleaseopts[@]}" "${commit_arches[@]/#/$repo-}" || die
|
|
|
|
fi
|
2012-01-22 17:20:52 +01:00
|
|
|
|
2012-06-16 16:56:42 +02:00
|
|
|
if [[ ${#uploads[*]} -gt 0 ]]; then
|
|
|
|
new_uploads=()
|
2012-01-22 17:20:52 +01:00
|
|
|
|
2012-06-16 16:56:42 +02:00
|
|
|
# convert to absolute paths so rsync can work with colons (epoch)
|
|
|
|
while read -r -d '' upload; do
|
|
|
|
new_uploads+=("$upload")
|
|
|
|
done < <(realpath -z "${uploads[@]}")
|
2012-01-22 17:20:52 +01:00
|
|
|
|
2012-06-16 16:56:42 +02:00
|
|
|
uploads=("${new_uploads[@]}")
|
|
|
|
unset new_uploads
|
2011-11-02 01:38:42 +01:00
|
|
|
msg 'Uploading all package and signature files'
|
2011-11-01 15:33:08 +01:00
|
|
|
rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || die
|
2011-04-01 23:35:34 +02:00
|
|
|
fi
|
|
|
|
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ "${arch[*]}" == 'any' ]]; then
|
2017-05-31 23:30:19 +02:00
|
|
|
if [[ -d ../repos/$repo-x86_64 ]]; then
|
2010-02-13 19:47:16 +01:00
|
|
|
pushd ../repos/ >/dev/null
|
2017-05-31 23:30:19 +02:00
|
|
|
stat_busy "Removing %s" "$repo-x86_64"
|
2017-05-06 00:41:08 +02:00
|
|
|
svn rm -q "$repo-x86_64"
|
2017-05-31 23:30:19 +02:00
|
|
|
svn commit -q -m "Removed $repo-x86_64 for $pkgname"
|
2011-11-01 15:33:08 +01:00
|
|
|
stat_done
|
2010-02-13 19:47:16 +01:00
|
|
|
popd >/dev/null
|
|
|
|
fi
|
2011-04-15 22:45:46 +02:00
|
|
|
else
|
2011-12-02 08:33:33 +01:00
|
|
|
if [[ -d ../repos/$repo-any ]]; then
|
2011-04-15 22:45:46 +02:00
|
|
|
pushd ../repos/ >/dev/null
|
2017-04-02 10:09:55 +02:00
|
|
|
stat_busy "Removing %s" "$repo-any"
|
2017-05-06 00:41:08 +02:00
|
|
|
svn rm -q "$repo-any"
|
2011-11-02 01:38:42 +01:00
|
|
|
svn commit -q -m "Removed $repo-any for $pkgname"
|
2011-11-01 15:33:08 +01:00
|
|
|
stat_done
|
2011-04-15 22:45:46 +02:00
|
|
|
popd >/dev/null
|
|
|
|
fi
|
2009-09-18 21:39:37 +02:00
|
|
|
fi
|