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

Daniel M. Capella polyzen at archlinux.org
Sun Mar 28 02:12:18 UTC 2021


On March 4, 2021 6:55:44 AM EST, Denton Liu via pacman-contrib <pacman-contrib at lists.archlinux.org> wrote:
> 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

Works great, thank you, pushed.

--
Best,
Daniel <https://danielcapella.com>


More information about the pacman-contrib mailing list