summaryrefslogtreecommitdiff
path: root/t/t5553-set-upstream.sh
blob: 9c12c0f8c321def9e39d0887d463b5d227d3157d (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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#!/bin/sh

test_description='"git fetch/pull --set-upstream" basic tests.'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

. ./test-lib.sh

check_config () {
	printf "%s\n" "$2" "$3" >"expect.$1" &&
	{
		git config "branch.$1.remote" && git config "branch.$1.merge"
	} >"actual.$1" &&
	test_cmp "expect.$1" "actual.$1"
}

check_config_missing () {
	test_expect_code 1 git config "branch.$1.remote" &&
	test_expect_code 1 git config "branch.$1.merge"
}

clear_config () {
	for branch in "$@"; do
		test_might_fail git config --unset-all "branch.$branch.remote"
		test_might_fail git config --unset-all "branch.$branch.merge"
	done
}

ensure_fresh_upstream () {
	rm -rf parent && git init --bare parent
}

test_expect_success 'setup bare parent fetch' '
	ensure_fresh_upstream &&
	git remote add upstream parent
'

test_expect_success 'setup commit on main and other fetch' '
	test_commit one &&
	git push upstream main &&
	git checkout -b other &&
	test_commit two &&
	git push upstream other
'

# tests for fetch --set-upstream

test_expect_success 'fetch --set-upstream does not set upstream w/o branch' '
	clear_config main other &&
	git checkout main &&
	git fetch --set-upstream upstream &&
	check_config_missing main &&
	check_config_missing other
'

test_expect_success 'fetch --set-upstream upstream main sets branch main but not other' '
	clear_config main other &&
	git fetch --set-upstream upstream main &&
	check_config main upstream refs/heads/main &&
	check_config_missing other
'

test_expect_success 'fetch --set-upstream upstream other sets branch other' '
	clear_config main other &&
	git fetch --set-upstream upstream other &&
	check_config main upstream refs/heads/other &&
	check_config_missing other
'

test_expect_success 'fetch --set-upstream main:other does not set the branch other2' '
	clear_config other2 &&
	git fetch --set-upstream upstream main:other2 &&
	check_config_missing other2
'

test_expect_success 'fetch --set-upstream http://nosuchdomain.example.com fails with invalid url' '
	# main explicitly not cleared, we check that it is not touched from previous value
	clear_config other other2 &&
	test_must_fail git fetch --set-upstream http://nosuchdomain.example.com &&
	check_config main upstream refs/heads/other &&
	check_config_missing other &&
	check_config_missing other2
'

test_expect_success 'fetch --set-upstream with valid URL sets upstream to URL' '
	clear_config other other2 &&
	url="file://$PWD" &&
	git fetch --set-upstream "$url" &&
	check_config main "$url" HEAD &&
	check_config_missing other &&
	check_config_missing other2
'

# tests for pull --set-upstream

test_expect_success 'setup bare parent pull' '
	git remote rm upstream &&
	ensure_fresh_upstream &&
	git remote add upstream parent
'

test_expect_success 'setup commit on main and other pull' '
	test_commit three &&
	git push --tags upstream main &&
	test_commit four &&
	git push upstream other
'

test_expect_success 'pull --set-upstream upstream main sets branch main but not other' '
	clear_config main other &&
	git pull --no-rebase --set-upstream upstream main &&
	check_config main upstream refs/heads/main &&
	check_config_missing other
'

test_expect_success 'pull --set-upstream main:other2 does not set the branch other2' '
	clear_config other2 &&
	git pull --no-rebase --set-upstream upstream main:other2 &&
	check_config_missing other2
'

test_expect_success 'pull --set-upstream upstream other sets branch main' '
	clear_config main other &&
	git pull --no-rebase --set-upstream upstream other &&
	check_config main upstream refs/heads/other &&
	check_config_missing other
'

test_expect_success 'pull --set-upstream upstream tag does not set the tag' '
	clear_config three &&
	git pull --no-rebase --tags --set-upstream upstream three &&
	check_config_missing three
'

test_expect_success 'pull --set-upstream http://nosuchdomain.example.com fails with invalid url' '
	# main explicitly not cleared, we check that it is not touched from previous value
	clear_config other other2 three &&
	test_must_fail git pull --set-upstream http://nosuchdomain.example.com &&
	check_config main upstream refs/heads/other &&
	check_config_missing other &&
	check_config_missing other2 &&
	check_config_missing three
'

test_expect_success 'pull --set-upstream upstream HEAD sets branch HEAD' '
	clear_config main other &&
	git pull --no-rebase --set-upstream upstream HEAD &&
	check_config main upstream HEAD &&
	git checkout other &&
	git pull --no-rebase --set-upstream upstream HEAD &&
	check_config other upstream HEAD
'

test_expect_success 'pull --set-upstream upstream with more than one branch does nothing' '
	clear_config main three &&
	git pull --no-rebase --set-upstream upstream main three &&
	check_config_missing main &&
	check_config_missing three
'

test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' '
	clear_config main other other2 &&
	git checkout main &&
	url="file://$PWD" &&
	git pull --set-upstream "$url" &&
	check_config main "$url" HEAD &&
	check_config_missing other &&
	check_config_missing other2
'

test_expect_success 'pull --set-upstream with valid URL and branch sets branch' '
	clear_config main other other2 &&
	git checkout main &&
	url="file://$PWD" &&
	git pull --set-upstream "$url" main &&
	check_config main "$url" refs/heads/main &&
	check_config_missing other &&
	check_config_missing other2
'

test_done