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