comparison tests/test-bundle2-multiple-changegroups.t @ 22961:a67ea4959ef5

bundle2: merge return values when bundle contains multiple changegroups A bundle2 may contain multiple parts adding changegroups, in which case there are multiple operation records for changegroups, each with its own return value. Those multiple return values are aggregated in a single cgresult value for the whole operation. As can be seen in the associated test case, the situation with hooks is not really the best, but without deeper thoughts and changes, we can't do much better. Hopefully, things will be improved before bundle2 is enabled by default. In the meanwhile, multiple changegroups is not expected to be in widespread use, and even less expected to be used for pushes. Also, not many clients cloning or pulling bundle2 with multiple changesets are not expected to have changegroup hooks anyways.
author Mike Hommey <mh@glandium.org>
date Thu, 16 Oct 2014 16:03:04 +0900
parents
children 01e98eba3bc1
comparison
equal deleted inserted replaced
22960:7c13c9404c2c 22961:a67ea4959ef5
1 Create an extension to test bundle2 with multiple changegroups
2
3 $ cat > bundle2.py <<EOF
4 > """
5 > """
6 > from mercurial import changegroup, exchange
7 >
8 > def _getbundlechangegrouppart(bundler, repo, source, bundlecaps=None,
9 > b2caps=None, heads=None, common=None,
10 > **kwargs):
11 > # Create two changegroups given the common changesets and heads for the
12 > # changegroup part we are being requested. Use the parent of each head
13 > # in 'heads' as intermediate heads for the first changegroup.
14 > intermediates = [repo[r].p1().node() for r in heads]
15 > cg = changegroup.getchangegroup(repo, source, heads=intermediates,
16 > common=common, bundlecaps=bundlecaps)
17 > bundler.newpart('b2x:output', data='changegroup1')
18 > bundler.newpart('b2x:changegroup', data=cg.getchunks())
19 > cg = changegroup.getchangegroup(repo, source, heads=heads,
20 > common=common + intermediates,
21 > bundlecaps=bundlecaps)
22 > bundler.newpart('b2x:output', data='changegroup2')
23 > bundler.newpart('b2x:changegroup', data=cg.getchunks())
24 >
25 > def _pull(repo, *args, **kwargs):
26 > pullop = _orig_pull(repo, *args, **kwargs)
27 > repo.ui.write('pullop.cgresult is %d\n' % pullop.cgresult)
28 > return pullop
29 >
30 > _orig_pull = exchange.pull
31 > exchange.pull = _pull
32 > exchange.getbundle2partsmapping['changegroup'] = _getbundlechangegrouppart
33 > EOF
34
35 $ cat >> $HGRCPATH << EOF
36 > [experimental]
37 > bundle2-exp=True
38 > [ui]
39 > logtemplate={rev}:{node|short} {phase} {author} {bookmarks} {desc|firstline}
40 > EOF
41
42 Start with a simple repository with a single commit
43
44 $ hg init repo
45 $ cd repo
46 $ cat > .hg/hgrc << EOF
47 > [extensions]
48 > bundle2=$TESTTMP/bundle2.py
49 > EOF
50
51 $ echo A > A
52 $ hg commit -A -m A -q
53 $ cd ..
54
55 Clone
56
57 $ hg clone -q repo clone
58
59 Add two linear commits
60
61 $ cd repo
62 $ echo B > B
63 $ hg commit -A -m B -q
64 $ echo C > C
65 $ hg commit -A -m C -q
66
67 $ cd ../clone
68 $ cat >> .hg/hgrc <<EOF
69 > [hooks]
70 > pretxnchangegroup = sh -c "python \"$TESTDIR/printenv.py\" pretxnchangegroup"
71 > changegroup = sh -c "python \"$TESTDIR/printenv.py\" changegroup"
72 > incoming = sh -c "python \"$TESTDIR/printenv.py\" incoming"
73 > EOF
74
75 Pull the new commits in the clone
76
77 $ hg pull
78 pulling from $TESTTMP/repo (glob)
79 searching for changes
80 remote: changegroup1
81 adding changesets
82 adding manifests
83 adding file changes
84 added 1 changesets with 1 changes to 1 files
85 pretxnchangegroup hook: HG_NODE=27547f69f25460a52fff66ad004e58da7ad3fb56 HG_PENDING=$TESTTMP/clone HG_SOURCE=bundle2 HG_URL=bundle2
86 remote: changegroup2
87 adding changesets
88 adding manifests
89 adding file changes
90 added 1 changesets with 1 changes to 1 files
91 pretxnchangegroup hook: HG_NODE=f838bfaca5c7226600ebcfd84f3c3c13a28d3757 HG_PENDING=$TESTTMP/clone HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
92 changegroup hook: HG_NODE=27547f69f25460a52fff66ad004e58da7ad3fb56 HG_SOURCE=bundle2 HG_URL=bundle2
93 incoming hook: HG_NODE=27547f69f25460a52fff66ad004e58da7ad3fb56 HG_SOURCE=bundle2 HG_URL=bundle2
94 changegroup hook: HG_NODE=f838bfaca5c7226600ebcfd84f3c3c13a28d3757 HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
95 incoming hook: HG_NODE=f838bfaca5c7226600ebcfd84f3c3c13a28d3757 HG_SOURCE=bundle2 HG_URL=bundle2
96 pullop.cgresult is 1
97 (run 'hg update' to get a working copy)
98 $ hg update
99 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
100 $ hg log -G
101 @ 2:f838bfaca5c7 public test C
102 |
103 o 1:27547f69f254 public test B
104 |
105 o 0:4a2df7238c3b public test A
106
107 Add more changesets with multiple heads to the original repository
108
109 $ cd ../repo
110 $ echo D > D
111 $ hg commit -A -m D -q
112 $ hg up -r 1
113 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
114 $ echo E > E
115 $ hg commit -A -m E -q
116 $ echo F > F
117 $ hg commit -A -m F -q
118 $ hg up -r 1
119 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
120 $ echo G > G
121 $ hg commit -A -m G -q
122 $ hg up -r 3
123 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
124 $ echo H > H
125 $ hg commit -A -m H -q
126 $ hg log -G
127 @ 7:5cd59d311f65 draft test H
128 |
129 | o 6:1d14c3ce6ac0 draft test G
130 | |
131 | | o 5:7f219660301f draft test F
132 | | |
133 | | o 4:8a5212ebc852 draft test E
134 | |/
135 o | 3:b3325c91a4d9 draft test D
136 | |
137 o | 2:f838bfaca5c7 draft test C
138 |/
139 o 1:27547f69f254 draft test B
140 |
141 o 0:4a2df7238c3b draft test A
142
143 New heads are reported during transfer and properly accounted for in
144 pullop.cgresult
145
146 $ cd ../clone
147 $ hg pull
148 pulling from $TESTTMP/repo (glob)
149 searching for changes
150 remote: changegroup1
151 adding changesets
152 adding manifests
153 adding file changes
154 added 2 changesets with 2 changes to 2 files (+1 heads)
155 pretxnchangegroup hook: HG_NODE=b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e HG_PENDING=$TESTTMP/clone HG_SOURCE=bundle2 HG_URL=bundle2
156 remote: changegroup2
157 adding changesets
158 adding manifests
159 adding file changes
160 added 3 changesets with 3 changes to 3 files (+1 heads)
161 pretxnchangegroup hook: HG_NODE=7f219660301fe4c8a116f714df5e769695cc2b46 HG_PENDING=$TESTTMP/clone HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
162 changegroup hook: HG_NODE=b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e HG_SOURCE=bundle2 HG_URL=bundle2
163 incoming hook: HG_NODE=b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e HG_SOURCE=bundle2 HG_URL=bundle2
164 incoming hook: HG_NODE=8a5212ebc8527f9fb821601504794e3eb11a1ed3 HG_SOURCE=bundle2 HG_URL=bundle2
165 changegroup hook: HG_NODE=7f219660301fe4c8a116f714df5e769695cc2b46 HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
166 incoming hook: HG_NODE=7f219660301fe4c8a116f714df5e769695cc2b46 HG_SOURCE=bundle2 HG_URL=bundle2
167 incoming hook: HG_NODE=1d14c3ce6ac0582d2809220d33e8cd7a696e0156 HG_SOURCE=bundle2 HG_URL=bundle2
168 incoming hook: HG_NODE=5cd59d311f6508b8e0ed28a266756c859419c9f1 HG_SOURCE=bundle2 HG_URL=bundle2
169 pullop.cgresult is 3
170 (run 'hg heads' to see heads, 'hg merge' to merge)
171 $ hg log -G
172 o 7:5cd59d311f65 public test H
173 |
174 | o 6:1d14c3ce6ac0 public test G
175 | |
176 | | o 5:7f219660301f public test F
177 | | |
178 | | o 4:8a5212ebc852 public test E
179 | |/
180 o | 3:b3325c91a4d9 public test D
181 | |
182 @ | 2:f838bfaca5c7 public test C
183 |/
184 o 1:27547f69f254 public test B
185 |
186 o 0:4a2df7238c3b public test A
187
188 Removing a head from the original repository by merging it
189
190 $ cd ../repo
191 $ hg merge -r 6 -q
192 $ hg commit -m Merge
193 $ echo I > I
194 $ hg commit -A -m H -q
195 $ hg log -G
196 @ 9:9d18e5bd9ab0 draft test H
197 |
198 o 8:71bd7b46de72 draft test Merge
199 |\
200 | o 7:5cd59d311f65 draft test H
201 | |
202 o | 6:1d14c3ce6ac0 draft test G
203 | |
204 | | o 5:7f219660301f draft test F
205 | | |
206 +---o 4:8a5212ebc852 draft test E
207 | |
208 | o 3:b3325c91a4d9 draft test D
209 | |
210 | o 2:f838bfaca5c7 draft test C
211 |/
212 o 1:27547f69f254 draft test B
213 |
214 o 0:4a2df7238c3b draft test A
215
216 Removed heads are reported during transfer and properly accounted for in
217 pullop.cgresult
218
219 $ cd ../clone
220 $ hg pull
221 pulling from $TESTTMP/repo (glob)
222 searching for changes
223 remote: changegroup1
224 adding changesets
225 adding manifests
226 adding file changes
227 added 1 changesets with 0 changes to 0 files (-1 heads)
228 pretxnchangegroup hook: HG_NODE=71bd7b46de72e69a32455bf88d04757d542e6cf4 HG_PENDING=$TESTTMP/clone HG_SOURCE=bundle2 HG_URL=bundle2
229 remote: changegroup2
230 adding changesets
231 adding manifests
232 adding file changes
233 added 1 changesets with 1 changes to 1 files
234 pretxnchangegroup hook: HG_NODE=9d18e5bd9ab09337802595d49f1dad0c98df4d84 HG_PENDING=$TESTTMP/clone HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
235 changegroup hook: HG_NODE=71bd7b46de72e69a32455bf88d04757d542e6cf4 HG_SOURCE=bundle2 HG_URL=bundle2
236 incoming hook: HG_NODE=71bd7b46de72e69a32455bf88d04757d542e6cf4 HG_SOURCE=bundle2 HG_URL=bundle2
237 changegroup hook: HG_NODE=9d18e5bd9ab09337802595d49f1dad0c98df4d84 HG_PHASES_MOVED=1 HG_SOURCE=bundle2 HG_URL=bundle2
238 incoming hook: HG_NODE=9d18e5bd9ab09337802595d49f1dad0c98df4d84 HG_SOURCE=bundle2 HG_URL=bundle2
239 pullop.cgresult is -2
240 (run 'hg update' to get a working copy)
241 $ hg log -G
242 o 9:9d18e5bd9ab0 public test H
243 |
244 o 8:71bd7b46de72 public test Merge
245 |\
246 | o 7:5cd59d311f65 public test H
247 | |
248 o | 6:1d14c3ce6ac0 public test G
249 | |
250 | | o 5:7f219660301f public test F
251 | | |
252 +---o 4:8a5212ebc852 public test E
253 | |
254 | o 3:b3325c91a4d9 public test D
255 | |
256 | @ 2:f838bfaca5c7 public test C
257 |/
258 o 1:27547f69f254 public test B
259 |
260 o 0:4a2df7238c3b public test A
261