summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel M. Capella <polyzen@archlinux.org>2022-06-30 22:47:49 +0000
committerDaniel M. Capella <polyzen@archlinux.org>2022-06-30 22:47:49 +0000
commit306592b21e665b2f4b516eddbef3085a3dde5d25 (patch)
treefc38a22969cb0f4e1b3dfd4a51c2a247f681e095
parent7f6c19fac242512fabee58258b8ba733917bf0f7 (diff)
parent69b4a53947c7be0554e809c2c857550702601922 (diff)
Merge branch 'three-way-diff' into 'master'
pacdiff: add option to view diffs in 3-way fashion See merge request pacman/pacman-contrib!18
-rw-r--r--CHANGES.md1
-rw-r--r--completions/zsh/_pacdiff1
-rw-r--r--doc/pacdiff.8.adoc4
-rw-r--r--src/pacdiff.sh.in70
4 files changed, 67 insertions, 9 deletions
diff --git a/CHANGES.md b/CHANGES.md
index 3b0a41c..155df4a 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
### Added
- zsh completions (!14)
- pacdiff: Add backup option to save old files (.bak) when (O)verwriting (!17)
+- pacdiff: Add -3/--threeway option to view diffs in 3-way fashion
## [1.5.3]
diff --git a/completions/zsh/_pacdiff b/completions/zsh/_pacdiff
index 1b5546e..2350731 100644
--- a/completions/zsh/_pacdiff
+++ b/completions/zsh/_pacdiff
@@ -14,6 +14,7 @@ args=(
'(-o --output)'{-o,--output}'[print files instead of merging them]'
'(-s --sudo)'{-s,--sudo}'[use sudo and sudoedit to merge/remove files]'
'(-b --backup)'{-b,--backup}'[when overwriting, save old files with .bak]'
+ '(-3 --threeway)'{-3,--threeway}'[view diffs in 3-way fashion]'
'(-)'{--help,-h}'[display help message]'
'(-)--version[display version]'
)
diff --git a/doc/pacdiff.8.adoc b/doc/pacdiff.8.adoc
index cb291ac..189b0b0 100644
--- a/doc/pacdiff.8.adoc
+++ b/doc/pacdiff.8.adoc
@@ -56,6 +56,10 @@ Options
*-b, \--backup*::
When overwriting, save old files with .bak.
+*-3, \--threeway*::
+ View diffs in 3-way fashion if the base package is available in the cache.
+ Fall back to regular 2-way diff otherwise.
+
See Also
--------
linkman:pacman[8], linkman:pacman.conf[5]
diff --git a/src/pacdiff.sh.in b/src/pacdiff.sh.in
index 526ccf3..685b5a2 100644
--- a/src/pacdiff.sh.in
+++ b/src/pacdiff.sh.in
@@ -32,7 +32,7 @@ cachedir=
USE_COLOR='y'
SUDO=''
declare -a oldsaves
-declare -i USE_FIND=0 USE_LOCATE=0 USE_PACDB=0 OUTPUTONLY=0 BACKUP=0
+declare -i USE_FIND=0 USE_LOCATE=0 USE_PACDB=0 OUTPUTONLY=0 BACKUP=0 THREE_WAY_DIFF=0
# Import libmakepkg
source "$LIBRARY"/util/message.sh
@@ -62,6 +62,7 @@ General Options:
(default: read from @sysconfdir@/pacman.conf)
-s/--sudo use sudo and sudoedit to merge/remove files
-b/--backup when overwriting, save old files with .bak
+ -3/--threeway view diffs in 3-way fashion
Environment Variables:
DIFFPROG override the merge program: (default: 'vim -d')
@@ -106,6 +107,62 @@ base_cache_tar() {
popd &>/dev/null
}
+diffprog_fn() {
+ if [[ -n "$SUDO" ]]; then
+ SUDO_EDITOR="$diffprog" sudoedit "$@"
+ else
+ $diffprog "$@"
+ fi
+}
+
+view_diff() {
+ pacfile="$1"
+ file="$2"
+
+ package="$(pacman -Qoq "$file")" || return 1
+ base_tar="$(base_cache_tar "$package")"
+
+ two_way_diff() {
+ diffprog_fn "$pacfile" "$file"
+ }
+
+ three_way_diff() {
+ diffprog_fn "$pacfile" "$base" "$file"
+ }
+
+ unset tempdir
+
+ if (( ! THREE_WAY_DIFF )); then
+ two_way_diff
+ elif [[ -z $base_tar ]]; then
+ msg2 "Unable to find a base package. falling back to 2-way diff."
+ two_way_diff
+ else
+ basename="$(basename "$file")"
+ tempdir="$(mktemp -d --tmpdir "pacdiff-diff-$basename.XXX")"
+ base="$(mktemp "$tempdir"/"$basename.base.XXX")"
+ merged="$(mktemp "$tempdir"/"$basename.merged.XXX")"
+
+ if ! bsdtar -xqOf "$base_tar" "${file#/}" >"$base"; then
+ msg2 "Unable to extract the previous version of this file. falling back to 2-way diff."
+ two_way_diff
+ else
+ three_way_diff
+ fi
+ fi
+
+ ret=1
+
+ if cmp -s "$pacfile" "$file"; then
+ msg2 "Files are identical, removing..."
+ $SUDO rm -v "$pacfile"
+ ret=0
+ fi
+
+ $SUDO rm -rf "$tempdir"
+ return $ret
+}
+
merge_file() {
pacfile="$1"
file="$2"
@@ -190,6 +247,8 @@ while [[ -n "$1" ]]; do
SUDO=sudo;;
-b|--backup)
BACKUP=1;;
+ -3|--threeway)
+ THREE_WAY_DIFF=1 ;;
-V|--version)
version; exit 0;;
-h|--help)
@@ -277,14 +336,7 @@ while IFS= read -u 3 -r -d '' pacfile; do
$SUDO mv -v "$pacfile" "$file"
break ;;
v|V)
- if [[ -n "$SUDO" ]]; then
- SUDO_EDITOR="$diffprog" sudoedit "$pacfile" "$file"
- else
- $diffprog "$pacfile" "$file"
- fi
- if cmp -s "$pacfile" "$file"; then
- msg2 "Files are identical, removing..."
- $SUDO rm -v "$pacfile"
+ if view_diff "$pacfile" "$file"; then
break
fi ;;
m|M)