Skip to content
This repository
tree: 33a54e7d9a
Fetching contributors…

Cannot retrieve contributors at this time

executable file 377 lines (296 sloc) 9.789 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 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 139 140 141 142 143 144 145 146 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 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 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
#!/bin/sh
#
# Copyright (c) 2009, 2010 David Aguilar
#

test_description='git-difftool

Testing basic diff tool invocation
'

. ./test-lib.sh

remove_config_vars()
{
# Unset all config variables used by git-difftool
git config --unset diff.tool
git config --unset diff.guitool
git config --unset difftool.test-tool.cmd
git config --unset difftool.prompt
git config --unset merge.tool
git config --unset mergetool.test-tool.cmd
git config --unset mergetool.prompt
return 0
}

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

prompt_given()
{
prompt="$1"
test "$prompt" = "Launch 'test-tool' [Y/n]: branch"
}

stdin_contains()
{
grep >/dev/null "$1"
}

stdin_doesnot_contain()
{
! stdin_contains "$1"
}

# Create a file on master and change it on branch
test_expect_success PERL '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 PERL '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 PERL 'difftool ignores bad --tool values' '
diff=$(git difftool --no-prompt --tool=bad-tool branch)
test "$?" = 1 &&
test "$diff" = ""
'

test_expect_success PERL 'difftool forwards arguments to diff' '
>for-diff &&
git add for-diff &&
echo changes>for-diff &&
git add for-diff &&
diff=$(git difftool --cached --no-prompt -- for-diff) &&
test "$diff" = "" &&
git reset -- for-diff &&
rm for-diff
'

test_expect_success PERL '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
'

test_expect_success PERL 'difftool --gui last setting wins' '
git config diff.guitool bogus-tool &&
git difftool --no-prompt --gui --no-gui &&

git config merge.tool bogus-tool &&
git config diff.tool bogus-tool &&
git config diff.guitool test-tool &&
diff=$(git difftool --no-prompt --no-gui --gui branch) &&
test "$diff" = "branch" &&

restore_test_defaults
'

test_expect_success PERL 'difftool --gui works without configured diff.guitool' '
git config diff.tool test-tool &&

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

restore_test_defaults
'

# Specify the diff tool using $GIT_DIFF_TOOL
test_expect_success PERL 'GIT_DIFF_TOOL variable' '
test_might_fail 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 PERL '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 PERL '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
'

# git-difftool supports the difftool.prompt variable.
# Test that GIT_DIFFTOOL_PROMPT can override difftool.prompt = false
test_expect_success PERL 'GIT_DIFFTOOL_PROMPT variable' '
git config difftool.prompt false &&
GIT_DIFFTOOL_PROMPT=true &&
export GIT_DIFFTOOL_PROMPT &&

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

restore_test_defaults
'

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

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

restore_test_defaults
'

# Test that we don't have to pass --no-prompt when mergetool.prompt is false
test_expect_success PERL 'difftool merge.prompt = false' '
test_might_fail git config --unset difftool.prompt &&
git config mergetool.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 PERL '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 PERL '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 PERL '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
'

# git-difftool falls back to git-mergetool config variables
# so test that behavior here
test_expect_success PERL '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 PERL '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) &&
test "$lines" -eq 1 &&

restore_test_defaults
'

test_expect_success PERL 'difftool --extcmd=cat' '
diff=$(git difftool --no-prompt --extcmd=cat branch) &&
test "$diff" = branch"$LF"master
'

test_expect_success PERL 'difftool --extcmd cat' '
diff=$(git difftool --no-prompt --extcmd cat branch) &&
test "$diff" = branch"$LF"master
'

test_expect_success PERL 'difftool -x cat' '
diff=$(git difftool --no-prompt -x cat branch) &&
test "$diff" = branch"$LF"master
'

test_expect_success PERL 'difftool --extcmd echo arg1' '
diff=$(git difftool --no-prompt --extcmd sh\ -c\ \"echo\ \$1\" branch) &&
test "$diff" = file
'

test_expect_success PERL 'difftool --extcmd cat arg1' '
diff=$(git difftool --no-prompt --extcmd sh\ -c\ \"cat\ \$1\" branch) &&
test "$diff" = master
'

test_expect_success PERL 'difftool --extcmd cat arg2' '
diff=$(git difftool --no-prompt --extcmd sh\ -c\ \"cat\ \$2\" branch) &&
test "$diff" = branch
'

# Create a second file on master and a different version on branch
test_expect_success PERL 'setup with 2 files different' '
echo m2 >file2 &&
git add file2 &&
git commit -m "added file2" &&

git checkout branch &&
echo br2 >file2 &&
git add file2 &&
git commit -a -m "branch changed file2" &&
git checkout master
'

test_expect_success PERL 'say no to the first file' '
diff=$( (echo n; echo) | git difftool -x cat branch ) &&

echo "$diff" | stdin_contains m2 &&
echo "$diff" | stdin_contains br2 &&
echo "$diff" | stdin_doesnot_contain master &&
echo "$diff" | stdin_doesnot_contain branch
'

test_expect_success PERL 'say no to the second file' '
diff=$( (echo; echo n) | git difftool -x cat branch ) &&

echo "$diff" | stdin_contains master &&
echo "$diff" | stdin_contains branch &&
echo "$diff" | stdin_doesnot_contain m2 &&
echo "$diff" | stdin_doesnot_contain br2
'

test_expect_success PERL 'difftool --tool-help' '
tool_help=$(git difftool --tool-help) &&
echo "$tool_help" | stdin_contains tool
'

test_expect_success PERL 'setup change in subdirectory' '
git checkout master &&
mkdir sub &&
echo master >sub/sub &&
git add sub/sub &&
git commit -m "added sub/sub" &&
echo test >>file &&
echo test >>sub/sub &&
git add . &&
git commit -m "modified both"
'

test_expect_success PERL 'difftool -d' '
diff=$(git difftool -d --extcmd ls branch) &&
echo "$diff" | stdin_contains sub &&
echo "$diff" | stdin_contains file
'

test_expect_success PERL 'difftool --dir-diff' '
diff=$(git difftool --dir-diff --extcmd ls branch) &&
echo "$diff" | stdin_contains sub &&
echo "$diff" | stdin_contains file
'

test_expect_success PERL 'difftool --dir-diff ignores --prompt' '
diff=$(git difftool --dir-diff --prompt --extcmd ls branch) &&
echo "$diff" | stdin_contains sub &&
echo "$diff" | stdin_contains file
'

test_expect_success PERL 'difftool --dir-diff from subdirectory' '
(
cd sub &&
diff=$(git difftool --dir-diff --extcmd ls branch) &&
echo "$diff" | stdin_contains sub &&
echo "$diff" | stdin_contains file
)
'

test_done
Something went wrong with that request. Please try again.