[PATCH v2 0/3] pacdiff: learn (M)erge mode

Denton Liu liu.denton at gmail.com
Thu Mar 4 11:55:44 UTC 2021


This series teaches pacdiff to perform 3-way merges on config files. The
first two commits are small refactors to make final change more
readable. The final commit is what actually implements the meat of the
change.

Changes since v1:

* Add an example of $MERGEPROG usage

* Always ask user if they'd like to use merge results (I've been bitten
  by the lack of this feature!)

* Drop refactoring patch (it's been merged)

Denton Liu (3):
  pacdiff: Implement die()
  pacdiff: Reduce repetition in input loop
  pacdiff: Learn the (M)erge mode

 doc/pacdiff.8.txt |   9 ++++-
 src/pacdiff.sh.in | 100 +++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 96 insertions(+), 13 deletions(-)

Range-diff against v1:
1:  7c6223d < -:  ------- pacdiff: Reindent awk script
2:  e377ae2 = 1:  4ddc2db pacdiff: Implement die()
3:  bdbe0b2 = 2:  0a53816 pacdiff: Reduce repetition in input loop
4:  cb73198 ! 3:  ae12e25 pacdiff: Learn the (M)erge mode
    @@ Commit message
         given $MERGEPROG (`diff3 -m` by default). The base file is taken from
         from the second-newest package in the cache.
     
    -
    - ## Notes ##
    -    There are a few things I'd like some comments on:
    -
    -    	* Is there a better way of getting the base file? I assume that
    -    	  most people will run pacdiff right after an update but what if
    -    	  they run pacdiff after two or more updates?
    -
    -    	* How is the UI flow for the merge command? Do we want to let
    -    	  automerges write out without warning or do we want to do
    -    	  something else?
    -
    -    	* When displaying conflicts, I currently display a diff against
    -    	  the base and the merged version. Do we want to display a diff
    -    	  against the merged and the current version?
    -
      ## doc/pacdiff.8.txt ##
     @@ doc/pacdiff.8.txt: Description
      -----------
    @@ src/pacdiff.sh.in: Search Options:     select one (default: --pacmandb)
                          (default: /etc)
     +  MERGEPROG         override the 3-way merge program: (default: 'diff3 -m')
      
    - Example: DIFFPROG=meld DIFFSEARCHPATH="/boot /etc /usr" $myname
    +-Example: DIFFPROG=meld DIFFSEARCHPATH="/boot /etc /usr" $myname
    ++Example: DIFFPROG=meld DIFFSEARCHPATH="/boot /etc /usr" MERGEPROG="git merge-file -p" $myname
      Example: $myname --output --locate
    + 
    + EOF
     @@ src/pacdiff.sh.in: print_existing_pacsave(){
      	done
      }
    @@ src/pacdiff.sh.in: print_existing_pacsave(){
     +	tar -xOf "$base_tar" "${file#/}" >"$base"
     +	if $mergeprog "$file" "$base" "$pacfile" >"$merged"; then
     +		msg2 "Merged without conflicts."
    -+	else
    -+		$diffprog "$file" "$merged"
    -+
    -+		while :; do
    -+			ask "Would you like to use the results of the merge? [y/n] "
    -+
    -+			read c || return 1
    -+			case $c in
    -+				y|Y) break ;;
    -+				n|N) return 1 ;;
    -+				*) msg2 "Invalid answer." ;;
    -+			esac
    -+		done
     +	fi
     +
    ++	$diffprog "$file" "$merged"
    ++
    ++	while :; do
    ++		ask "Would you like to use the results of the merge? [y/n] "
    ++
    ++		read c || return 1
    ++		case $c in
    ++			y|Y) break ;;
    ++			n|N) return 1 ;;
    ++			*) msg2 "Invalid answer." ;;
    ++		esac
    ++	done
    ++
     +	if ! cp -v "$merged" "$file"; then
     +		warning "Unable to write merged file to %s. Merged file is preserved at %s" "$file" "$merged"
     +		return 1
-- 
2.31.0.rc1.228.gb75b4e4ce2


More information about the pacman-contrib mailing list