Git fork
1#!/bin/sh
2
3test_description='"git fetch/pull --set-upstream" basic tests.'
4GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
5export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
6
7. ./test-lib.sh
8
9check_config () {
10 printf "%s\n" "$2" "$3" >"expect.$1" &&
11 {
12 git config "branch.$1.remote" && git config "branch.$1.merge"
13 } >"actual.$1" &&
14 test_cmp "expect.$1" "actual.$1"
15}
16
17check_config_missing () {
18 test_expect_code 1 git config "branch.$1.remote" &&
19 test_expect_code 1 git config "branch.$1.merge"
20}
21
22clear_config () {
23 for branch in "$@"; do
24 test_might_fail git config --unset-all "branch.$branch.remote"
25 test_might_fail git config --unset-all "branch.$branch.merge"
26 done
27}
28
29ensure_fresh_upstream () {
30 rm -rf parent && git init --bare parent
31}
32
33test_expect_success 'setup bare parent fetch' '
34 ensure_fresh_upstream &&
35 git remote add upstream parent
36'
37
38test_expect_success 'setup commit on main and other fetch' '
39 test_commit one &&
40 git push upstream main &&
41 git checkout -b other &&
42 test_commit two &&
43 git push upstream other
44'
45
46# tests for fetch --set-upstream
47
48test_expect_success 'fetch --set-upstream does not set upstream w/o branch' '
49 clear_config main other &&
50 git checkout main &&
51 git fetch --set-upstream upstream &&
52 check_config_missing main &&
53 check_config_missing other
54'
55
56test_expect_success 'fetch --set-upstream upstream main sets branch main but not other' '
57 clear_config main other &&
58 git fetch --set-upstream upstream main &&
59 check_config main upstream refs/heads/main &&
60 check_config_missing other
61'
62
63test_expect_success 'fetch --set-upstream upstream other sets branch other' '
64 clear_config main other &&
65 git fetch --set-upstream upstream other &&
66 check_config main upstream refs/heads/other &&
67 check_config_missing other
68'
69
70test_expect_success 'fetch --set-upstream main:other does not set the branch other2' '
71 clear_config other2 &&
72 git fetch --set-upstream upstream main:other2 &&
73 check_config_missing other2
74'
75
76test_expect_success 'fetch --set-upstream ./does-not-exist fails with invalid url' '
77 # main explicitly not cleared, we check that it is not touched from previous value
78 clear_config other other2 &&
79 test_must_fail git fetch --set-upstream ./does-not-exist &&
80 check_config main upstream refs/heads/other &&
81 check_config_missing other &&
82 check_config_missing other2
83'
84
85test_expect_success 'fetch --set-upstream with valid URL sets upstream to URL' '
86 clear_config other other2 &&
87 url="file://$PWD" &&
88 git fetch --set-upstream "$url" &&
89 check_config main "$url" HEAD &&
90 check_config_missing other &&
91 check_config_missing other2
92'
93
94test_expect_success 'fetch --set-upstream with a detached HEAD' '
95 git checkout HEAD^0 &&
96 test_when_finished "git checkout -" &&
97 cat >expect <<-\EOF &&
98 warning: could not set upstream of HEAD to '"'"'main'"'"' from '"'"'upstream'"'"' when it does not point to any branch.
99 EOF
100 git fetch --set-upstream upstream main 2>actual.raw &&
101 grep ^warning: actual.raw >actual &&
102 test_cmp expect actual
103'
104
105# tests for pull --set-upstream
106
107test_expect_success 'setup bare parent pull' '
108 git remote rm upstream &&
109 ensure_fresh_upstream &&
110 git remote add upstream parent
111'
112
113test_expect_success 'setup commit on main and other pull' '
114 test_commit three &&
115 git push --tags upstream main &&
116 test_commit four &&
117 git push upstream other
118'
119
120test_expect_success 'pull --set-upstream upstream main sets branch main but not other' '
121 clear_config main other &&
122 git pull --no-rebase --set-upstream upstream main &&
123 check_config main upstream refs/heads/main &&
124 check_config_missing other
125'
126
127test_expect_success 'pull --set-upstream main:other2 does not set the branch other2' '
128 clear_config other2 &&
129 git pull --no-rebase --set-upstream upstream main:other2 &&
130 check_config_missing other2
131'
132
133test_expect_success 'pull --set-upstream upstream other sets branch main' '
134 clear_config main other &&
135 git pull --no-rebase --set-upstream upstream other &&
136 check_config main upstream refs/heads/other &&
137 check_config_missing other
138'
139
140test_expect_success 'pull --set-upstream upstream tag does not set the tag' '
141 clear_config three &&
142 git pull --no-rebase --tags --set-upstream upstream three &&
143 check_config_missing three
144'
145
146test_expect_success 'pull --set-upstream ./does-not-exist fails with invalid url' '
147 # main explicitly not cleared, we check that it is not touched from previous value
148 clear_config other other2 three &&
149 test_must_fail git pull --set-upstream ./does-not-exist &&
150 check_config main upstream refs/heads/other &&
151 check_config_missing other &&
152 check_config_missing other2 &&
153 check_config_missing three
154'
155
156test_expect_success 'pull --set-upstream upstream HEAD sets branch HEAD' '
157 clear_config main other &&
158 git pull --no-rebase --set-upstream upstream HEAD &&
159 check_config main upstream HEAD &&
160 git checkout other &&
161 git pull --no-rebase --set-upstream upstream HEAD &&
162 check_config other upstream HEAD
163'
164
165test_expect_success 'pull --set-upstream upstream with more than one branch does nothing' '
166 clear_config main three &&
167 git pull --no-rebase --set-upstream upstream main three &&
168 check_config_missing main &&
169 check_config_missing three
170'
171
172test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' '
173 clear_config main other other2 &&
174 git checkout main &&
175 url="file://$PWD" &&
176 git pull --set-upstream "$url" &&
177 check_config main "$url" HEAD &&
178 check_config_missing other &&
179 check_config_missing other2
180'
181
182test_expect_success 'pull --set-upstream with valid URL and branch sets branch' '
183 clear_config main other other2 &&
184 git checkout main &&
185 url="file://$PWD" &&
186 git pull --set-upstream "$url" main &&
187 check_config main "$url" refs/heads/main &&
188 check_config_missing other &&
189 check_config_missing other2
190'
191
192test_expect_success 'pull --set-upstream with a detached HEAD' '
193 git checkout HEAD^0 &&
194 test_when_finished "git checkout -" &&
195 cat >expect <<-\EOF &&
196 warning: could not set upstream of HEAD to '"'"'main'"'"' from '"'"'upstream'"'"' when it does not point to any branch.
197 EOF
198 git pull --no-rebase --set-upstream upstream main 2>actual.raw &&
199 grep ^warning: actual.raw >actual &&
200 test_cmp expect actual
201'
202
203test_done