2017-03-28 21:41:32 +02:00
|
|
|
#!/hint/bash
|
2021-06-10 19:16:22 +02:00
|
|
|
#
|
2017-04-02 10:10:01 +02:00
|
|
|
# This may be included with or without `set -euE`
|
2021-06-10 19:16:22 +02:00
|
|
|
#
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2017-03-28 22:13:18 +02:00
|
|
|
|
2017-04-02 10:10:02 +02:00
|
|
|
[[ -z ${_INCLUDE_COMMON_SH:-} ]] || return 0
|
2018-01-15 17:57:00 +01:00
|
|
|
_INCLUDE_COMMON_SH="$(set +o|grep nounset)"
|
2017-04-02 10:10:02 +02:00
|
|
|
|
2018-01-15 17:57:00 +01:00
|
|
|
set +u +o posix
|
2017-09-25 00:56:32 +02:00
|
|
|
# shellcheck disable=1091
|
|
|
|
. /usr/share/makepkg/util.sh
|
2018-01-15 17:57:00 +01:00
|
|
|
$_INCLUDE_COMMON_SH
|
2017-09-25 00:56:32 +02:00
|
|
|
|
2011-11-01 15:33:08 +01:00
|
|
|
# Avoid any encoding problems
|
|
|
|
export LANG=C
|
|
|
|
|
2021-06-21 20:46:16 +02:00
|
|
|
# Set buildtool properties
|
|
|
|
export BUILDTOOL=devtools
|
|
|
|
export BUILDTOOLVER=m4_devtools_version
|
|
|
|
|
2013-10-20 22:17:45 +02:00
|
|
|
shopt -s extglob
|
|
|
|
|
2011-11-01 15:33:08 +01:00
|
|
|
# check if messages are to be printed using color
|
2019-11-22 01:08:25 +01:00
|
|
|
if [[ -t 2 && "$TERM" != dumb ]]; then
|
2017-09-25 00:56:32 +02:00
|
|
|
colorize
|
|
|
|
else
|
|
|
|
# shellcheck disable=2034
|
|
|
|
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
|
2011-11-01 15:33:08 +01:00
|
|
|
fi
|
|
|
|
|
|
|
|
stat_busy() {
|
|
|
|
local mesg=$1; shift
|
2017-05-06 00:41:10 +02:00
|
|
|
# shellcheck disable=2059
|
2017-04-02 10:09:55 +02:00
|
|
|
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
|
2011-11-01 15:33:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
stat_done() {
|
2017-05-06 00:41:10 +02:00
|
|
|
# shellcheck disable=2059
|
2011-11-01 15:33:08 +01:00
|
|
|
printf "${BOLD}done${ALL_OFF}\n" >&2
|
|
|
|
}
|
|
|
|
|
2017-03-25 17:34:41 +01:00
|
|
|
_setup_workdir=false
|
2011-11-01 15:33:08 +01:00
|
|
|
setup_workdir() {
|
2017-04-02 10:10:01 +02:00
|
|
|
[[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
|
2017-03-25 17:34:41 +01:00
|
|
|
_setup_workdir=true
|
|
|
|
trap 'trap_abort' INT QUIT TERM HUP
|
|
|
|
trap 'trap_exit' EXIT
|
2011-11-01 15:33:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
cleanup() {
|
2017-04-02 10:10:01 +02:00
|
|
|
if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then
|
2017-03-25 17:34:41 +01:00
|
|
|
rm -rf "$WORKDIR"
|
|
|
|
fi
|
2017-05-06 00:41:08 +02:00
|
|
|
exit "${1:-0}"
|
2011-11-01 15:33:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
abort() {
|
2014-02-16 09:55:58 +01:00
|
|
|
error 'Aborting...'
|
|
|
|
cleanup 255
|
2011-11-01 15:33:08 +01:00
|
|
|
}
|
|
|
|
|
2012-10-03 12:35:40 +02:00
|
|
|
trap_abort() {
|
|
|
|
trap - EXIT INT QUIT TERM HUP
|
|
|
|
abort
|
|
|
|
}
|
|
|
|
|
|
|
|
trap_exit() {
|
2014-06-02 05:54:20 +02:00
|
|
|
local r=$?
|
2012-10-03 12:35:40 +02:00
|
|
|
trap - EXIT INT QUIT TERM HUP
|
2014-06-02 05:54:20 +02:00
|
|
|
cleanup $r
|
2012-10-03 12:35:40 +02:00
|
|
|
}
|
|
|
|
|
2011-11-01 15:33:08 +01:00
|
|
|
die() {
|
2013-07-30 17:00:54 +02:00
|
|
|
(( $# )) && error "$@"
|
2014-02-16 09:55:58 +01:00
|
|
|
cleanup 255
|
2011-11-01 15:33:08 +01:00
|
|
|
}
|
|
|
|
|
2013-05-02 07:03:12 +02:00
|
|
|
##
|
2017-04-02 10:09:55 +02:00
|
|
|
# usage : lock( $fd, $file, $message, [ $message_arguments... ] )
|
2013-05-02 07:03:12 +02:00
|
|
|
##
|
|
|
|
lock() {
|
2017-03-25 17:34:39 +01:00
|
|
|
# Only reopen the FD if it wasn't handed to us
|
|
|
|
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
|
2017-03-25 17:34:40 +01:00
|
|
|
mkdir -p -- "$(dirname -- "$2")"
|
2017-03-25 17:34:39 +01:00
|
|
|
eval "exec $1>"'"$2"'
|
|
|
|
fi
|
|
|
|
|
2017-05-06 00:41:08 +02:00
|
|
|
if ! flock -n "$1"; then
|
2017-04-02 10:09:55 +02:00
|
|
|
stat_busy "${@:3}"
|
2017-05-06 00:41:08 +02:00
|
|
|
flock "$1"
|
2013-05-02 07:03:12 +02:00
|
|
|
stat_done
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
##
|
2017-04-02 10:09:55 +02:00
|
|
|
# usage : slock( $fd, $file, $message, [ $message_arguments... ] )
|
2013-05-02 07:03:12 +02:00
|
|
|
##
|
|
|
|
slock() {
|
2017-03-25 17:34:39 +01:00
|
|
|
# Only reopen the FD if it wasn't handed to us
|
|
|
|
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
|
2017-03-25 17:34:40 +01:00
|
|
|
mkdir -p -- "$(dirname -- "$2")"
|
2017-03-25 17:34:39 +01:00
|
|
|
eval "exec $1>"'"$2"'
|
|
|
|
fi
|
|
|
|
|
2017-05-06 00:41:08 +02:00
|
|
|
if ! flock -sn "$1"; then
|
2017-04-02 10:09:55 +02:00
|
|
|
stat_busy "${@:3}"
|
2017-05-06 00:41:08 +02:00
|
|
|
flock -s "$1"
|
2013-05-02 07:03:12 +02:00
|
|
|
stat_done
|
|
|
|
fi
|
|
|
|
}
|
2013-10-20 22:17:45 +02:00
|
|
|
|
2017-03-25 17:34:38 +01:00
|
|
|
##
|
|
|
|
# usage : lock_close( $fd )
|
|
|
|
##
|
|
|
|
lock_close() {
|
|
|
|
local fd=$1
|
2017-05-06 00:41:08 +02:00
|
|
|
# https://github.com/koalaman/shellcheck/issues/862
|
|
|
|
# shellcheck disable=2034
|
2017-03-25 17:34:38 +01:00
|
|
|
exec {fd}>&-
|
|
|
|
}
|
|
|
|
|
2013-10-20 22:17:45 +02:00
|
|
|
##
|
|
|
|
# usage: pkgver_equal( $pkgver1, $pkgver2 )
|
|
|
|
##
|
|
|
|
pkgver_equal() {
|
|
|
|
if [[ $1 = *-* && $2 = *-* ]]; then
|
|
|
|
# if both versions have a pkgrel, then they must be an exact match
|
|
|
|
[[ $1 = "$2" ]]
|
|
|
|
else
|
|
|
|
# otherwise, trim any pkgrel and compare the bare version.
|
|
|
|
[[ ${1%%-*} = "${2%%-*}" ]]
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
##
|
|
|
|
# usage: find_cached_package( $pkgname, $pkgver, $arch )
|
|
|
|
#
|
|
|
|
# $pkgver can be supplied with or without a pkgrel appended.
|
|
|
|
# If not supplied, any pkgrel will be matched.
|
|
|
|
##
|
|
|
|
find_cached_package() {
|
|
|
|
local searchdirs=("$PWD" "$PKGDEST") results=()
|
|
|
|
local targetname=$1 targetver=$2 targetarch=$3
|
2017-01-06 17:20:16 +01:00
|
|
|
local dir pkg pkgbasename name ver rel arch r results
|
2013-10-20 22:17:45 +02:00
|
|
|
|
|
|
|
for dir in "${searchdirs[@]}"; do
|
|
|
|
[[ -d $dir ]] || continue
|
|
|
|
|
2019-12-04 12:39:34 +01:00
|
|
|
for pkg in "$dir"/*.pkg.tar?(.!(sig|*.*)); do
|
2013-10-20 22:17:45 +02:00
|
|
|
[[ -f $pkg ]] || continue
|
|
|
|
|
2013-11-04 00:57:07 +01:00
|
|
|
# avoid adding duplicates of the same inode
|
|
|
|
for r in "${results[@]}"; do
|
|
|
|
[[ $r -ef $pkg ]] && continue 2
|
|
|
|
done
|
|
|
|
|
2013-10-20 22:17:45 +02:00
|
|
|
# split apart package filename into parts
|
|
|
|
pkgbasename=${pkg##*/}
|
2019-12-04 12:39:34 +01:00
|
|
|
pkgbasename=${pkgbasename%.pkg.tar*}
|
2013-10-20 22:17:45 +02:00
|
|
|
|
|
|
|
arch=${pkgbasename##*-}
|
|
|
|
pkgbasename=${pkgbasename%-"$arch"}
|
|
|
|
|
|
|
|
rel=${pkgbasename##*-}
|
|
|
|
pkgbasename=${pkgbasename%-"$rel"}
|
|
|
|
|
|
|
|
ver=${pkgbasename##*-}
|
|
|
|
name=${pkgbasename%-"$ver"}
|
|
|
|
|
|
|
|
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
|
|
|
|
pkgver_equal "$targetver" "$ver-$rel"; then
|
|
|
|
results+=("$pkg")
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
|
|
|
|
case ${#results[*]} in
|
|
|
|
0)
|
|
|
|
return 1
|
|
|
|
;;
|
|
|
|
1)
|
2017-05-06 00:41:07 +02:00
|
|
|
printf '%s\n' "${results[0]}"
|
2013-10-20 22:17:45 +02:00
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
error 'Multiple packages found:'
|
2013-11-04 00:57:07 +01:00
|
|
|
printf '\t%s\n' "${results[@]}" >&2
|
2013-10-20 22:17:45 +02:00
|
|
|
return 1
|
|
|
|
esac
|
|
|
|
}
|
2021-12-25 15:01:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
check_package_validity(){
|
|
|
|
local pkgfile=$1
|
|
|
|
if grep -q "packager = Unknown Packager" <(bsdtar -xOqf "$pkgfile" .PKGINFO); then
|
|
|
|
die "PACKAGER was not set when building package"
|
|
|
|
fi
|
|
|
|
hashsum=sha256sum
|
|
|
|
pkgbuild_hash=$(awk -v"hashsum=$hashsum" -F' = ' '$1 == "pkgbuild_"hashsum {print $2}' <(bsdtar -xOqf "$pkgfile" .BUILDINFO))
|
|
|
|
if [[ "$pkgbuild_hash" != "$($hashsum PKGBUILD|cut -d' ' -f1)" ]]; then
|
|
|
|
die "PKGBUILD $hashsum mismatch: expected $pkgbuild_hash"
|
|
|
|
fi
|
|
|
|
}
|
2021-12-25 15:05:48 +01:00
|
|
|
|
|
|
|
|
|
|
|
# usage: grep_pkginfo pkgfile pattern
|
|
|
|
grep_pkginfo() {
|
|
|
|
local _ret=()
|
|
|
|
mapfile -t _ret < <(bsdtar -xOqf "$1" ".PKGINFO" | grep "^${2} = ")
|
|
|
|
printf '%s\n' "${_ret[@]#${2} = }"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Get the package name
|
|
|
|
getpkgname() {
|
|
|
|
local _name
|
|
|
|
|
|
|
|
_name="$(grep_pkginfo "$1" "pkgname")"
|
|
|
|
if [[ -z $_name ]]; then
|
|
|
|
error "Package '%s' has no pkgname in the PKGINFO. Fail!" "$1"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "$_name"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Get the package base or name as fallback
|
|
|
|
getpkgbase() {
|
|
|
|
local _base
|
|
|
|
|
|
|
|
_base="$(grep_pkginfo "$1" "pkgbase")"
|
|
|
|
if [[ -z $_base ]]; then
|
|
|
|
getpkgname "$1"
|
|
|
|
else
|
|
|
|
echo "$_base"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
getpkgdesc() {
|
|
|
|
local _desc
|
|
|
|
|
|
|
|
_desc="$(grep_pkginfo "$1" "pkgdesc")"
|
|
|
|
if [[ -z $_desc ]]; then
|
|
|
|
error "Package '%s' has no pkgdesc in the PKGINFO. Fail!" "$1"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "$_desc"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
is_debug_package() {
|
|
|
|
local pkgfile=${1} pkgbase pkgname pkgdesc
|
|
|
|
pkgbase="$(getpkgbase "${pkgfile}")"
|
|
|
|
pkgname="$(getpkgname "${pkgfile}")"
|
|
|
|
pkgdesc="$(getpkgdesc "${pkgfile}")"
|
|
|
|
[[ ${pkgdesc} == "Detached debugging symbols for "* && ${pkgbase}-debug = "${pkgname}" ]]
|
|
|
|
}
|