]>
Commit | Line | Data |
---|---|---|
135dadef JH |
1 | #!/bin/sh |
2 | ||
3 | test_description='check various push.default settings' | |
3ac8f630 | 4 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
334afbc7 JS |
5 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
6 | ||
135dadef JH |
7 | . ./test-lib.sh |
8 | ||
9 | test_expect_success 'setup bare remotes' ' | |
10 | git init --bare repo1 && | |
11 | git remote add parent1 repo1 && | |
12 | git init --bare repo2 && | |
13 | git remote add parent2 repo2 && | |
14 | test_commit one && | |
15 | git push parent1 HEAD && | |
16 | git push parent2 HEAD | |
17 | ' | |
18 | ||
321e75c5 MM |
19 | # $1 = local revision |
20 | # $2 = remote revision (tested to be equal to the local one) | |
396243fa | 21 | # $3 = [optional] repo to check for actual output (repo1 by default) |
321e75c5 MM |
22 | check_pushed_commit () { |
23 | git log -1 --format='%h %s' "$1" >expect && | |
396243fa | 24 | git --git-dir="${3:-repo1}" log -1 --format='%h %s' "$2" >actual && |
321e75c5 MM |
25 | test_cmp expect actual |
26 | } | |
27 | ||
28 | # $1 = push.default value | |
29 | # $2 = expected target branch for the push | |
396243fa | 30 | # $3 = [optional] repo to check for actual output (repo1 by default) |
321e75c5 | 31 | test_push_success () { |
ce026cc7 | 32 | git ${1:+-c} ${1:+push.default="$1"} push && |
396243fa | 33 | check_pushed_commit HEAD "$2" "$3" |
321e75c5 MM |
34 | } |
35 | ||
36 | # $1 = push.default value | |
37 | # check that push fails and does not modify any remote branch | |
38 | test_push_failure () { | |
39 | git --git-dir=repo1 log --no-walk --format='%h %s' --all >expect && | |
ce026cc7 | 40 | test_must_fail git ${1:+-c} ${1:+push.default="$1"} push && |
321e75c5 MM |
41 | git --git-dir=repo1 log --no-walk --format='%h %s' --all >actual && |
42 | test_cmp expect actual | |
43 | } | |
44 | ||
6e1696b7 RR |
45 | # $1 = success or failure |
46 | # $2 = push.default value | |
3ac8f630 | 47 | # $3 = branch to check for actual output (main or foo) |
6e1696b7 RR |
48 | # $4 = [optional] switch to triangular workflow |
49 | test_pushdefault_workflow () { | |
50 | workflow=central | |
51 | pushdefault=parent1 | |
52 | if test -n "${4-}"; then | |
53 | workflow=triangular | |
54 | pushdefault=parent2 | |
55 | fi | |
56 | test_expect_success "push.default = $2 $1 in $workflow workflows" " | |
3ac8f630 JS |
57 | test_config branch.main.remote parent1 && |
58 | test_config branch.main.merge refs/heads/foo && | |
6e1696b7 RR |
59 | test_config remote.pushdefault $pushdefault && |
60 | test_commit commit-for-$2${4+-triangular} && | |
61 | test_push_$1 $2 $3 ${4+repo2} | |
62 | " | |
63 | } | |
64 | ||
135dadef | 65 | test_expect_success '"upstream" pushes to configured upstream' ' |
3ac8f630 JS |
66 | git checkout main && |
67 | test_config branch.main.remote parent1 && | |
68 | test_config branch.main.merge refs/heads/foo && | |
135dadef | 69 | test_commit two && |
321e75c5 | 70 | test_push_success upstream foo |
135dadef JH |
71 | ' |
72 | ||
73 | test_expect_success '"upstream" does not push on unconfigured remote' ' | |
3ac8f630 JS |
74 | git checkout main && |
75 | test_unconfig branch.main.remote && | |
135dadef | 76 | test_commit three && |
321e75c5 | 77 | test_push_failure upstream |
135dadef JH |
78 | ' |
79 | ||
80 | test_expect_success '"upstream" does not push on unconfigured branch' ' | |
3ac8f630 JS |
81 | git checkout main && |
82 | test_config branch.main.remote parent1 && | |
83 | test_unconfig branch.main.merge && | |
135dadef | 84 | test_commit four && |
321e75c5 | 85 | test_push_failure upstream |
135dadef JH |
86 | ' |
87 | ||
88 | test_expect_success '"upstream" does not push when remotes do not match' ' | |
3ac8f630 JS |
89 | git checkout main && |
90 | test_config branch.main.remote parent1 && | |
91 | test_config branch.main.merge refs/heads/foo && | |
135dadef JH |
92 | test_config push.default upstream && |
93 | test_commit five && | |
94 | test_must_fail git push parent2 | |
95 | ' | |
96 | ||
b55e6775 MM |
97 | test_expect_success 'push from/to new branch with upstream, matching and simple' ' |
98 | git checkout -b new-branch && | |
99 | test_push_failure simple && | |
100 | test_push_failure matching && | |
101 | test_push_failure upstream | |
102 | ' | |
103 | ||
4d04658d JS |
104 | test_expect_success '"matching" fails if none match' ' |
105 | git init --bare empty && | |
106 | test_must_fail git push empty : 2>actual && | |
107 | test_i18ngrep "Perhaps you should specify a branch" actual | |
108 | ' | |
109 | ||
b284495e DK |
110 | test_expect_success 'push ambiguously named branch with upstream, matching and simple' ' |
111 | git checkout -b ambiguous && | |
112 | test_config branch.ambiguous.remote parent1 && | |
113 | test_config branch.ambiguous.merge refs/heads/ambiguous && | |
114 | git tag ambiguous && | |
115 | test_push_success simple ambiguous && | |
116 | test_push_success matching ambiguous && | |
117 | test_push_success upstream ambiguous | |
118 | ' | |
119 | ||
b55e6775 MM |
120 | test_expect_success 'push from/to new branch with current creates remote branch' ' |
121 | test_config branch.new-branch.remote repo1 && | |
122 | git checkout new-branch && | |
123 | test_push_success current new-branch | |
124 | ' | |
125 | ||
126 | test_expect_success 'push to existing branch, with no upstream configured' ' | |
3ac8f630 JS |
127 | test_config branch.main.remote repo1 && |
128 | git checkout main && | |
b55e6775 MM |
129 | test_push_failure simple && |
130 | test_push_failure upstream | |
131 | ' | |
132 | ||
133 | test_expect_success 'push to existing branch, upstream configured with same name' ' | |
3ac8f630 JS |
134 | test_config branch.main.remote repo1 && |
135 | test_config branch.main.merge refs/heads/main && | |
136 | git checkout main && | |
b55e6775 | 137 | test_commit six && |
3ac8f630 | 138 | test_push_success upstream main && |
b55e6775 | 139 | test_commit seven && |
3ac8f630 | 140 | test_push_success simple main |
b55e6775 MM |
141 | ' |
142 | ||
143 | test_expect_success 'push to existing branch, upstream configured with different name' ' | |
3ac8f630 JS |
144 | test_config branch.main.remote repo1 && |
145 | test_config branch.main.merge refs/heads/other-name && | |
146 | git checkout main && | |
b55e6775 MM |
147 | test_commit eight && |
148 | test_push_success upstream other-name && | |
149 | test_commit nine && | |
150 | test_push_failure simple && | |
151 | git --git-dir=repo1 log -1 --format="%h %s" "other-name" >expect-other-name && | |
3ac8f630 | 152 | test_push_success current main && |
b55e6775 MM |
153 | git --git-dir=repo1 log -1 --format="%h %s" "other-name" >actual-other-name && |
154 | test_cmp expect-other-name actual-other-name | |
155 | ' | |
156 | ||
3ac8f630 | 157 | # We are on 'main', which integrates with 'foo' from parent1 |
6e1696b7 RR |
158 | # remote (set in test_pushdefault_workflow helper). Push to |
159 | # parent1 in centralized, and push to parent2 in triangular workflow. | |
3ac8f630 JS |
160 | # The parent1 repository has 'main' and 'foo' branches, while |
161 | # the parent2 repository has only 'main' branch. | |
6e1696b7 RR |
162 | # |
163 | # test_pushdefault_workflow() arguments: | |
164 | # $1 = success or failure | |
165 | # $2 = push.default value | |
3ac8f630 | 166 | # $3 = branch to check for actual output (main or foo) |
6e1696b7 RR |
167 | # $4 = [optional] switch to triangular workflow |
168 | ||
3ac8f630 JS |
169 | # update parent1's main (which is not our upstream) |
170 | test_pushdefault_workflow success current main | |
6e1696b7 RR |
171 | |
172 | # update parent1's foo (which is our upstream) | |
173 | test_pushdefault_workflow success upstream foo | |
174 | ||
7a40cf15 | 175 | # upstream is foo which is not the name of the current branch |
3ac8f630 | 176 | test_pushdefault_workflow failure simple main |
6e1696b7 | 177 | |
3ac8f630 JS |
178 | # main and foo are updated |
179 | test_pushdefault_workflow success matching main | |
6e1696b7 | 180 | |
3ac8f630 JS |
181 | # main is updated |
182 | test_pushdefault_workflow success current main triangular | |
6e1696b7 RR |
183 | |
184 | # upstream mode cannot be used in triangular | |
185 | test_pushdefault_workflow failure upstream foo triangular | |
186 | ||
187 | # in triangular, 'simple' works as 'current' and update the branch | |
188 | # with the same name. | |
3ac8f630 | 189 | test_pushdefault_workflow success simple main triangular |
6e1696b7 | 190 | |
3ac8f630 JS |
191 | # main is updated (parent2 does not have foo) |
192 | test_pushdefault_workflow success matching main triangular | |
6e1696b7 | 193 | |
00a6fa07 JK |
194 | # default tests, when no push-default is specified. This |
195 | # should behave the same as "simple" in non-triangular | |
196 | # settings, and as "current" otherwise. | |
197 | ||
198 | test_expect_success 'default behavior allows "simple" push' ' | |
3ac8f630 JS |
199 | test_config branch.main.remote parent1 && |
200 | test_config branch.main.merge refs/heads/main && | |
00a6fa07 | 201 | test_config remote.pushdefault parent1 && |
3ac8f630 JS |
202 | test_commit default-main-main && |
203 | test_push_success "" main | |
00a6fa07 JK |
204 | ' |
205 | ||
206 | test_expect_success 'default behavior rejects non-simple push' ' | |
3ac8f630 JS |
207 | test_config branch.main.remote parent1 && |
208 | test_config branch.main.merge refs/heads/foo && | |
00a6fa07 | 209 | test_config remote.pushdefault parent1 && |
3ac8f630 | 210 | test_commit default-main-foo && |
00a6fa07 JK |
211 | test_push_failure "" |
212 | ' | |
213 | ||
214 | test_expect_success 'default triangular behavior acts like "current"' ' | |
3ac8f630 JS |
215 | test_config branch.main.remote parent1 && |
216 | test_config branch.main.merge refs/heads/foo && | |
00a6fa07 JK |
217 | test_config remote.pushdefault parent2 && |
218 | test_commit default-triangular && | |
3ac8f630 | 219 | test_push_success "" main repo2 |
00a6fa07 JK |
220 | ' |
221 | ||
135dadef | 222 | test_done |