1#!/bin/sh
2
3test_description='subtree merge strategy'
4
5. ./test-lib.sh
6
7test_expect_success setup '
8
9 s="1 2 3 4 5 6 7 8" &&
10 for i in $s; do echo $i; done >hello &&
11 git add hello &&
12 git commit -m initial &&
13 git checkout -b side &&
14 echo >>hello world &&
15 git add hello &&
16 git commit -m second &&
17 git checkout master &&
18 for i in mundo $s; do echo $i; done >hello &&
19 git add hello &&
20 git commit -m master
21
22'
23
24test_expect_success 'subtree available and works like recursive' '
25
26 git merge -s subtree side &&
27 for i in mundo $s world; do echo $i; done >expect &&
28 test_cmp expect hello
29
30'
31
32test_expect_success 'setup branch sub' '
33 git checkout --orphan sub &&
34 git rm -rf . &&
35 test_commit foo
36'
37
38test_expect_success 'setup branch main' '
39 git checkout -b main master &&
40 git merge -s ours --no-commit --allow-unrelated-histories sub &&
41 git read-tree --prefix=dir/ -u sub &&
42 git commit -m "initial merge of sub into main" &&
43 test_path_is_file dir/foo.t &&
44 test_path_is_file hello
45'
46
47test_expect_success 'update branch sub' '
48 git checkout sub &&
49 test_commit bar
50'
51
52test_expect_success 'update branch main' '
53 git checkout main &&
54 git merge -s subtree sub -m "second merge of sub into main" &&
55 test_path_is_file dir/bar.t &&
56 test_path_is_file dir/foo.t &&
57 test_path_is_file hello
58'
59
60test_expect_success 'setup' '
61 mkdir git-gui &&
62 cd git-gui &&
63 git init &&
64 echo git-gui > git-gui.sh &&
65 o1=$(git hash-object git-gui.sh) &&
66 git add git-gui.sh &&
67 git commit -m "initial git-gui" &&
68 cd .. &&
69 mkdir git &&
70 cd git &&
71 git init &&
72 echo git >git.c &&
73 o2=$(git hash-object git.c) &&
74 git add git.c &&
75 git commit -m "initial git"
76'
77
78test_expect_success 'initial merge' '
79 git remote add -f gui ../git-gui &&
80 git merge -s ours --no-commit --allow-unrelated-histories gui/master &&
81 git read-tree --prefix=git-gui/ -u gui/master &&
82 git commit -m "Merge git-gui as our subdirectory" &&
83 git checkout -b work &&
84 git ls-files -s >actual &&
85 (
86 echo "100644 $o1 0 git-gui/git-gui.sh" &&
87 echo "100644 $o2 0 git.c"
88 ) >expected &&
89 test_cmp expected actual
90'
91
92test_expect_success 'merge update' '
93 cd ../git-gui &&
94 echo git-gui2 > git-gui.sh &&
95 o3=$(git hash-object git-gui.sh) &&
96 git add git-gui.sh &&
97 git checkout -b master2 &&
98 git commit -m "update git-gui" &&
99 cd ../git &&
100 git pull -s subtree gui master2 &&
101 git ls-files -s >actual &&
102 (
103 echo "100644 $o3 0 git-gui/git-gui.sh" &&
104 echo "100644 $o2 0 git.c"
105 ) >expected &&
106 test_cmp expected actual
107'
108
109test_expect_success 'initial ambiguous subtree' '
110 cd ../git &&
111 git reset --hard master &&
112 git checkout -b master2 &&
113 git merge -s ours --no-commit gui/master &&
114 git read-tree --prefix=git-gui2/ -u gui/master &&
115 git commit -m "Merge git-gui2 as our subdirectory" &&
116 git checkout -b work2 &&
117 git ls-files -s >actual &&
118 (
119 echo "100644 $o1 0 git-gui/git-gui.sh" &&
120 echo "100644 $o1 0 git-gui2/git-gui.sh" &&
121 echo "100644 $o2 0 git.c"
122 ) >expected &&
123 test_cmp expected actual
124'
125
126test_expect_success 'merge using explicit' '
127 cd ../git &&
128 git reset --hard master2 &&
129 git pull -Xsubtree=git-gui gui master2 &&
130 git ls-files -s >actual &&
131 (
132 echo "100644 $o3 0 git-gui/git-gui.sh" &&
133 echo "100644 $o1 0 git-gui2/git-gui.sh" &&
134 echo "100644 $o2 0 git.c"
135 ) >expected &&
136 test_cmp expected actual
137'
138
139test_expect_success 'merge2 using explicit' '
140 cd ../git &&
141 git reset --hard master2 &&
142 git pull -Xsubtree=git-gui2 gui master2 &&
143 git ls-files -s >actual &&
144 (
145 echo "100644 $o1 0 git-gui/git-gui.sh" &&
146 echo "100644 $o3 0 git-gui2/git-gui.sh" &&
147 echo "100644 $o2 0 git.c"
148 ) >expected &&
149 test_cmp expected actual
150'
151
152test_done