diffpkg: support multiple diff modes to compare with

This adds support for the following diff modes:

- content list (default)
- diffoscope
- .PKGINFO diff
- .BUILDINFO diff
This commit is contained in:
Levente Polyak 2022-04-26 22:31:56 +02:00
parent 11edc45048
commit c339536a37
No known key found for this signature in database
GPG Key ID: FC1B547C8D8172C8
3 changed files with 113 additions and 11 deletions

View File

@ -8,19 +8,32 @@ m4_include(lib/common.sh)
usage() { usage() {
cat <<- _EOF_ cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] [MODES]
Searches for a locally built package corresponding to the PKGBUILD, and Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories. downloads the last version of that package from the Pacman repositories.
It then compares them with diffoscope. It then compares them using different modes while using simple tar
content list by default.
OPTIONS OPTIONS
-M, --makepkg-config Set an alternate makepkg configuration file -M, --makepkg-config Set an alternate makepkg configuration file
-v, --verbose Provide more detailed/unfiltered output
-h, --help Show this help text -h, --help Show this help text
MODES
-l, --list Activate content list diff mode (default)
-d, --diffoscope Activate diffoscope diff mode
-p, --pkginfo Activate .PKGINFO diff mode
-b, --buildinfo Activate .BUILDINFO diff mode
_EOF_ _EOF_
} }
MAKEPKG_CONF=/etc/makepkg.conf MAKEPKG_CONF=/etc/makepkg.conf
VERBOSE=0
TARLIST=0
DIFFOSCOPE=0
PKGINFO=0
BUILDINFO=0
# option checking # option checking
while (( $# )); do while (( $# )); do
@ -33,6 +46,26 @@ while (( $# )); do
MAKEPKG_CONF="$2" MAKEPKG_CONF="$2"
shift 2 shift 2
;; ;;
-l|--list)
TARLIST=1
shift
;;
-d|--diffoscope)
DIFFOSCOPE=1
shift
;;
-p|--pkginfo)
PKGINFO=1
shift
;;
-b|--buildinfo)
BUILDINFO=1
shift
;;
-v|--verbose)
VERBOSE=1
shift
;;
--) --)
shift shift
break break
@ -46,6 +79,10 @@ while (( $# )); do
esac esac
done done
if ! (( DIFFOSCOPE || TARLIST || PKGINFO || BUILDINFO )); then
TARLIST=1
fi
# Source makepkg.conf; fail if it is not found # Source makepkg.conf; fail if it is not found
if [[ -r "${MAKEPKG_CONF}" ]]; then if [[ -r "${MAKEPKG_CONF}" ]]; then
# shellcheck source=makepkg-x86_64.conf # shellcheck source=makepkg-x86_64.conf
@ -75,7 +112,45 @@ fi
STARTDIR=$(pwd) STARTDIR=$(pwd)
trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
TEMPDIR=$(mktemp -d --tmpdir diffpkg-script.XXXX) TEMPDIR=$(mktemp -d --tmpdir diffpkg-script.XXXXXXXX)
tar_list() {
bsdtar tf "$*" | if (( VERBOSE )); then
cat
else
sed -E 's|^usr/lib/modules/[0-9][^/]+|usr/lib/modules/[…]|g'
fi | sort
}
diff_pkgs() {
local oldpkg=$1
local newpkg=$2
if (( TARLIST )); then
tar_list "$oldpkg" > "$TEMPDIR/filelist-old"
tar_list "$newpkg" > "$TEMPDIR/filelist"
sdiff -s "$TEMPDIR/filelist-old" "$TEMPDIR/filelist"
fi
if (( PKGINFO )); then
bsdtar xOqf "$oldpkg" .PKGINFO > "$TEMPDIR/pkginfo-old"
bsdtar xOqf "$newpkg" .PKGINFO > "$TEMPDIR/pkginfo"
sdiff -s "$TEMPDIR/pkginfo-old" "$TEMPDIR/pkginfo"
fi
if (( BUILDINFO )); then
bsdtar xOqf "$oldpkg" .BUILDINFO > "$TEMPDIR/buildinfo-old"
bsdtar xOqf "$newpkg" .BUILDINFO > "$TEMPDIR/buildinfo"
sdiff -s "$TEMPDIR/buildinfo-old" "$TEMPDIR/buildinfo"
fi
if (( DIFFOSCOPE )); then
diffoscope "$(readlink -e "$oldpkg")" "$(readlink -e "$newpkg")"
fi
}
for _pkgname in "${pkgname[@]}"; do for _pkgname in "${pkgname[@]}"; do
comparepkg=$_pkgname comparepkg=$_pkgname
@ -121,5 +196,5 @@ for _pkgname in "${pkgname[@]}"; do
curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl" curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
fi fi
diffoscope $TEMPDIR/$oldpkg $pkgfile diff_pkgs "$TEMPDIR/$oldpkg" "$pkgfile"
done done

View File

@ -3,31 +3,48 @@ diffpkg(1)
Name Name
---- ----
diffpkg - Diffoscope the current build package with the repository version diffpkg - Compare package files using different modes.
Synopsis Synopsis
-------- --------
diffpkg diffpkg [OPTIONS] [MODES]
Description Description
----------- -----------
Searches for a locally built package corresponding to the PKGBUILD, and Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories. downloads the last version of that package from the Pacman repositories.
It then compares them with diffoscope. It then compares them using different modes while using simple tar
content list by default.
Options Options
------- -------
*-M, --makepkg-config*:: *-M, --makepkg-config*::
Set an alternate makepkg configuration file. Set an alternate makepkg configuration file
*-v, --verbose*::
Provide more detailed/unfiltered output
*-h, --help*:: *-h, --help*::
Show a help text Show a help text
Modes
-----
*-l, --list*::
Activate tar content list diff mode (default)
*-d, --diffoscope*::
Activate diffoscope diff mode
*-p, --pkginfo*::
Activate .PKGINFO diff mode
*-b, --buildinfo*::
Activate .BUILDINFO diff mode
See Also See Also
-------- --------
linkman:find-libprovides[1]
include::footer.asciidoc[] include::footer.asciidoc[]

View File

@ -1,4 +1,4 @@
#compdef archbuild archco arch-nspawn archrelease commitpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild communityco=archco checkpkg sogrep offload-build makerepropkg #compdef archbuild archco arch-nspawn archrelease commitpkg diffpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild communityco=archco checkpkg sogrep offload-build makerepropkg
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
@ -41,6 +41,16 @@ _commitpkg_args=(
'1:commit_msg' '1:commit_msg'
) )
_diffpkg_args=(
'(-l --list)'{-l,--list}'[Tar content list diff mode]'
'(-d --diffoscope)'{-d,--diffoscope}'[Diffoscope diff mode]'
'(-p --pkginfo)'{-p,--pkginfo}'[.PKGINFO diff mode]'
'(-b --buildinfo)'{-b,--buildinfo}'[.BUILDINFO diff mode]'
'(-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]'
)
_finddeps_args=( _finddeps_args=(
'1:packages:_devtools_completions_all_packages' '1:packages:_devtools_completions_all_packages'
) )