mergetool--lib: Refactor tools into separate files
Individual merge tools are now defined in a mergetools/$tool file which is sourced at runtime. The individual files are installed into $(git --exec-path)/mergetools/. New tools can be added by creating a new file instead of editing the git-mergetool--lib.sh scriptlet. http://thread.gmane.org/gmane.comp.version-control.git/134906/focus=135006 Signed-off-by: David Aguilar <davvid@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									240dc3e8ed
								
							
						
					
					
						commit
						bc7a96a896
					
				
							
								
								
									
										11
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										11
									
								
								Makefile
								
								
								
								
							|  | @ -302,6 +302,7 @@ bindir = $(prefix)/$(bindir_relative) | ||||||
| mandir = share/man | mandir = share/man | ||||||
| infodir = share/info | infodir = share/info | ||||||
| gitexecdir = libexec/git-core | gitexecdir = libexec/git-core | ||||||
|  | mergetoolsdir = $(gitexecdir)/mergetools | ||||||
| sharedir = $(prefix)/share | sharedir = $(prefix)/share | ||||||
| gitwebdir = $(sharedir)/gitweb | gitwebdir = $(sharedir)/gitweb | ||||||
| template_dir = share/git-core/templates | template_dir = share/git-core/templates | ||||||
|  | @ -2257,6 +2258,13 @@ endif | ||||||
| gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir)) | gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir)) | ||||||
| export gitexec_instdir | export gitexec_instdir | ||||||
|  |  | ||||||
|  | ifneq ($(filter /%,$(firstword $(mergetoolsdir))),) | ||||||
|  | mergetools_instdir = $(mergetoolsdir) | ||||||
|  | else | ||||||
|  | mergetools_instdir = $(prefix)/$(mergetoolsdir) | ||||||
|  | endif | ||||||
|  | mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir)) | ||||||
|  |  | ||||||
| install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X) | install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X) | ||||||
|  |  | ||||||
| install: all | install: all | ||||||
|  | @ -2266,6 +2274,9 @@ install: all | ||||||
| 	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' | 	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' | ||||||
| 	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)' | 	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)' | ||||||
| 	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install | 	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install | ||||||
|  | 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)' | ||||||
|  | 	(cd mergetools && $(TAR) cf - .) | \ | ||||||
|  | 	(cd '$(DESTDIR_SQ)$(mergetools_instdir_SQ)' && umask 022 && $(TAR) xof -) | ||||||
| ifndef NO_PERL | ifndef NO_PERL | ||||||
| 	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install | 	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install | ||||||
| 	$(MAKE) -C gitweb install | 	$(MAKE) -C gitweb install | ||||||
|  |  | ||||||
|  | @ -9,26 +9,7 @@ merge_mode() { | ||||||
| } | } | ||||||
|  |  | ||||||
| translate_merge_tool_path () { | translate_merge_tool_path () { | ||||||
| 	case "$1" in | 	echo "$1" | ||||||
| 	araxis) |  | ||||||
| 		echo compare |  | ||||||
| 		;; |  | ||||||
| 	bc3) |  | ||||||
| 		echo bcompare |  | ||||||
| 		;; |  | ||||||
| 	emerge) |  | ||||||
| 		echo emacs |  | ||||||
| 		;; |  | ||||||
| 	gvimdiff|gvimdiff2) |  | ||||||
| 		echo gvim |  | ||||||
| 		;; |  | ||||||
| 	vimdiff|vimdiff2) |  | ||||||
| 		echo vim |  | ||||||
| 		;; |  | ||||||
| 	*) |  | ||||||
| 		echo "$1" |  | ||||||
| 		;; |  | ||||||
| 	esac |  | ||||||
| } | } | ||||||
|  |  | ||||||
| check_unchanged () { | check_unchanged () { | ||||||
|  | @ -49,40 +30,55 @@ check_unchanged () { | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | valid_tool_config () { | ||||||
|  | 	if test -n "$(get_merge_tool_cmd "$1")" | ||||||
|  | 	then | ||||||
|  | 		return 0 | ||||||
|  | 	else | ||||||
|  | 		return 1 | ||||||
|  | 	fi | ||||||
|  | } | ||||||
|  |  | ||||||
| valid_tool () { | valid_tool () { | ||||||
|  | 	setup_tool "$1" || valid_tool_config "$1" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | setup_tool () { | ||||||
| 	case "$1" in | 	case "$1" in | ||||||
| 	araxis | bc3 | diffuse | ecmerge | emerge | gvimdiff | gvimdiff2 | \ | 	vim*|gvim*) | ||||||
| 	kdiff3 | meld | opendiff | p4merge | tkdiff | vimdiff | vimdiff2 | xxdiff) | 		tool=vim | ||||||
| 		;; # happy |  | ||||||
| 	kompare) |  | ||||||
| 		if ! diff_mode |  | ||||||
| 		then |  | ||||||
| 			return 1 |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	tortoisemerge) |  | ||||||
| 		if ! merge_mode |  | ||||||
| 		then |  | ||||||
| 			return 1 |  | ||||||
| 		fi |  | ||||||
| 		;; | 		;; | ||||||
| 	*) | 	*) | ||||||
| 		if test -z "$(get_merge_tool_cmd "$1")" | 		tool="$1" | ||||||
| 		then |  | ||||||
| 			return 1 |  | ||||||
| 		fi |  | ||||||
| 		;; | 		;; | ||||||
| 	esac | 	esac | ||||||
|  | 	mergetools="$(git --exec-path)/mergetools" | ||||||
|  |  | ||||||
|  | 	# Load the default definitions | ||||||
|  | 	. "$mergetools/defaults" | ||||||
|  | 	if ! test -f "$mergetools/$tool" | ||||||
|  | 	then | ||||||
|  | 		return 1 | ||||||
|  | 	fi | ||||||
|  |  | ||||||
|  | 	# Load the redefined functions | ||||||
|  | 	. "$mergetools/$tool" | ||||||
|  |  | ||||||
|  | 	if merge_mode && ! can_merge | ||||||
|  | 	then | ||||||
|  | 		echo "error: '$tool' can not be used to resolve merges" >&2 | ||||||
|  | 		exit 1 | ||||||
|  | 	elif diff_mode && ! can_diff | ||||||
|  | 	then | ||||||
|  | 		echo "error: '$tool' can only be used to resolve merges" >&2 | ||||||
|  | 		exit 1 | ||||||
|  | 	fi | ||||||
|  | 	return 0 | ||||||
| } | } | ||||||
|  |  | ||||||
| get_merge_tool_cmd () { | get_merge_tool_cmd () { | ||||||
| 	# Prints the custom command for a merge tool | 	# Prints the custom command for a merge tool | ||||||
| 	if test -n "$1" | 	merge_tool="$1" | ||||||
| 	then |  | ||||||
| 		merge_tool="$1" |  | ||||||
| 	else |  | ||||||
| 		merge_tool="$(get_merge_tool)" |  | ||||||
| 	fi |  | ||||||
| 	if diff_mode | 	if diff_mode | ||||||
| 	then | 	then | ||||||
| 		echo "$(git config difftool.$merge_tool.cmd || | 		echo "$(git config difftool.$merge_tool.cmd || | ||||||
|  | @ -92,6 +88,7 @@ get_merge_tool_cmd () { | ||||||
| 	fi | 	fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | # Entry point for running tools | ||||||
| run_merge_tool () { | run_merge_tool () { | ||||||
| 	# If GIT_PREFIX is empty then we cannot use it in tools | 	# If GIT_PREFIX is empty then we cannot use it in tools | ||||||
| 	# that expect to be able to chdir() to its value. | 	# that expect to be able to chdir() to its value. | ||||||
|  | @ -102,288 +99,15 @@ run_merge_tool () { | ||||||
| 	base_present="$2" | 	base_present="$2" | ||||||
| 	status=0 | 	status=0 | ||||||
|  |  | ||||||
| 	case "$1" in | 	# Bring tool-specific functions into scope | ||||||
| 	araxis) | 	setup_tool "$1" | ||||||
| 		if merge_mode |  | ||||||
| 		then | 	if merge_mode | ||||||
| 			touch "$BACKUP" | 	then | ||||||
| 			if $base_present | 		merge_cmd "$1" | ||||||
| 			then | 	else | ||||||
| 				"$merge_tool_path" -wait -merge -3 -a1 \ | 		diff_cmd "$1" | ||||||
| 					"$BASE" "$LOCAL" "$REMOTE" "$MERGED" \ | 	fi | ||||||
| 					>/dev/null 2>&1 |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" -wait -2 \ |  | ||||||
| 					"$LOCAL" "$REMOTE" "$MERGED" \ |  | ||||||
| 					>/dev/null 2>&1 |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" -wait -2 "$LOCAL" "$REMOTE" \ |  | ||||||
| 				>/dev/null 2>&1 |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	bc3) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \ |  | ||||||
| 					-mergeoutput="$MERGED" |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" "$LOCAL" "$REMOTE" \ |  | ||||||
| 					-mergeoutput="$MERGED" |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	diffuse) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" \ |  | ||||||
| 					"$LOCAL" "$MERGED" "$REMOTE" \ |  | ||||||
| 					"$BASE" | cat |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" \ |  | ||||||
| 					"$LOCAL" "$MERGED" "$REMOTE" | cat |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$REMOTE" | cat |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	ecmerge) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \ |  | ||||||
| 					--default --mode=merge3 --to="$MERGED" |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" "$LOCAL" "$REMOTE" \ |  | ||||||
| 					--default --mode=merge2 --to="$MERGED" |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" --default --mode=diff2 \ |  | ||||||
| 				"$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	emerge) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" \ |  | ||||||
| 					-f emerge-files-with-ancestor-command \ |  | ||||||
| 					"$LOCAL" "$REMOTE" "$BASE" \ |  | ||||||
| 					"$(basename "$MERGED")" |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" \ |  | ||||||
| 					-f emerge-files-command \ |  | ||||||
| 					"$LOCAL" "$REMOTE" \ |  | ||||||
| 					"$(basename "$MERGED")" |  | ||||||
| 			fi |  | ||||||
| 			status=$? |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" -f emerge-files-command \ |  | ||||||
| 				"$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	gvimdiff|vimdiff) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" -f -d -c "wincmd J" \ |  | ||||||
| 					"$MERGED" "$LOCAL" "$BASE" "$REMOTE" |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" -f -d -c "wincmd l" \ |  | ||||||
| 					"$LOCAL" "$MERGED" "$REMOTE" |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" -R -f -d -c "wincmd l" \ |  | ||||||
| 				-c 'cd $GIT_PREFIX' \ |  | ||||||
| 				"$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	gvimdiff2|vimdiff2) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			"$merge_tool_path" -f -d -c "wincmd l" \ |  | ||||||
| 				"$LOCAL" "$MERGED" "$REMOTE" |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" -R -f -d -c "wincmd l" \ |  | ||||||
| 				-c 'cd $GIT_PREFIX' \ |  | ||||||
| 				"$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	kdiff3) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" --auto \ |  | ||||||
| 					--L1 "$MERGED (Base)" \ |  | ||||||
| 					--L2 "$MERGED (Local)" \ |  | ||||||
| 					--L3 "$MERGED (Remote)" \ |  | ||||||
| 					-o "$MERGED" \ |  | ||||||
| 					"$BASE" "$LOCAL" "$REMOTE" \ |  | ||||||
| 				>/dev/null 2>&1 |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" --auto \ |  | ||||||
| 					--L1 "$MERGED (Local)" \ |  | ||||||
| 					--L2 "$MERGED (Remote)" \ |  | ||||||
| 					-o "$MERGED" \ |  | ||||||
| 					"$LOCAL" "$REMOTE" \ |  | ||||||
| 				>/dev/null 2>&1 |  | ||||||
| 			fi |  | ||||||
| 			status=$? |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" --auto \ |  | ||||||
| 				--L1 "$MERGED (A)" \ |  | ||||||
| 				--L2 "$MERGED (B)" "$LOCAL" "$REMOTE" \ |  | ||||||
| 			>/dev/null 2>&1 |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	kompare) |  | ||||||
| 		"$merge_tool_path" "$LOCAL" "$REMOTE" |  | ||||||
| 		;; |  | ||||||
| 	meld) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	opendiff) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" "$LOCAL" "$REMOTE" \ |  | ||||||
| 					-ancestor "$BASE" \ |  | ||||||
| 					-merge "$MERGED" | cat |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" "$LOCAL" "$REMOTE" \ |  | ||||||
| 					-merge "$MERGED" | cat |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$REMOTE" | cat |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	p4merge) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			$base_present || >"$BASE" |  | ||||||
| 			"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED" |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	tkdiff) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" -a "$BASE" \ |  | ||||||
| 					-o "$MERGED" "$LOCAL" "$REMOTE" |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" \ |  | ||||||
| 					-o "$MERGED" "$LOCAL" "$REMOTE" |  | ||||||
| 			fi |  | ||||||
| 			status=$? |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" "$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	tortoisemerge) |  | ||||||
| 		if $base_present |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			"$merge_tool_path" \ |  | ||||||
| 				-base:"$BASE" -mine:"$LOCAL" \ |  | ||||||
| 				-theirs:"$REMOTE" -merged:"$MERGED" |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			echo "TortoiseMerge cannot be used without a base" 1>&2 |  | ||||||
| 			status=1 |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	xxdiff) |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			touch "$BACKUP" |  | ||||||
| 			if $base_present |  | ||||||
| 			then |  | ||||||
| 				"$merge_tool_path" -X --show-merged-pane \ |  | ||||||
| 					-R 'Accel.SaveAsMerged: "Ctrl-S"' \ |  | ||||||
| 					-R 'Accel.Search: "Ctrl+F"' \ |  | ||||||
| 					-R 'Accel.SearchForward: "Ctrl-G"' \ |  | ||||||
| 					--merged-file "$MERGED" \ |  | ||||||
| 					"$LOCAL" "$BASE" "$REMOTE" |  | ||||||
| 			else |  | ||||||
| 				"$merge_tool_path" -X $extra \ |  | ||||||
| 					-R 'Accel.SaveAsMerged: "Ctrl-S"' \ |  | ||||||
| 					-R 'Accel.Search: "Ctrl+F"' \ |  | ||||||
| 					-R 'Accel.SearchForward: "Ctrl-G"' \ |  | ||||||
| 					--merged-file "$MERGED" \ |  | ||||||
| 					"$LOCAL" "$REMOTE" |  | ||||||
| 			fi |  | ||||||
| 			check_unchanged |  | ||||||
| 		else |  | ||||||
| 			"$merge_tool_path" \ |  | ||||||
| 				-R 'Accel.Search: "Ctrl+F"' \ |  | ||||||
| 				-R 'Accel.SearchForward: "Ctrl-G"' \ |  | ||||||
| 				"$LOCAL" "$REMOTE" |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	*) |  | ||||||
| 		merge_tool_cmd="$(get_merge_tool_cmd "$1")" |  | ||||||
| 		if test -z "$merge_tool_cmd" |  | ||||||
| 		then |  | ||||||
| 			if merge_mode |  | ||||||
| 			then |  | ||||||
| 				status=1 |  | ||||||
| 			fi |  | ||||||
| 			break |  | ||||||
| 		fi |  | ||||||
| 		if merge_mode |  | ||||||
| 		then |  | ||||||
| 			trust_exit_code="$(git config --bool \ |  | ||||||
| 				mergetool."$1".trustExitCode || echo false)" |  | ||||||
| 			if test "$trust_exit_code" = "false" |  | ||||||
| 			then |  | ||||||
| 				touch "$BACKUP" |  | ||||||
| 				( eval $merge_tool_cmd ) |  | ||||||
| 				check_unchanged |  | ||||||
| 			else |  | ||||||
| 				( eval $merge_tool_cmd ) |  | ||||||
| 				status=$? |  | ||||||
| 			fi |  | ||||||
| 		else |  | ||||||
| 			( eval $merge_tool_cmd ) |  | ||||||
| 		fi |  | ||||||
| 		;; |  | ||||||
| 	esac |  | ||||||
| 	return $status | 	return $status | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -449,12 +173,7 @@ get_configured_merge_tool () { | ||||||
|  |  | ||||||
| get_merge_tool_path () { | get_merge_tool_path () { | ||||||
| 	# A merge tool has been set, so verify that it's valid. | 	# A merge tool has been set, so verify that it's valid. | ||||||
| 	if test -n "$1" | 	merge_tool="$1" | ||||||
| 	then |  | ||||||
| 		merge_tool="$1" |  | ||||||
| 	else |  | ||||||
| 		merge_tool="$(get_merge_tool)" |  | ||||||
| 	fi |  | ||||||
| 	if ! valid_tool "$merge_tool" | 	if ! valid_tool "$merge_tool" | ||||||
| 	then | 	then | ||||||
| 		echo >&2 "Unknown merge tool $merge_tool" | 		echo >&2 "Unknown merge tool $merge_tool" | ||||||
|  | @ -483,7 +202,7 @@ get_merge_tool_path () { | ||||||
|  |  | ||||||
| get_merge_tool () { | get_merge_tool () { | ||||||
| 	# Check if a merge tool has been configured | 	# Check if a merge tool has been configured | ||||||
| 	merge_tool=$(get_configured_merge_tool) | 	merge_tool="$(get_configured_merge_tool)" | ||||||
| 	# Try to guess an appropriate merge tool if no tool has been set. | 	# Try to guess an appropriate merge tool if no tool has been set. | ||||||
| 	if test -z "$merge_tool" | 	if test -z "$merge_tool" | ||||||
| 	then | 	then | ||||||
|  |  | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" -wait -2 "$LOCAL" "$REMOTE" >/dev/null 2>&1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" -wait -merge -3 -a1 \ | ||||||
|  | 			"$BASE" "$LOCAL" "$REMOTE" "$MERGED" >/dev/null 2>&1 | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" -wait -2 \ | ||||||
|  | 			"$LOCAL" "$REMOTE" "$MERGED" >/dev/null 2>&1 | ||||||
|  | 	fi | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  |  | ||||||
|  | translate_merge_tool_path() { | ||||||
|  | 	echo compare | ||||||
|  | } | ||||||
|  | @ -0,0 +1,20 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \ | ||||||
|  | 			-mergeoutput="$MERGED" | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" "$LOCAL" "$REMOTE" \ | ||||||
|  | 			-mergeoutput="$MERGED" | ||||||
|  | 	fi | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  |  | ||||||
|  | translate_merge_tool_path() { | ||||||
|  | 	echo bcompare | ||||||
|  | } | ||||||
|  | @ -0,0 +1,46 @@ | ||||||
|  | # Redefined by builtin tools | ||||||
|  | can_merge () { | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | can_diff () { | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | diff_cmd () { | ||||||
|  | 	merge_tool_cmd="$(get_merge_tool_cmd "$1")" | ||||||
|  | 	if test -z "$merge_tool_cmd" | ||||||
|  | 	then | ||||||
|  | 		status=1 | ||||||
|  | 		break | ||||||
|  | 	fi | ||||||
|  | 	( eval $merge_tool_cmd ) | ||||||
|  | 	status=$? | ||||||
|  | 	return $status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	merge_tool_cmd="$(get_merge_tool_cmd "$1")" | ||||||
|  | 	if test -z "$merge_tool_cmd" | ||||||
|  | 	then | ||||||
|  | 		status=1 | ||||||
|  | 		break | ||||||
|  | 	fi | ||||||
|  | 	trust_exit_code="$(git config --bool \ | ||||||
|  | 		mergetool."$1".trustExitCode || echo false)" | ||||||
|  | 	if test "$trust_exit_code" = "false" | ||||||
|  | 	then | ||||||
|  | 		touch "$BACKUP" | ||||||
|  | 		( eval $merge_tool_cmd ) | ||||||
|  | 		status=$? | ||||||
|  | 		check_unchanged | ||||||
|  | 	else | ||||||
|  | 		( eval $merge_tool_cmd ) | ||||||
|  | 		status=$? | ||||||
|  | 	fi | ||||||
|  | 	return $status | ||||||
|  | } | ||||||
|  |  | ||||||
|  | translate_merge_tool_path () { | ||||||
|  | 	echo "$1" | ||||||
|  | } | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | cat | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" \ | ||||||
|  | 			"$LOCAL" "$MERGED" "$REMOTE" \ | ||||||
|  | 			"$BASE" | cat | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" \ | ||||||
|  | 			"$LOCAL" "$MERGED" "$REMOTE" | cat | ||||||
|  | 	fi | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" --default --mode=diff2 "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \ | ||||||
|  | 			--default --mode=merge3 --to="$MERGED" | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" "$LOCAL" "$REMOTE" \ | ||||||
|  | 			--default --mode=merge2 --to="$MERGED" | ||||||
|  | 	fi | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  | @ -0,0 +1,23 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" -f emerge-files-command "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" \ | ||||||
|  | 			-f emerge-files-with-ancestor-command \ | ||||||
|  | 			"$LOCAL" "$REMOTE" "$BASE" \ | ||||||
|  | 			"$(basename "$MERGED")" | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" \ | ||||||
|  | 			-f emerge-files-command \ | ||||||
|  | 			"$LOCAL" "$REMOTE" \ | ||||||
|  | 			"$(basename "$MERGED")" | ||||||
|  | 	fi | ||||||
|  | 	status=$? | ||||||
|  | } | ||||||
|  |  | ||||||
|  | translate_merge_tool_path() { | ||||||
|  | 	echo emacs | ||||||
|  | } | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" --auto \ | ||||||
|  | 		--L1 "$MERGED (A)" --L2 "$MERGED (B)" \ | ||||||
|  | 		"$LOCAL" "$REMOTE" >/dev/null 2>&1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" --auto \ | ||||||
|  | 			--L1 "$MERGED (Base)" \ | ||||||
|  | 			--L2 "$MERGED (Local)" \ | ||||||
|  | 			--L3 "$MERGED (Remote)" \ | ||||||
|  | 			-o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" \ | ||||||
|  | 		>/dev/null 2>&1 | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" --auto \ | ||||||
|  | 			--L1 "$MERGED (Local)" \ | ||||||
|  | 			--L2 "$MERGED (Remote)" \ | ||||||
|  | 			-o "$MERGED" "$LOCAL" "$REMOTE" \ | ||||||
|  | 		>/dev/null 2>&1 | ||||||
|  | 	fi | ||||||
|  | 	status=$? | ||||||
|  | } | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | can_merge () { | ||||||
|  | 	return 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | cat | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" "$LOCAL" "$REMOTE" \ | ||||||
|  | 			-ancestor "$BASE" -merge "$MERGED" | cat | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" "$LOCAL" "$REMOTE" \ | ||||||
|  | 			-merge "$MERGED" | cat | ||||||
|  | 	fi | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	$base_present || >"$BASE" | ||||||
|  | 	"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED" | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  | @ -0,0 +1,12 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" "$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE" | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE" | ||||||
|  | 	fi | ||||||
|  | } | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | can_diff () { | ||||||
|  | 	return 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		touch "$BACKUP" | ||||||
|  | 		"$merge_tool_path" \ | ||||||
|  | 			-base:"$BASE" -mine:"$LOCAL" \ | ||||||
|  | 			-theirs:"$REMOTE" -merged:"$MERGED" | ||||||
|  | 		check_unchanged | ||||||
|  | 	else | ||||||
|  | 		echo "TortoiseMerge cannot be used without a base" 1>&2 | ||||||
|  | 		return 1 | ||||||
|  | 	fi | ||||||
|  | } | ||||||
|  | @ -0,0 +1,44 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	case "$1" in | ||||||
|  | 	gvimdiff|vimdiff) | ||||||
|  | 		"$merge_tool_path" -R -f -d \ | ||||||
|  | 			-c 'wincmd l' -c 'cd $GIT_PREFIX' "$LOCAL" "$REMOTE" | ||||||
|  | 		;; | ||||||
|  | 	gvimdiff2|vimdiff2) | ||||||
|  | 		"$merge_tool_path" -R -f -d \ | ||||||
|  | 			-c 'wincmd l' -c 'cd $GIT_PREFIX' "$LOCAL" "$REMOTE" | ||||||
|  | 		;; | ||||||
|  | 	esac | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	case "$1" in | ||||||
|  | 	gvimdiff|vimdiff) | ||||||
|  | 		if $base_present | ||||||
|  | 		then | ||||||
|  | 			"$merge_tool_path" -f -d -c 'wincmd J' \ | ||||||
|  | 				"$MERGED" "$LOCAL" "$BASE" "$REMOTE" | ||||||
|  | 		else | ||||||
|  | 			"$merge_tool_path" -f -d -c 'wincmd l' \ | ||||||
|  | 				"$LOCAL" "$MERGED" "$REMOTE" | ||||||
|  | 		fi | ||||||
|  | 		;; | ||||||
|  | 	gvimdiff2|vimdiff2) | ||||||
|  | 		"$merge_tool_path" -f -d -c 'wincmd l' \ | ||||||
|  | 			"$LOCAL" "$MERGED" "$REMOTE" | ||||||
|  | 		;; | ||||||
|  | 	esac | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
|  |  | ||||||
|  | translate_merge_tool_path() { | ||||||
|  | 	case "$1" in | ||||||
|  | 	gvimdiff|gvimdiff2) | ||||||
|  | 		echo gvim | ||||||
|  | 		;; | ||||||
|  | 	vimdiff|vimdiff2) | ||||||
|  | 		echo vim | ||||||
|  | 		;; | ||||||
|  | 	esac | ||||||
|  | } | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | diff_cmd () { | ||||||
|  | 	"$merge_tool_path" \ | ||||||
|  | 		-R 'Accel.Search: "Ctrl+F"' \ | ||||||
|  | 		-R 'Accel.SearchForward: "Ctrl-G"' \ | ||||||
|  | 		"$LOCAL" "$REMOTE" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | merge_cmd () { | ||||||
|  | 	touch "$BACKUP" | ||||||
|  | 	if $base_present | ||||||
|  | 	then | ||||||
|  | 		"$merge_tool_path" -X --show-merged-pane \ | ||||||
|  | 			-R 'Accel.SaveAsMerged: "Ctrl-S"' \ | ||||||
|  | 			-R 'Accel.Search: "Ctrl+F"' \ | ||||||
|  | 			-R 'Accel.SearchForward: "Ctrl-G"' \ | ||||||
|  | 			--merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE" | ||||||
|  | 	else | ||||||
|  | 		"$merge_tool_path" -X $extra \ | ||||||
|  | 			-R 'Accel.SaveAsMerged: "Ctrl-S"' \ | ||||||
|  | 			-R 'Accel.Search: "Ctrl+F"' \ | ||||||
|  | 			-R 'Accel.SearchForward: "Ctrl-G"' \ | ||||||
|  | 			--merged-file "$MERGED" "$LOCAL" "$REMOTE" | ||||||
|  | 	fi | ||||||
|  | 	check_unchanged | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	 David Aguilar
						David Aguilar