Merge branch 'jk/diff-blob'
[gitweb.git] / t / t7800-difftool.sh
index aa0ef02597f051b17747df4c9cf3d4b50563ed69..668bbee73c8dc58c6ba61c4a8002ed68206d1445 100755 (executable)
@@ -23,6 +23,18 @@ prompt_given ()
        test "$prompt" = "Launch 'test-tool' [Y/n]? branch"
 }
 
+test_expect_success 'basic usage requires no repo' '
+       test_expect_code 129 git difftool -h >output &&
+       test_i18ngrep ^usage: output &&
+       # create a ceiling directory to prevent Git from finding a repo
+       mkdir -p not/repo &&
+       test_when_finished rm -r not &&
+       test_expect_code 129 \
+       env GIT_CEILING_DIRECTORIES="$(pwd)/not" \
+       git -C not/repo difftool -h >output &&
+       test_i18ngrep ^usage: output
+'
+
 # Create a file on master and change it on branch
 test_expect_success 'setup' '
        echo master >file &&
@@ -278,8 +290,8 @@ test_expect_success 'difftool + mergetool config variables' '
 test_expect_success 'difftool.<tool>.path' '
        test_config difftool.tkdiff.path echo &&
        git difftool --tool=tkdiff --no-prompt branch >output &&
-       lines=$(grep file output | wc -l) &&
-       test "$lines" -eq 1
+       grep file output >grep-output &&
+       test_line_count = 1 grep-output
 '
 
 test_expect_success 'difftool --extcmd=cat' '
@@ -381,6 +393,25 @@ test_expect_success 'setup change in subdirectory' '
        git commit -m "modified both"
 '
 
+test_expect_success 'difftool -d with growing paths' '
+       a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
+       git init growing &&
+       (
+               cd growing &&
+               echo "test -f \"\$2/b\"" | write_script .git/test-for-b.sh &&
+               one=$(printf 1 | git hash-object -w --stdin) &&
+               two=$(printf 2 | git hash-object -w --stdin) &&
+               git update-index --add \
+                       --cacheinfo 100644,$one,$a --cacheinfo 100644,$two,b &&
+               tree1=$(git write-tree) &&
+               git update-index --add \
+                       --cacheinfo 100644,$two,$a --cacheinfo 100644,$one,b &&
+               tree2=$(git write-tree) &&
+               git checkout -- $a &&
+               git difftool -d --extcmd .git/test-for-b.sh $tree1 $tree2
+       )
+'
+
 run_dir_diff_test () {
        test_expect_success "$1 --no-symlinks" "
                symlinks=--no-symlinks &&
@@ -416,9 +447,12 @@ run_dir_diff_test 'difftool --dir-diff branch from subdirectory' '
                git difftool --dir-diff $symlinks --extcmd ls branch >output &&
                # "sub" must only exist in "right"
                # "file" and "file2" must be listed in both "left" and "right"
-               test "1" = $(grep sub output | wc -l) &&
-               test "2" = $(grep file"$" output | wc -l) &&
-               test "2" = $(grep file2 output | wc -l)
+               grep sub output >sub-output &&
+               test_line_count = 1 sub-output &&
+               grep file"$" output >file-output &&
+               test_line_count = 2 file-output &&
+               grep file2 output >file2-output &&
+               test_line_count = 2 file2-output
        )
 '
 
@@ -428,9 +462,11 @@ run_dir_diff_test 'difftool --dir-diff v1 from subdirectory' '
                git difftool --dir-diff $symlinks --extcmd ls v1 >output &&
                # "sub" and "file" exist in both v1 and HEAD.
                # "file2" is unchanged.
-               test "2" = $(grep sub output | wc -l) &&
-               test "2" = $(grep file output | wc -l) &&
-               test "0" = $(grep file2 output | wc -l)
+               grep sub output >sub-output &&
+               test_line_count = 2 sub-output &&
+               grep file output >file-output &&
+               test_line_count = 2 file-output &&
+               ! grep file2 output
        )
 '
 
@@ -440,8 +476,9 @@ run_dir_diff_test 'difftool --dir-diff branch from subdirectory w/ pathspec' '
                git difftool --dir-diff $symlinks --extcmd ls branch -- .>output &&
                # "sub" only exists in "right"
                # "file" and "file2" must not be listed
-               test "1" = $(grep sub output | wc -l) &&
-               test "0" = $(grep file output | wc -l)
+               grep sub output >sub-output &&
+               test_line_count = 1 sub-output &&
+               ! grep file output
        )
 '
 
@@ -451,8 +488,9 @@ run_dir_diff_test 'difftool --dir-diff v1 from subdirectory w/ pathspec' '
                git difftool --dir-diff $symlinks --extcmd ls v1 -- .>output &&
                # "sub" exists in v1 and HEAD
                # "file" is filtered out by the pathspec
-               test "2" = $(grep sub output | wc -l) &&
-               test "0" = $(grep file output | wc -l)
+               grep sub output >sub-output &&
+               test_line_count = 2 sub-output &&
+               ! grep file output
        )
 '
 
@@ -572,6 +610,7 @@ test_expect_success 'difftool --no-symlinks detects conflict ' '
 '
 
 test_expect_success 'difftool properly honors gitlink and core.worktree' '
+       test_when_finished rm -rf submod/ule &&
        git submodule add ./. submod/ule &&
        test_config -C submod/ule diff.tool checktrees &&
        test_config -C submod/ule difftool.checktrees.cmd '\''
@@ -581,11 +620,13 @@ test_expect_success 'difftool properly honors gitlink and core.worktree' '
                cd submod/ule &&
                echo good >expect &&
                git difftool --tool=checktrees --dir-diff HEAD~ >actual &&
-               test_cmp expect actual
+               test_cmp expect actual &&
+               rm -f expect actual
        )
 '
 
 test_expect_success SYMLINKS 'difftool --dir-diff symlinked directories' '
+       test_when_finished git reset --hard &&
        git init dirlinks &&
        (
                cd dirlinks &&
@@ -604,4 +645,64 @@ test_expect_success SYMLINKS 'difftool --dir-diff symlinked directories' '
        )
 '
 
+test_expect_success SYMLINKS 'difftool --dir-diff handles modified symlinks' '
+       test_when_finished git reset --hard &&
+       touch b &&
+       ln -s b c &&
+       git add b c &&
+       test_tick &&
+       git commit -m initial &&
+       touch d &&
+       rm c &&
+       ln -s d c &&
+       cat >expect <<-EOF &&
+               b
+               c
+
+               c
+       EOF
+       git difftool --symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual &&
+
+       git difftool --no-symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual &&
+
+       # The left side contains symlink "c" that points to "b"
+       test_config difftool.cat.cmd "cat \$LOCAL/c" &&
+       printf "%s\n" b >expect &&
+
+       git difftool --symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       git difftool --symlinks --no-symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       # The right side contains symlink "c" that points to "d"
+       test_config difftool.cat.cmd "cat \$REMOTE/c" &&
+       printf "%s\n" d >expect &&
+
+       git difftool --symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       git difftool --no-symlinks --dir-diff --tool cat >actual &&
+       test_cmp expect actual &&
+
+       # Deleted symlinks
+       rm -f c &&
+       cat >expect <<-EOF &&
+               b
+               c
+
+       EOF
+       git difftool --symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual &&
+
+       git difftool --no-symlinks --dir-diff --extcmd ls >output &&
+       grep -v ^/ output >actual &&
+       test_cmp expect actual
+'
+
 test_done