diff options
author | Daniel M. Capella <polyzen@archlinux.org> | 2022-06-30 22:47:49 +0000 |
---|---|---|
committer | Daniel M. Capella <polyzen@archlinux.org> | 2022-06-30 22:47:49 +0000 |
commit | 306592b21e665b2f4b516eddbef3085a3dde5d25 (patch) | |
tree | fc38a22969cb0f4e1b3dfd4a51c2a247f681e095 | |
parent | 7f6c19fac242512fabee58258b8ba733917bf0f7 (diff) | |
parent | 69b4a53947c7be0554e809c2c857550702601922 (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.md | 1 | ||||
-rw-r--r-- | completions/zsh/_pacdiff | 1 | ||||
-rw-r--r-- | doc/pacdiff.8.adoc | 4 | ||||
-rw-r--r-- | src/pacdiff.sh.in | 70 |
4 files changed, 67 insertions, 9 deletions
@@ -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) |