summaryrefslogtreecommitdiffstats
path: root/t/t6409-merge-subtree.sh
blob: e9ba6f1690d015d06e13c69db2c1190ef8436443 (plain)
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
#!/bin/sh

test_description='subtree merge strategy'

GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

. ./test-lib.sh

test_expect_success setup '

	s="1 2 3 4 5 6 7 8" &&
	test_write_lines $s >hello &&
	git add hello &&
	git commit -m initial &&
	git checkout -b side &&
	echo >>hello world &&
	git add hello &&
	git commit -m second &&
	git checkout main &&
	test_write_lines mundo $s >hello &&
	git add hello &&
	git commit -m main

'

test_expect_success 'subtree available and works like recursive' '

	git merge -s subtree side &&
	test_write_lines mundo $s world >expect &&
	test_cmp expect hello

'

test_expect_success 'setup branch sub' '
	git checkout --orphan sub &&
	git rm -rf . &&
	test_commit foo
'

test_expect_success 'setup topic branch' '
	git checkout -b topic main &&
	git merge -s ours --no-commit --allow-unrelated-histories sub &&
	git read-tree --prefix=dir/ -u sub &&
	git commit -m "initial merge of sub into topic" &&
	test_path_is_file dir/foo.t &&
	test_path_is_file hello
'

test_expect_success 'update branch sub' '
	git checkout sub &&
	test_commit bar
'

test_expect_success 'update topic branch' '
	git checkout topic &&
	git merge -s subtree sub -m "second merge of sub into topic" &&
	test_path_is_file dir/bar.t &&
	test_path_is_file dir/foo.t &&
	test_path_is_file hello
'

test_expect_success 'setup' '
	mkdir git-gui &&
	cd git-gui &&
	git init &&
	echo git-gui > git-gui.sh &&
	o1=$(git hash-object git-gui.sh) &&
	git add git-gui.sh &&
	git commit -m "initial git-gui" &&
	cd .. &&
	mkdir git &&
	cd git &&
	git init &&
	echo git >git.c &&
	o2=$(git hash-object git.c) &&
	git add git.c &&
	git commit -m "initial git"
'

test_expect_success 'initial merge' '
	git remote add -f gui ../git-gui &&
	git merge -s ours --no-commit --allow-unrelated-histories gui/main &&
	git read-tree --prefix=git-gui/ -u gui/main &&
	git commit -m "Merge git-gui as our subdirectory" &&
	git checkout -b work &&
	git ls-files -s >actual &&
	(
		echo "100644 $o1 0	git-gui/git-gui.sh" &&
		echo "100644 $o2 0	git.c"
	) >expected &&
	test_cmp expected actual
'

test_expect_success 'merge update' '
	cd ../git-gui &&
	echo git-gui2 > git-gui.sh &&
	o3=$(git hash-object git-gui.sh) &&
	git add git-gui.sh &&
	git checkout -b topic_2 &&
	git commit -m "update git-gui" &&
	cd ../git &&
	git pull --no-rebase -s subtree gui topic_2 &&
	git ls-files -s >actual &&
	(
		echo "100644 $o3 0	git-gui/git-gui.sh" &&
		echo "100644 $o2 0	git.c"
	) >expected &&
	test_cmp expected actual
'

test_expect_success 'initial ambiguous subtree' '
	cd ../git &&
	git reset --hard main &&
	git checkout -b topic_2 &&
	git merge -s ours --no-commit gui/main &&
	git read-tree --prefix=git-gui2/ -u gui/main &&
	git commit -m "Merge git-gui2 as our subdirectory" &&
	git checkout -b work2 &&
	git ls-files -s >actual &&
	(
		echo "100644 $o1 0	git-gui/git-gui.sh" &&
		echo "100644 $o1 0	git-gui2/git-gui.sh" &&
		echo "100644 $o2 0	git.c"
	) >expected &&
	test_cmp expected actual
'

test_expect_success 'merge using explicit' '
	cd ../git &&
	git reset --hard topic_2 &&
	git pull --no-rebase -Xsubtree=git-gui gui topic_2 &&
	git ls-files -s >actual &&
	(
		echo "100644 $o3 0	git-gui/git-gui.sh" &&
		echo "100644 $o1 0	git-gui2/git-gui.sh" &&
		echo "100644 $o2 0	git.c"
	) >expected &&
	test_cmp expected actual
'

test_expect_success 'merge2 using explicit' '
	cd ../git &&
	git reset --hard topic_2 &&
	git pull --no-rebase -Xsubtree=git-gui2 gui topic_2 &&
	git ls-files -s >actual &&
	(
		echo "100644 $o1 0	git-gui/git-gui.sh" &&
		echo "100644 $o3 0	git-gui2/git-gui.sh" &&
		echo "100644 $o2 0	git.c"
	) >expected &&
	test_cmp expected actual
'

test_done