t7800-difftool.sh 5.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
#!/bin/sh
#
# Copyright (c) 2009 David Aguilar
#

test_description='git-difftool

Testing basic diff tool invocation
'

. ./test-lib.sh

J
Jeff King 已提交
13 14 15 16 17
if ! test_have_prereq PERL; then
	say 'skipping difftool tests, perl not available'
	test_done
fi

18 19 20
LF='
'

21 22 23 24
remove_config_vars()
{
	# Unset all config variables used by git-difftool
	git config --unset diff.tool
25
	git config --unset diff.guitool
26
	git config --unset difftool.test-tool.cmd
27
	git config --unset difftool.prompt
28 29 30 31 32 33 34 35 36 37
	git config --unset merge.tool
	git config --unset mergetool.test-tool.cmd
	return 0
}

restore_test_defaults()
{
	# Restores the test defaults used by several tests
	remove_config_vars
	unset GIT_DIFF_TOOL
38
	unset GIT_DIFFTOOL_PROMPT
39 40 41
	unset GIT_DIFFTOOL_NO_PROMPT
	git config diff.tool test-tool &&
	git config difftool.test-tool.cmd 'cat $LOCAL'
42
	git config difftool.bogus-tool.cmd false
43 44
}

45 46 47 48 49 50
prompt_given()
{
	prompt="$1"
	test "$prompt" = "Hit return to launch 'test-tool': branch"
}

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
# Create a file on master and change it on branch
test_expect_success 'setup' '
	echo master >file &&
	git add file &&
	git commit -m "added file" &&

	git checkout -b branch master &&
	echo branch >file &&
	git commit -a -m "branch changed file" &&
	git checkout master
'

# Configure a custom difftool.<tool>.cmd and use it
test_expect_success 'custom commands' '
	restore_test_defaults &&
	git config difftool.test-tool.cmd "cat \$REMOTE" &&

	diff=$(git difftool --no-prompt branch) &&
	test "$diff" = "master" &&

	restore_test_defaults &&
	diff=$(git difftool --no-prompt branch) &&
	test "$diff" = "branch"
'

# Ensures that git-difftool ignores bogus --tool values
test_expect_success 'difftool ignores bad --tool values' '
78
	diff=$(git difftool --no-prompt --tool=bad-tool branch)
79 80 81 82
	test "$?" = 1 &&
	test "$diff" = ""
'

83 84 85 86 87 88 89 90 91 92 93
test_expect_success 'difftool honors --gui' '
	git config merge.tool bogus-tool &&
	git config diff.tool bogus-tool &&
	git config diff.guitool test-tool &&

	diff=$(git difftool --no-prompt --gui branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
# Specify the diff tool using $GIT_DIFF_TOOL
test_expect_success 'GIT_DIFF_TOOL variable' '
	git config --unset diff.tool
	GIT_DIFF_TOOL=test-tool &&
	export GIT_DIFF_TOOL &&

	diff=$(git difftool --no-prompt branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

# Test the $GIT_*_TOOL variables and ensure
# that $GIT_DIFF_TOOL always wins unless --tool is specified
test_expect_success 'GIT_DIFF_TOOL overrides' '
	git config diff.tool bogus-tool &&
	git config merge.tool bogus-tool &&

	GIT_DIFF_TOOL=test-tool &&
	export GIT_DIFF_TOOL &&

	diff=$(git difftool --no-prompt branch) &&
	test "$diff" = "branch" &&

	GIT_DIFF_TOOL=bogus-tool &&
	export GIT_DIFF_TOOL &&

	diff=$(git difftool --no-prompt --tool=test-tool branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

# Test that we don't have to pass --no-prompt to difftool
# when $GIT_DIFFTOOL_NO_PROMPT is true
test_expect_success 'GIT_DIFFTOOL_NO_PROMPT variable' '
	GIT_DIFFTOOL_NO_PROMPT=true &&
	export GIT_DIFFTOOL_NO_PROMPT &&

	diff=$(git difftool branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

139 140 141 142 143 144 145
# git-difftool supports the difftool.prompt variable.
# Test that GIT_DIFFTOOL_PROMPT can override difftool.prompt = false
test_expect_success 'GIT_DIFFTOOL_PROMPT variable' '
	git config difftool.prompt false &&
	GIT_DIFFTOOL_PROMPT=true &&
	export GIT_DIFFTOOL_PROMPT &&

146
	prompt=$(echo | git difftool branch | tail -1) &&
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
	prompt_given "$prompt" &&

	restore_test_defaults
'

# Test that we don't have to pass --no-prompt when difftool.prompt is false
test_expect_success 'difftool.prompt config variable is false' '
	git config difftool.prompt false &&

	diff=$(git difftool branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

# Test that the -y flag can override difftool.prompt = true
test_expect_success 'difftool.prompt can overridden with -y' '
	git config difftool.prompt true &&

	diff=$(git difftool -y branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

# Test that the --prompt flag can override difftool.prompt = false
test_expect_success 'difftool.prompt can overridden with --prompt' '
	git config difftool.prompt false &&

	prompt=$(echo | git difftool --prompt branch | tail -1) &&
	prompt_given "$prompt" &&

	restore_test_defaults
'

# Test that the last flag passed on the command-line wins
test_expect_success 'difftool last flag wins' '
	diff=$(git difftool --prompt --no-prompt branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults &&

	prompt=$(echo | git difftool --no-prompt --prompt branch | tail -1) &&
	prompt_given "$prompt" &&

	restore_test_defaults
'

195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
# git-difftool falls back to git-mergetool config variables
# so test that behavior here
test_expect_success 'difftool + mergetool config variables' '
	remove_config_vars
	git config merge.tool test-tool &&
	git config mergetool.test-tool.cmd "cat \$LOCAL" &&

	diff=$(git difftool --no-prompt branch) &&
	test "$diff" = "branch" &&

	# set merge.tool to something bogus, diff.tool to test-tool
	git config merge.tool bogus-tool &&
	git config diff.tool test-tool &&

	diff=$(git difftool --no-prompt branch) &&
	test "$diff" = "branch" &&

	restore_test_defaults
'

test_expect_success 'difftool.<tool>.path' '
	git config difftool.tkdiff.path echo &&
	diff=$(git difftool --tool=tkdiff --no-prompt branch) &&
	git config --unset difftool.tkdiff.path &&
	lines=$(echo "$diff" | grep file | wc -l) &&
220 221 222 223 224
	test "$lines" -eq 1 &&

	restore_test_defaults
'

225
test_expect_success 'difftool --extcmd=cat' '
226
	diff=$(git difftool --no-prompt --extcmd=cat branch) &&
227
	test "$diff" = branch"$LF"master
228 229 230 231




232 233 234
'

test_done