Skip to content
commitpkg.in 5.14 KiB
Newer Older
m4_include(lib/common.sh)
	case $# in
		0)
			error 'No canonical package found!'
			return 1
			;;
		[!1])
			error 'Failed to canonicalize package name -- multiple packages found:'
			msg2 '%s' "$@"
			return 1
			;;
	esac
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
	source '/etc/makepkg.conf'
	die '/etc/makepkg.conf not found!'
fi

# Source user-specific makepkg.conf overrides
if [[ -r ~/.makepkg.conf ]]; then
	. ~/.makepkg.conf
if [[ ! -f PKGBUILD ]]; then
	die 'No PKGBUILD file'
. PKGBUILD
pkgbase=${pkgbase:-$pkgname}
case "$cmd" in
	commitpkg)
		if (( $# == 0 )); then
			die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
		fi
		repo="$1"
		shift
		;;
	*pkg)
		repo="${cmd%pkg}"
		;;
	*)
		die 'Usage: commitpkg <reponame> [-f] [-s server] [-l limit] [-a arch] [commit message]'
# 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
		die "%s is not under version control" "$s"
# check if changelog and install files are under version control
		# evaluate any bash variables used
		eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
		if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then
			die "%s is not under version control" "$file"
	done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y)
archreleaseopts=()
while getopts ':l:a:s:f' flag; do
	case $flag in
		f) archreleaseopts+=('-f') ;;
		s) server=$OPTARG ;;
		l) rsyncopts+=("--bwlimit=$OPTARG") ;;
		a) commit_arch=$OPTARG ;;
		:) die "Option requires an argument -- '%s'" "$OPTARG" ;;
		\?) die "Invalid option -- '%s'" "$OPTARG" ;;
	esac
done
shift $(( OPTIND - 1 ))
# check packages have the packager field set
for _arch in ${arch[@]}; do
	if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
		continue
	fi
	for _pkgname in ${pkgname[@]}; do
		fullver=$(get_full_version $_pkgname)

		if pkgfile=$(shopt -s nullglob;
				getpkgfile "${PKGDEST+$PKGDEST/}$_pkgname-$fullver-${_arch}".pkg.tar.?z); then
			if grep -q "packager = Unknown Packager" <(bsdtar -xOqf $pkgfile .PKGINFO); then
				die "PACKAGER was not set when building package"
			fi
		fi
	done
done

if [[ -z $server ]]; then
	server='nymeria.archlinux.org'
if [[ -n $(svn status -q) ]]; then
	msgtemplate="upgpkg: $pkgbase $(get_full_version)"$'\n\n'
	if [[ -n $1 ]]; then
		stat_busy 'Committing changes to trunk'
		svn commit -q -m "${msgtemplate}${1}" || die
		stat_done
Pierre Schmitz's avatar
Pierre Schmitz committed
		msgfile="$(mktemp)"
		echo "$msgtemplate" > "$msgfile"
		if [[ -n $SVN_EDITOR ]]; then
Pierre Schmitz's avatar
Pierre Schmitz committed
			$SVN_EDITOR "$msgfile"
		elif [[ -n $VISUAL ]]; then
Pierre Schmitz's avatar
Pierre Schmitz committed
			$VISUAL "$msgfile"
		elif [[ -n $EDITOR ]]; then
Pierre Schmitz's avatar
Pierre Schmitz committed
			$EDITOR "$msgfile"
		else
			vi "$msgfile"
		fi
		[[ -s $msgfile ]] || die
		stat_busy 'Committing changes to trunk'
		svn commit -q -F "$msgfile" || die
Pierre Schmitz's avatar
Pierre Schmitz committed
		unlink "$msgfile"
declare -a uploads
declare -a commit_arches
declare -a skip_arches
for _arch in ${arch[@]}; do
	if [[ -n $commit_arch && ${_arch} != "$commit_arch" ]]; then
		skip_arches+=($_arch)
	for _pkgname in ${pkgname[@]}; do
		fullver=$(get_full_version $_pkgname)
		if ! pkgfile=$(shopt -s nullglob;
				getpkgfile "${PKGDEST+$PKGDEST/}$_pkgname-$fullver-${_arch}".pkg.tar.?z); then
			warning "Skipping $_pkgname-$fullver-$_arch: failed to locate package file"
			skip_arches+=($_arch)
			continue 2
		fi
		uploads+=("$pkgfile")
		sigfile="${pkgfile}.sig"
		if [[ ! -f $sigfile ]]; then
			msg "Signing package ${pkgfile}..."
			if [[ -n $GPGKEY ]]; then
				SIGNWITHKEY="-u ${GPGKEY}"
			fi
			gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || die
		if ! gpg --verify "$sigfile" >/dev/null 2>&1; then
			die "Signature %s.sig is incorrect!" "$pkgfile"
		uploads+=("$sigfile")
	done
for _arch in ${arch[@]}; do
	if ! in_array $_arch ${skip_arches[@]}; then
		commit_arches+=($_arch)
	fi
done
if [[ ${#commit_arches[*]} -gt 0 ]]; then
	archrelease "${archreleaseopts[@]}" "${commit_arches[@]/#/$repo-}" || die
fi
if [[ ${#uploads[*]} -gt 0 ]]; then
	new_uploads=()
	# convert to absolute paths so rsync can work with colons (epoch)
	while read -r -d '' upload; do
		new_uploads+=("$upload")
	done < <(realpath -z "${uploads[@]}")
	uploads=("${new_uploads[@]}")
	unset new_uploads
	msg 'Uploading all package and signature files'
	rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || die
if [[ "${arch[*]}" == 'any' ]]; then
	if [[ -d ../repos/$repo-i686 && -d ../repos/$repo-x86_64 ]]; then
		pushd ../repos/ >/dev/null
		stat_busy "Removing $repo-i686 and $repo-x86_64"
		svn rm -q $repo-i686
		svn rm -q $repo-x86_64
		svn commit -q -m "Removed $repo-i686 and $repo-x86_64 for $pkgname"
		popd >/dev/null
	fi
	if [[ -d ../repos/$repo-any ]]; then
		stat_busy "Removing $repo-any"
		svn rm -q $repo-any
		svn commit -q -m "Removed $repo-any for $pkgname"