summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLevente Polyak <anthraxx@archlinux.org>2022-04-28 01:13:02 +0200
committerLevente Polyak <anthraxx@archlinux.org>2022-05-17 21:03:44 +0200
commitc2f163b6408fb69c2b85da17d7656cd75ac5449d (patch)
treea07fd51cda337ab5433e1457e7a1e25c062fe499
parentc339536a37e9d3211b4732d7996b7a3f89289ba7 (diff)
downloaddevtools-c2f163b6408fb69c2b85da17d7656cd75ac5449d.tar.xz
diffpkg: support comparing two given package archives
This adds support similar to diffpkg from the infrastructure repo that is based on the assumption that two archives can be passed to the tooling in order to compare them.
-rw-r--r--diffpkg.in158
-rw-r--r--doc/diffpkg.1.asciidoc13
-rw-r--r--zsh_completion.in1
3 files changed, 104 insertions, 68 deletions
diff --git a/diffpkg.in b/diffpkg.in
index 977a767..840567a 100644
--- a/diffpkg.in
+++ b/diffpkg.in
@@ -8,12 +8,19 @@ m4_include(lib/common.sh)
usage() {
cat <<- _EOF_
- Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] [MODES]
+ Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] [MODES] [FILE|PKGNAME...]
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
- It then compares them using different modes while using simple tar
- content list by default.
+ It then compares the package archives using different modes while using
+ simple tar content list by default.
+
+ When given one package, use it to diff against the locally built one.
+ When given two packages, diff both packages against each other.
+
+ In either case, a package name will be converted to a filename from the
+ cache, and diffpkg will proceed as though this filename was initially
+ specified.
OPTIONS
-M, --makepkg-config Set an alternate makepkg configuration file
@@ -100,19 +107,10 @@ elif [[ -r "$HOME/.makepkg.conf" ]]; then
source "$HOME/.makepkg.conf"
fi
-if [[ ! -f PKGBUILD ]]; then
- die 'This must be run in the directory of a built package.'
-fi
-
-# shellcheck source=PKGBUILD.proto
-. ./PKGBUILD
-if [[ ${arch[0]} == 'any' ]]; then
- CARCH='any'
-fi
-
STARTDIR=$(pwd)
-trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
-TEMPDIR=$(mktemp -d --tmpdir diffpkg-script.XXXXXXXX)
+trap 'rm -rf $TMPDIR' EXIT INT TERM QUIT
+TMPDIR=$(mktemp -d --tmpdir diffpkg-script.XXXXXXXX)
+export TMPDIR
tar_list() {
bsdtar tf "$*" | if (( VERBOSE )); then
@@ -123,78 +121,108 @@ tar_list() {
}
diff_pkgs() {
- local oldpkg=$1
- local newpkg=$2
+ local oldpkg newpkg
+ oldpkg=$(readlink -m "$1")
+ newpkg=$(readlink -m "$2")
+
+ [[ -f $oldpkg ]] || die "No such file: %s" "${oldpkg}"
+ [[ -f $newpkg ]] || die "No such file: %s" "${newpkg}"
if (( TARLIST )); then
- tar_list "$oldpkg" > "$TEMPDIR/filelist-old"
- tar_list "$newpkg" > "$TEMPDIR/filelist"
+ tar_list "$oldpkg" > "$TMPDIR/filelist-old"
+ tar_list "$newpkg" > "$TMPDIR/filelist"
- sdiff -s "$TEMPDIR/filelist-old" "$TEMPDIR/filelist"
+ sdiff -s "$TMPDIR/filelist-old" "$TMPDIR/filelist"
fi
if (( PKGINFO )); then
- bsdtar xOqf "$oldpkg" .PKGINFO > "$TEMPDIR/pkginfo-old"
- bsdtar xOqf "$newpkg" .PKGINFO > "$TEMPDIR/pkginfo"
+ bsdtar xOqf "$oldpkg" .PKGINFO > "$TMPDIR/pkginfo-old"
+ bsdtar xOqf "$newpkg" .PKGINFO > "$TMPDIR/pkginfo"
- sdiff -s "$TEMPDIR/pkginfo-old" "$TEMPDIR/pkginfo"
+ sdiff -s "$TMPDIR/pkginfo-old" "$TMPDIR/pkginfo"
fi
if (( BUILDINFO )); then
- bsdtar xOqf "$oldpkg" .BUILDINFO > "$TEMPDIR/buildinfo-old"
- bsdtar xOqf "$newpkg" .BUILDINFO > "$TEMPDIR/buildinfo"
+ bsdtar xOqf "$oldpkg" .BUILDINFO > "$TMPDIR/buildinfo-old"
+ bsdtar xOqf "$newpkg" .BUILDINFO > "$TMPDIR/buildinfo"
- sdiff -s "$TEMPDIR/buildinfo-old" "$TEMPDIR/buildinfo"
+ sdiff -s "$TMPDIR/buildinfo-old" "$TMPDIR/buildinfo"
fi
if (( DIFFOSCOPE )); then
- diffoscope "$(readlink -e "$oldpkg")" "$(readlink -e "$newpkg")"
+ diffoscope "$oldpkg" "$newpkg"
fi
}
-for _pkgname in "${pkgname[@]}"; do
- comparepkg=$_pkgname
- pkgurl=
- 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
+fetch_pkg() {
+ local pkg pkgdest pkgurl
+ case $1 in
+ *://*)
+ pkgurl=$1 ;;
+ /*|*/*)
+ pkgurl=$(readlink -m "$1") ;;
+ *.pkg.tar*)
+ pkgurl=$1 ;;
+ '')
+ ;;
+ *)
+ pkg=$1 ;;
+ esac
+
+ [[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$pkg") ||
+ die "Couldn't download previous package for %s." "$pkg"
+
+ pkg=${pkgurl##*/}
+ pkgdest=$(mktemp -t -d "${pkg}-XXXXXX")/${pkg}
- ln -s "$pkgfile" "$TEMPDIR"
-
- if (( $# )); then
- case $1 in
- *://*)
- pkgurl=$1 ;;
- /*|*/*)
- pkgurl=$(readlink -m "$1") ;;
- *.pkg.tar*)
- pkgurl=$1 ;;
- '')
- ;;
- *)
- comparepkg=$1 ;;
- esac
- shift
+ if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then
+ ln -sf "${pkgurl#file://}" "$pkgdest"
+ elif [[ -f "$PKGDEST/$pkg" ]]; then
+ ln -sf "$PKGDEST/$pkg" "$pkgdest"
+ elif [[ -f "$STARTDIR/$pkg" ]]; then
+ ln -sf "$STARTDIR/$pkg" "$pkgdest"
+ elif [[ $pkgurl = *://* ]]; then
+ curl -fsLC - --retry 3 --retry-delay 3 -o "$pkgdest" "$pkgurl" || \
+ die "Couldn't download %s" "$pkgurl"
+ else
+ die "File not found: %s" "$pkgurl"
fi
- [[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$comparepkg") ||
- die "Couldn't download previous package for %s." "$comparepkg"
- oldpkg=${pkgurl##*/}
+ echo "$pkgdest"
+}
- if [[ ${oldpkg} = "${pkgfile##*/}" ]]; then
- die "The built package (%s) is the one in the repo right now!" "$_pkgname"
+if (( $# < 2 )); then
+ if [[ ! -f PKGBUILD ]]; then
+ die "This must be run in the directory of a built package.\nTry '$(basename "$0") --help' for more information."
fi
- if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; 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"
+ # shellcheck source=PKGBUILD.proto
+ . ./PKGBUILD
+ if [[ ${arch[0]} == 'any' ]]; then
+ CARCH='any'
fi
- diff_pkgs "$TEMPDIR/$oldpkg" "$pkgfile"
-done
+ for _pkgname in "${pkgname[@]}"; do
+ comparepkg=$_pkgname
+ pkgurl=
+ 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
+
+ ln -s "$pkgfile" "$TMPDIR"
+
+ if (( $# )); then
+ comparepkg="$1"
+ fi
+
+ oldpkg=$(fetch_pkg "$comparepkg") || exit 1
+
+ diff_pkgs "$oldpkg" "$pkgfile"
+ done
+else
+ file1=$(fetch_pkg "$1") || exit 1
+ file2=$(fetch_pkg "$2") || exit 1
+
+ diff_pkgs "$file1" "$file2"
+fi
diff --git a/doc/diffpkg.1.asciidoc b/doc/diffpkg.1.asciidoc
index e95fa43..3fc0f00 100644
--- a/doc/diffpkg.1.asciidoc
+++ b/doc/diffpkg.1.asciidoc
@@ -7,15 +7,22 @@ diffpkg - Compare package files using different modes.
Synopsis
--------
-diffpkg [OPTIONS] [MODES]
+diffpkg [OPTIONS] [MODES] [FILE|PKGNAME...]
Description
-----------
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
-It then compares them using different modes while using simple tar
-content list by default.
+It then compares the package archives using different modes while using
+simple tar content list by default.
+
+When given one package, use it to diff against the locally built one.
+When given two packages, diff both packages against each other.
+
+In either case, a package name will be converted to a filename from the
+cache, and diffpkg will proceed as though this filename was initially
+specified.
Options
-------
diff --git a/zsh_completion.in b/zsh_completion.in
index c76e66e..eee9776 100644
--- a/zsh_completion.in
+++ b/zsh_completion.in
@@ -49,6 +49,7 @@ _diffpkg_args=(
'(-m --makepkg-config)'{-m,--makepkg-config}'[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'(-v --verbose)'{-v,--verbose}'[Provide more detailed/unfiltered output]'
'(-h --help)'{-h,--help}'[Display usage]'
+ '*:packages:_devtools_completions_all_packages'
)
_finddeps_args=(