summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2014-01-04 23:48:38 -0500
committerLuke Shumaker <LukeShu@sbcglobal.net>2014-01-04 23:48:38 -0500
commit6223f9fca6803d814ba026cb5b88c9c2ed48b540 (patch)
tree1fdec1424a55471032ac4edd5b08157b005720e3
parent021653a0acecc8763e1bbe90dbb770b4e6df4390 (diff)
parent40ea1b3ca5c6f6fdbeda230f4048ac7934d68acf (diff)
Merge branch 'devtools'
Conflicts: checkpkg.in lib/common.sh makechrootpkg.in
-rw-r--r--Makefile2
-rw-r--r--checkpkg.in40
-rw-r--r--commitpkg.in46
-rw-r--r--lib/common.sh74
-rw-r--r--makechrootpkg.in49
5 files changed, 141 insertions, 70 deletions
diff --git a/Makefile b/Makefile
index 333e97a..1f3c74d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-V=20131020
+V=20131107
PREFIX = /usr/local
diff --git a/checkpkg.in b/checkpkg.in
index eb95745..81e7184 100644
--- a/checkpkg.in
+++ b/checkpkg.in
@@ -29,18 +29,12 @@ STARTDIR=$(pwd)
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)
for _pkgname in "${pkgname[@]}"; do
- pkgfile=(${_pkgname}-$(get_full_version $_pkgname)-${CARCH}.pkg.tar?(.?z))
- if (( ${#pkgfile[*]} != 1 )); then
- die 'Ambiguous package name: %s\n' "${pkgfile[*]}"
+ target_pkgver=$(get_full_version "$_pkgname")
+ if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
+ die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
fi
- if [[ -f "$STARTDIR/$pkgfile" ]]; then
- ln -s "$STARTDIR/$pkgfile" "$TEMPDIR/$pkgfile"
- elif [[ -f "$PKGDEST/$pkgfile" ]]; then
- ln -s "$PKGDEST/$pkgfile" "$TEMPDIR/$pkgfile"
- else
- die "File \"%s\" doesn't exist" "$pkgfile"
- fi
+ ln -s "$pkgfile" "$TEMPDIR"
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")
@@ -54,28 +48,26 @@ for _pkgname in "${pkgname[@]}"; do
die "The built package (%s) is the one in the repo right now!" "$_pkgname"
fi
- if [[ ! -f $oldpkg ]]; then
- if [[ $pkgurl = file://* ]]; then
- ln -s "${pkgurl#file://}" "${pkgurl##file://*/}"
- elif [[ -f "$PKGDEST/$oldpkg" ]]; then
- ln -s "$PKGDEST/$oldpkg" "$oldpkg"
- elif [[ -f "$STARTDIR/$oldpkg" ]]; then
- ln -s "$STARTDIR/$oldpkg" "$oldpkg"
- else
- curl -fsLC - --retry 3 --retry-delay 3 -o "$oldpkg" "$pkgurl"
- fi
+ if [[ $pkgurl = file://* ]]; then
+ ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg"
+ elif [[ -f "$PKGDEST/$oldpkg" ]]; then
+ ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg"
+ elif [[ -f "$STARTDIR/$oldpkg" ]]; then
+ ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg"
+ else
+ curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
fi
- bsdtar tf "$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
+ bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"
sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
if diff "$TEMPDIR/filelist-$_pkgname"{-old,} | grep '\.so' &>/dev/null; then
mkdir -p "$TEMPDIR/pkg"
- bsdtar -C "$TEMPDIR" xf ../"$pkgfile" #> /dev/null
- diff "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname" | awk '/>.*\.so/{$1 = ""; print $0}' | while read i; do
- echo "${i}: " "$(objdump -p "$i" | grep SONAME)"
+ bsdtar -x -C "$TEMPDIR" -f "$pkgfile" #> /dev/null
+ comm -13 <(sort "$TEMPDIR/filelist-$_pkgname-old") <(sort "$TEMPDIR/filelist-$_pkgname") | grep .so$ | while read i; do
+ echo "${i}: " "$(objdump -p "$TEMPDIR/$i" | grep SONAME)"
done
else
msg "No soname differences for %s." "$_pkgname"
diff --git a/commitpkg.in b/commitpkg.in
index fe9348b..1095006 100644
--- a/commitpkg.in
+++ b/commitpkg.in
@@ -2,22 +2,6 @@
m4_include(lib/common.sh)
-getpkgfile() {
- 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
-
- echo "$1"
-}
-
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
source '/etc/makepkg.conf'
@@ -55,24 +39,28 @@ case "$cmd" in
;;
esac
-# check if all local source files are under version control
+# find files which should be under source control
+needsversioning=()
for s in "${source[@]}"; do
- if [[ $s != *://* ]] && ! svn status -v "$s@" | grep -q '^[ AMRX~]'; then
- die "%s is not under version control" "$s"
- fi
+ [[ $s != *://* ]] && needsversioning+=("$s")
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
- die "%s is not under version control" "$file"
- fi
+ needsversioning+=("$file")
done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
done
+# 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
+
rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y)
archreleaseopts=()
while getopts ':l:a:s:f' flag; do
@@ -95,9 +83,8 @@ for _arch in ${arch[@]}; do
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
+ if pkgfile=$(find_cached_package "$_pkgname" "$_arch" "$fullver"); then
+ if grep -q "packager = Unknown Packager" <(bsdtar -xOqf "$pkgfile" .PKGINFO); then
die "PACKAGER was not set when building package"
fi
fi
@@ -147,8 +134,7 @@ for _arch in ${arch[@]}; do
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 ! pkgfile=$(find_cached_package "$_pkgname" "$fullver" "${_arch}"); then
warning "Skipping $_pkgname-$fullver-$_arch: failed to locate package file"
skip_arches+=($_arch)
continue 2
diff --git a/lib/common.sh b/lib/common.sh
index 1baab9c..dff9b43 100644
--- a/lib/common.sh
+++ b/lib/common.sh
@@ -1,6 +1,8 @@
# Avoid any encoding problems
export LANG=C
+shopt -s extglob
+
# check if messages are to be printed using color
declare ALL_OFF= BOLD= BLUE= GREEN= RED= YELLOW=
if [[ -t 2 ]]; then
@@ -184,3 +186,75 @@ lock_close() {
local fd=$1
eval "exec $fd>&-"
}
+
+##
+# usage: pkgver_equal( $pkgver1, $pkgver2 )
+##
+pkgver_equal() {
+ local left right
+
+ 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
+ local dir pkg pkgbasename pkgparts name ver rel arch size r results
+
+ for dir in "${searchdirs[@]}"; do
+ [[ -d $dir ]] || continue
+
+ for pkg in "$dir"/*.pkg.tar?(.?z); do
+ [[ -f $pkg ]] || continue
+
+ # avoid adding duplicates of the same inode
+ for r in "${results[@]}"; do
+ [[ $r -ef $pkg ]] && continue 2
+ done
+
+ # split apart package filename into parts
+ pkgbasename=${pkg##*/}
+ pkgbasename=${pkgbasename%.pkg.tar?(.?z)}
+
+ 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)
+ printf '%s\n' "$results"
+ return 0
+ ;;
+ *)
+ error 'Multiple packages found:'
+ printf '\t%s\n' "${results[@]}" >&2
+ return 1
+ esac
+}
diff --git a/makechrootpkg.in b/makechrootpkg.in
index cbff882..052ab71 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -106,9 +106,14 @@ fi
makepkg_args+=("$@")
# See if -R was passed to makepkg
-if in_array '-R' "${makepkg_args[@]}"; then
- repack=true
-fi
+for arg in "${@:OPTIND}"; do
+ case ${arg%%=*} in
+ -*R*|--repackage)
+ repack=true
+ break 2
+ ;;
+ esac
+done
if [[ -n $SUDO_USER ]]; then
USER_HOME=$(eval echo ~$SUDO_USER)
@@ -122,7 +127,7 @@ load_vars() {
[[ -f $makepkg_conf ]] || return 1
- for var in {SRC,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
+ for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
[[ -z ${!var} ]] && eval $(grep "^${var}=" "$makepkg_conf")
done
@@ -139,7 +144,7 @@ create_chroot() {
slock 8 "$chrootdir/root.lock" "Locking clean chroot"
stat_busy "Creating clean working copy [%s]" "$copy"
- if [[ "$chroottype" == btrfs ]]; then
+ if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
if [[ -d $copydir ]]; then
btrfs subvolume delete "$copydir" >/dev/null ||
die "Unable to delete subvolume %s" "$copydir"
@@ -211,6 +216,11 @@ prepare_chroot() {
echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf"
fi
+ mkdir -p "$copydir/srcpkgdest"
+ if ! grep -q 'SRCPKGDEST="/srcpkgdest"' "$copydir/etc/makepkg.conf"; then
+ echo 'SRCPKGDEST="/srcpkgdest"' >> "$copydir/etc/makepkg.conf"
+ fi
+
mkdir -p "$copydir/logdest"
if ! grep -q 'LOGDEST="/logdest"' "$copydir/etc/makepkg.conf"; then
echo 'LOGDEST="/logdest"' >> "$copydir/etc/makepkg.conf"
@@ -224,7 +234,7 @@ prepare_chroot() {
echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf"
fi
- chown -R nobody "$copydir"/{build,pkgdest,logdest,srcdest,startdir}
+ chown -R nobody "$copydir"/{build,pkgdest,srcpkgdest,logdest,srcdest,startdir}
if [[ -n $MAKEFLAGS ]]; then
sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf"
@@ -284,14 +294,16 @@ _chrootbuild() {
ln -sft /srcdest /srcdest_host/*
ln -sft /startdir /startdir_host/*
- # XXX: Keep svn sources writable
+ # XXX: Keep bzr and svn sources writable
# Since makepkg 4.1.1 they get checked out via cp -a, copying the symlink
for dir in /srcdest /startdir; do
- cd $dir
- for svndir in */.svn; do
- rm ${svndir%/.svn}
- cp -a ${dir}_host/${svndir%/.svn} .
- chown -R nobody ${svndir%/.svn}
+ for vcs in bzr svn; do
+ cd "$dir"
+ for vcsdir in */.$vcs; do
+ rm "${vcsdir%/.$vcs}"
+ cp -a "${dir}_host/${vcsdir%/.$vcs}" .
+ chown -R nobody "${vcsdir%/.$vcs}"
+ done
done
done
@@ -328,9 +340,15 @@ move_products() {
done
for l in "$copydir"/logdest/*; do
+ [[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
mv "$l" "$LOGDEST"
done
+
+ for s in "$copydir"/srcpkgdest/*; do
+ chown "$src_owner" "$s"
+ mv "$s" "$SRCPKGDEST"
+ done
}
# }}}
@@ -340,9 +358,10 @@ load_vars /etc/makepkg.conf
load_vars "$USER_HOME/.makepkg.conf"
# Use PKGBUILD directory if these don't exist
-[[ -d $PKGDEST ]] || PKGDEST=$PWD
-[[ -d $SRCDEST ]] || SRCDEST=$PWD
-[[ -d $LOGDEST ]] || LOGDEST=$PWD
+[[ -d $PKGDEST ]] || PKGDEST=$PWD
+[[ -d $SRCDEST ]] || SRCDEST=$PWD
+[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
+[[ -d $LOGDEST ]] || LOGDEST=$PWD
create_chroot