Code

add tests for merge-index / merge-one-file
authorJeff King <peff@peff.net>
Fri, 29 Apr 2011 22:23:54 +0000 (18:23 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 29 Apr 2011 22:37:08 +0000 (15:37 -0700)
There were no tests for either, except a brief use in
t1200-tutorial.

These tools are not used much these days, as most people
use the merge-recursive strategy, which handles everything
internally. However, they are used by the "octopus" and
"resolve" strategies, as well as any custom strategies
or merge scripts people have built around them.

For example, together with read-tree, they are the simplest
way to do a basic content-level merge without checking out
the entire repository contents beforehand.

This script adds a basic test of the tools to perform one
content-level merge. It also shows a failure of the tools to
work properly in the face of GIT_WORK_TREE or core.worktree.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t6060-merge-index.sh [new file with mode: 0755]

diff --git a/t/t6060-merge-index.sh b/t/t6060-merge-index.sh
new file mode 100755 (executable)
index 0000000..895f079
--- /dev/null
@@ -0,0 +1,100 @@
+#!/bin/sh
+
+test_description='basic git merge-index / git-merge-one-file tests'
+. ./test-lib.sh
+
+test_expect_success 'setup diverging branches' '
+       for i in 1 2 3 4 5 6 7 8 9 10; do
+               echo $i
+       done >file &&
+       git add file &&
+       git commit -m base &&
+       git tag base &&
+       sed s/2/two/ <file >tmp &&
+       mv tmp file &&
+       git commit -a -m two &&
+       git tag two &&
+       git checkout -b other HEAD^ &&
+       sed s/10/ten/ <file >tmp &&
+       mv tmp file &&
+       git commit -a -m ten &&
+       git tag ten
+'
+
+cat >expect-merged <<'EOF'
+1
+two
+3
+4
+5
+6
+7
+8
+9
+ten
+EOF
+
+test_expect_success 'read-tree does not resolve content merge' '
+       git read-tree -i -m base ten two &&
+       echo file >expect &&
+       git diff-files --name-only --diff-filter=U >unmerged &&
+       test_cmp expect unmerged
+'
+
+test_expect_success 'git merge-index git-merge-one-file resolves' '
+       git merge-index git-merge-one-file -a &&
+       git diff-files --name-only --diff-filter=U >unmerged &&
+       >expect &&
+       test_cmp expect unmerged &&
+       test_cmp expect-merged file &&
+       git cat-file blob :file >file-index &&
+       test_cmp expect-merged file-index
+'
+
+test_expect_success 'setup bare merge' '
+       git clone --bare . bare.git &&
+       (cd bare.git &&
+        GIT_INDEX_FILE=$PWD/merge.index &&
+        export GIT_INDEX_FILE &&
+        git read-tree -i -m base ten two
+       )
+'
+
+test_expect_success 'merge-one-file fails without a work tree' '
+       (cd bare.git &&
+        GIT_INDEX_FILE=$PWD/merge.index &&
+        export GIT_INDEX_FILE &&
+        test_must_fail git merge-index git-merge-one-file -a
+       )
+'
+
+test_expect_failure 'merge-one-file respects GIT_WORK_TREE' '
+       (cd bare.git &&
+        mkdir work &&
+        GIT_WORK_TREE=$PWD/work &&
+        export GIT_WORK_TREE &&
+        GIT_INDEX_FILE=$PWD/merge.index &&
+        export GIT_INDEX_FILE &&
+        git merge-index git-merge-one-file -a &&
+        git cat-file blob :file >work/file-index
+       ) &&
+       test_cmp expect-merged bare.git/work/file &&
+       test_cmp expect-merged bare.git/work/file-index
+'
+
+test_expect_failure 'merge-one-file respects core.worktree' '
+       mkdir subdir &&
+       git clone . subdir/child &&
+       (cd subdir &&
+        GIT_DIR=$PWD/child/.git &&
+        export GIT_DIR &&
+        git config core.worktree "$PWD/child" &&
+        git read-tree -i -m base ten two &&
+        git merge-index git-merge-one-file -a &&
+        git cat-file blob :file >file-index
+       ) &&
+       test_cmp expect-merged subdir/child/file &&
+       test_cmp expect-merged subdir/file-index
+'
+
+test_done