summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile2
-rw-r--r--diffpkg.in125
-rw-r--r--doc/diffpkg.1.asciidoc33
4 files changed, 161 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index b26fc93..66e2213 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ archrelease
bash_completion
checkpkg
commitpkg
+diffpkg
finddeps
lddd
makechrootpkg
diff --git a/Makefile b/Makefile
index b6cb6de..69eabe9 100644
--- a/Makefile
+++ b/Makefile
@@ -12,6 +12,7 @@ IN_PROGS = \
checkpkg \
commitpkg \
crossrepomove\
+ diffpkg \
finddeps \
find-libdeps \
lddd \
@@ -76,6 +77,7 @@ MANS = \
doc/makechrootpkg.1 \
doc/lddd.1 \
doc/checkpkg.1 \
+ doc/diffpkg.1 \
doc/offload-build.1 \
doc/sogrep.1 \
doc/makerepropkg.1 \
diff --git a/diffpkg.in b/diffpkg.in
new file mode 100644
index 0000000..23c1f81
--- /dev/null
+++ b/diffpkg.in
@@ -0,0 +1,125 @@
+#!/bin/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+shopt -s extglob
+
+m4_include(lib/common.sh)
+
+usage() {
+ cat <<- _EOF_
+ Usage: ${BASH_SOURCE[0]##*/} [OPTIONS]
+
+ 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 with diffoscope.
+
+ OPTIONS
+ -M, --makepkg-config Set an alternate makepkg configuration file
+ -h, --help Show this help text
+_EOF_
+}
+
+MAKEPKG_CONF=/etc/makepkg.conf
+
+# option checking
+while (( $# )); do
+ case $1 in
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ -M|--makepkg-config)
+ MAKEPKG_CONF="$2"
+ shift 2
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*,--*)
+ die "invalid argument: %s" "$1"
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+# Source makepkg.conf; fail if it is not found
+if [[ -r "${MAKEPKG_CONF}" ]]; then
+ # shellcheck source=makepkg-x86_64.conf
+ source "${MAKEPKG_CONF}"
+else
+ die "${MAKEPKG_CONF} not found!"
+fi
+
+# Source user-specific makepkg.conf overrides
+if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
+ # shellcheck source=/dev/null
+ source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
+elif [[ -r "$HOME/.makepkg.conf" ]]; then
+ # shellcheck source=/dev/null
+ 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.XXXX)
+
+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" "$TEMPDIR"
+
+ if (( $# )); then
+ case $1 in
+ *://*)
+ pkgurl=$1 ;;
+ /*|*/*)
+ pkgurl=$(readlink -m "$1") ;;
+ *.pkg.tar*)
+ pkgurl=$1 ;;
+ '')
+ ;;
+ *)
+ comparepkg=$1 ;;
+ esac
+ shift
+ fi
+ [[ -n $pkgurl ]] || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$comparepkg") ||
+ die "Couldn't download previous package for %s." "$comparepkg"
+
+ oldpkg=${pkgurl##*/}
+
+ if [[ ${oldpkg} = "${pkgfile##*/}" ]]; then
+ die "The built package (%s) is the one in the repo right now!" "$_pkgname"
+ 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"
+ fi
+
+ diffoscope $TEMPDIR/$oldpkg $pkgfile
+done
diff --git a/doc/diffpkg.1.asciidoc b/doc/diffpkg.1.asciidoc
new file mode 100644
index 0000000..fe11872
--- /dev/null
+++ b/doc/diffpkg.1.asciidoc
@@ -0,0 +1,33 @@
+diffpkg(1)
+===========
+
+Name
+----
+diffpkg - Diffoscope the current build package with the repository version
+
+Synopsis
+--------
+diffpkg
+
+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 with diffoscope.
+
+Options
+-------
+
+*-M, --makepkg-config*::
+ Set an alternate makepkg configuration file.
+
+*-h, --help*::
+ Show a help text
+
+See Also
+--------
+
+linkman:find-libprovides[1]
+
+include::footer.asciidoc[]