blob: e1e0175c125d034850fd42e293a04d5e2a46bd4b (
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
|
# Refs of upstream : main(A)
# Refs of workbench: main(A) tags/v123
# git-push : main(B) next(A)
test_expect_success "git-push ($PROTOCOL)" '
git -C workbench push origin \
$B:refs/heads/main \
HEAD:refs/heads/next \
>out 2>&1 &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
remote: # pre-receive hook
remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/next
remote: # post-receive hook
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/main
remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/next
To <URL/of/upstream.git>
<OID-A>..<OID-B> <COMMIT-B> -> main
* [new branch] HEAD -> next
EOF
test_cmp expect actual &&
test_cmp_refs -C "$upstream" <<-EOF
<COMMIT-B> refs/heads/main
<COMMIT-A> refs/heads/next
EOF
'
# Refs of upstream : main(B) next(A)
# Refs of workbench: main(A) tags/v123
# git-push --atomic: main(A) next(B)
test_expect_success "git-push --atomic ($PROTOCOL)" '
test_must_fail git -C workbench push --atomic origin \
main \
$B:refs/heads/next \
>out-$test_count 2>&1 &&
filter_out_user_friendly_and_stable_output \
-e "/^To / { p; }" \
-e "/^ ! / { p; }" \
<out-$test_count >actual &&
cat >expect <<-EOF &&
To <URL/of/upstream.git>
! [rejected] main -> main (non-fast-forward)
! [rejected] <COMMIT-B> -> next (atomic push failed)
EOF
test_cmp expect actual &&
test_cmp_refs -C "$upstream" <<-EOF
<COMMIT-B> refs/heads/main
<COMMIT-A> refs/heads/next
EOF
'
# Refs of upstream : main(B) next(A)
# Refs of workbench: main(A) tags/v123
# git-push : main(A) next(B)
test_expect_success "non-fast-forward git-push ($PROTOCOL)" '
test_must_fail git \
-C workbench \
-c advice.pushUpdateRejected=false \
push origin \
main \
$B:refs/heads/next \
>out-$test_count 2>&1 &&
make_user_friendly_and_stable_output <out-$test_count >actual &&
cat >expect <<-EOF &&
remote: # pre-receive hook
remote: pre-receive< <COMMIT-A> <COMMIT-B> refs/heads/next
remote: # post-receive hook
remote: post-receive< <COMMIT-A> <COMMIT-B> refs/heads/next
To <URL/of/upstream.git>
<OID-A>..<OID-B> <COMMIT-B> -> next
! [rejected] main -> main (non-fast-forward)
EOF
test_cmp expect actual &&
test_cmp_refs -C "$upstream" <<-EOF
<COMMIT-B> refs/heads/main
<COMMIT-B> refs/heads/next
EOF
'
# Refs of upstream : main(B) next(B)
# Refs of workbench: main(A) tags/v123
# git-push -f : main(A) NULL tags/v123 refs/review/main/topic(A) a/b/c(A)
test_expect_success "git-push -f ($PROTOCOL)" '
git -C workbench push -f origin \
refs/tags/v123 \
:refs/heads/next \
main \
main:refs/review/main/topic \
HEAD:refs/heads/a/b/c \
>out 2>&1 &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
remote: # pre-receive hook
remote: pre-receive< <COMMIT-B> <COMMIT-A> refs/heads/main
remote: pre-receive< <COMMIT-B> <ZERO-OID> refs/heads/next
remote: pre-receive< <ZERO-OID> <TAG-v123> refs/tags/v123
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/review/main/topic
remote: pre-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c
remote: # post-receive hook
remote: post-receive< <COMMIT-B> <COMMIT-A> refs/heads/main
remote: post-receive< <COMMIT-B> <ZERO-OID> refs/heads/next
remote: post-receive< <ZERO-OID> <TAG-v123> refs/tags/v123
remote: post-receive< <ZERO-OID> <COMMIT-A> refs/review/main/topic
remote: post-receive< <ZERO-OID> <COMMIT-A> refs/heads/a/b/c
To <URL/of/upstream.git>
+ <OID-B>...<OID-A> main -> main (forced update)
- [deleted] next
* [new tag] v123 -> v123
* [new reference] main -> refs/review/main/topic
* [new branch] HEAD -> a/b/c
EOF
test_cmp expect actual &&
test_cmp_refs -C "$upstream" <<-EOF
<COMMIT-A> refs/heads/a/b/c
<COMMIT-A> refs/heads/main
<COMMIT-A> refs/review/main/topic
<TAG-v123> refs/tags/v123
EOF
'
# Refs of upstream : main(A) tags/v123 refs/review/main/topic(A) a/b/c(A)
# Refs of workbench: main(A) tags/v123
test_expect_success "cleanup ($PROTOCOL)" '
(
cd "$upstream" &&
git update-ref -d refs/review/main/topic &&
git update-ref -d refs/tags/v123 &&
git update-ref -d refs/heads/a/b/c
)
'
|