From 70309118ab1d082bf12dfd39c3068f5fdd6662dc Mon Sep 17 00:00:00 2001 From: Eric Bélanger Date: Wed, 23 Oct 2013 23:34:12 -0400 Subject: checkpkg: Create symlinks to old packages in $TEMPDIR instead of $PWD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric Bélanger Signed-off-by: Pierre Schmitz --- checkpkg.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'checkpkg.in') diff --git a/checkpkg.in b/checkpkg.in index ef46399..3bd22e4 100644 --- a/checkpkg.in +++ b/checkpkg.in @@ -58,15 +58,15 @@ for _pkgname in "${pkgname[@]}"; do if [[ $pkgurl = file://* ]]; then ln -s "${pkgurl#file://}" "${pkgurl##file://*/}" elif [[ -f "$PKGDEST/$oldpkg" ]]; then - ln -s "$PKGDEST/$oldpkg" "$oldpkg" + ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg" elif [[ -f "$STARTDIR/$oldpkg" ]]; then - ln -s "$STARTDIR/$oldpkg" "$oldpkg" + ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg" else - curl -fsLC - --retry 3 --retry-delay 3 -o "$oldpkg" "$pkgurl" + curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl" fi 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" -- cgit v1.2.3-54-g00ecf From 7524bec6d930992876611f6c901852d8ae0d7ab0 Mon Sep 17 00:00:00 2001 From: Eric Bélanger Date: Wed, 23 Oct 2013 23:24:45 -0400 Subject: checkpkg: Fix soname check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bsdtar options were in the incorrect order and objdump couldn't find the files. Signed-off-by: Eric Bélanger Signed-off-by: Pierre Schmitz --- checkpkg.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'checkpkg.in') diff --git a/checkpkg.in b/checkpkg.in index 3bd22e4..4d2a905 100644 --- a/checkpkg.in +++ b/checkpkg.in @@ -73,9 +73,9 @@ for _pkgname in "${pkgname[@]}"; do if diff "$TEMPDIR/filelist-$_pkgname"{-old,} | grep '\.so' &>/dev/null; then mkdir -p "$TEMPDIR/pkg" - bsdtar -C "$TEMPDIR" xf ../"$pkgfile" #> /dev/null + bsdtar -x -C "$TEMPDIR" -f "$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)" + echo "${i}: " "$(objdump -p "$TEMPDIR/$i" | grep SONAME)" done else msg "No soname differences for $_pkgname." -- cgit v1.2.3-54-g00ecf From e3cf64ad2f83d979b8ca86445b612f5268725cb6 Mon Sep 17 00:00:00 2001 From: Eric Bélanger Date: Mon, 28 Oct 2013 23:27:03 -0400 Subject: checkpkg: Only match .so at end of filenames for soname check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric Bélanger Signed-off-by: Pierre Schmitz --- checkpkg.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'checkpkg.in') diff --git a/checkpkg.in b/checkpkg.in index 4d2a905..4a46df3 100644 --- a/checkpkg.in +++ b/checkpkg.in @@ -74,7 +74,7 @@ for _pkgname in "${pkgname[@]}"; do if diff "$TEMPDIR/filelist-$_pkgname"{-old,} | grep '\.so' &>/dev/null; then mkdir -p "$TEMPDIR/pkg" bsdtar -x -C "$TEMPDIR" -f "$pkgfile" #> /dev/null - diff "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname" | awk '/>.*\.so/{$1 = ""; print $0}' | while read i; do + 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 -- cgit v1.2.3-54-g00ecf From 27441f201c2394a991427f6a47199dd40024497b Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Sun, 20 Oct 2013 16:17:45 -0400 Subject: common: implement find_cached_package This function (currently) searches through $PWD and $PKGDEST looking for a tarball matching the requested package name, architecture, and pkgver. If found, it writes the full path to the located package to stdout and returns 0, else 1. If more than 1 match is found, it's treated as an error and the user will need to figure out what to do. Use this in checkpkg and commitpkg, which previously implemented their own less complete logic, to locate the build artifacts they rely on. Signed-off-by: Dave Reisner Signed-off-by: Pierre Schmitz --- checkpkg.in | 14 ++++-------- commitpkg.in | 24 +++------------------ lib/common.sh | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 31 deletions(-) (limited to 'checkpkg.in') diff --git a/checkpkg.in b/checkpkg.in index 4a46df3..b3894ab 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 \"$pkgfile\" doesn't exist" - fi + ln -s "$pkgfile" "$TEMPDIR" pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname") diff --git a/commitpkg.in b/commitpkg.in index 8dcbd7c..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' @@ -99,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 @@ -151,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 3ec26ff..1812cb7 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 unset ALL_OFF BOLD BLUE GREEN RED YELLOW if [[ -t 2 ]]; then @@ -154,3 +156,70 @@ slock() { stat_done fi } + +## +# 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 results + + for dir in "${searchdirs[@]}"; do + [[ -d $dir ]] || continue + + for pkg in "$dir"/*.pkg.tar?(.?z); do + [[ -f $pkg ]] || continue + + # 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[@]}" + return 1 + esac +} -- cgit v1.2.3-54-g00ecf From 3029c8e4bcaf090327bddd8668a6fa1462e22e42 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Fri, 1 Nov 2013 21:13:43 +0100 Subject: checkpkg: Fix usage of local mirrors --- checkpkg.in | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'checkpkg.in') diff --git a/checkpkg.in b/checkpkg.in index b3894ab..ccbbecd 100644 --- a/checkpkg.in +++ b/checkpkg.in @@ -48,16 +48,14 @@ 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" "$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 + 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 "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old" -- cgit v1.2.3-54-g00ecf