summaryrefslogtreecommitdiff
path: root/t/t5553-set-upstream.sh
blob: 7622981cbf25941260f5a7f21bd60f84cf8797f8 (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
#!/bin/sh

test_description='"git fetch/pull --set-upstream" basic tests.'
. ./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 master and other fetch' '
	test_commit one &&
	git push upstream master &&
	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 master other &&
	git checkout master &&
	git fetch --set-upstream upstream &&
	check_config_missing master &&
	check_config_missing other
'

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

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

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

test_expect_success 'fetch --set-upstream http://nosuchdomain.example.com fails with invalid url' '
	# master 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 master 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 master "$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 master and other pull' '
	test_commit three &&
	git push --tags upstream master &&
	test_commit four &&
	git push upstream other
'

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

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

test_expect_success 'pull --set-upstream upstream other sets branch master' '
	clear_config master other &&
	git pull --set-upstream upstream other &&
	check_config master 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 --tags --set-upstream upstream three &&
	check_config_missing three
'

test_expect_success 'pull --set-upstream http://nosuchdomain.example.com fails with invalid url' '
	# master 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 master 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 master other &&
	git pull --set-upstream upstream HEAD &&
	check_config master upstream HEAD &&
	git checkout other &&
	git pull --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 master three &&
	git pull --set-upstream upstream master three &&
	check_config_missing master &&
	check_config_missing three
'

test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' '
	clear_config master other other2 &&
	git checkout master &&
	url="file://$PWD" &&
	git pull --set-upstream "$url" &&
	check_config master "$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 master other other2 &&
	git checkout master &&
	url="file://$PWD" &&
	git pull --set-upstream "$url" master &&
	check_config master "$url" refs/heads/master &&
	check_config_missing other &&
	check_config_missing other2
'

test_done