##// END OF EJS Templates
test-bundle2: add missing os import
Matt Mackall -
r21964:ef555e45 stable
parent child Browse files
Show More
@@ -1,1107 +1,1107 b''
1
1
2 Create an extension to test bundle2 API
2 Create an extension to test bundle2 API
3
3
4 $ cat > bundle2.py << EOF
4 $ cat > bundle2.py << EOF
5 > """A small extension to test bundle2 implementation
5 > """A small extension to test bundle2 implementation
6 >
6 >
7 > Current bundle2 implementation is far too limited to be used in any core
7 > Current bundle2 implementation is far too limited to be used in any core
8 > code. We still need to be able to test it while it grow up.
8 > code. We still need to be able to test it while it grow up.
9 > """
9 > """
10 >
10 >
11 > import sys
11 > import sys, os
12 > from mercurial import cmdutil
12 > from mercurial import cmdutil
13 > from mercurial import util
13 > from mercurial import util
14 > from mercurial import bundle2
14 > from mercurial import bundle2
15 > from mercurial import scmutil
15 > from mercurial import scmutil
16 > from mercurial import discovery
16 > from mercurial import discovery
17 > from mercurial import changegroup
17 > from mercurial import changegroup
18 > from mercurial import error
18 > from mercurial import error
19 >
19 >
20 > try:
20 > try:
21 > import msvcrt
21 > import msvcrt
22 > msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
22 > msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
23 > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
23 > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
24 > msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
24 > msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
25 > except ImportError:
25 > except ImportError:
26 > pass
26 > pass
27 >
27 >
28 > cmdtable = {}
28 > cmdtable = {}
29 > command = cmdutil.command(cmdtable)
29 > command = cmdutil.command(cmdtable)
30 >
30 >
31 > ELEPHANTSSONG = """Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
31 > ELEPHANTSSONG = """Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
32 > Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
32 > Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
33 > Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko."""
33 > Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko."""
34 > assert len(ELEPHANTSSONG) == 178 # future test say 178 bytes, trust it.
34 > assert len(ELEPHANTSSONG) == 178 # future test say 178 bytes, trust it.
35 >
35 >
36 > @bundle2.parthandler('test:song')
36 > @bundle2.parthandler('test:song')
37 > def songhandler(op, part):
37 > def songhandler(op, part):
38 > """handle a "test:song" bundle2 part, printing the lyrics on stdin"""
38 > """handle a "test:song" bundle2 part, printing the lyrics on stdin"""
39 > op.ui.write('The choir starts singing:\n')
39 > op.ui.write('The choir starts singing:\n')
40 > verses = 0
40 > verses = 0
41 > for line in part.read().split('\n'):
41 > for line in part.read().split('\n'):
42 > op.ui.write(' %s\n' % line)
42 > op.ui.write(' %s\n' % line)
43 > verses += 1
43 > verses += 1
44 > op.records.add('song', {'verses': verses})
44 > op.records.add('song', {'verses': verses})
45 >
45 >
46 > @bundle2.parthandler('test:ping')
46 > @bundle2.parthandler('test:ping')
47 > def pinghandler(op, part):
47 > def pinghandler(op, part):
48 > op.ui.write('received ping request (id %i)\n' % part.id)
48 > op.ui.write('received ping request (id %i)\n' % part.id)
49 > if op.reply is not None and 'ping-pong' in op.reply.capabilities:
49 > if op.reply is not None and 'ping-pong' in op.reply.capabilities:
50 > op.ui.write_err('replying to ping request (id %i)\n' % part.id)
50 > op.ui.write_err('replying to ping request (id %i)\n' % part.id)
51 > op.reply.newpart('test:pong', [('in-reply-to', str(part.id))])
51 > op.reply.newpart('test:pong', [('in-reply-to', str(part.id))])
52 >
52 >
53 > @bundle2.parthandler('test:debugreply')
53 > @bundle2.parthandler('test:debugreply')
54 > def debugreply(op, part):
54 > def debugreply(op, part):
55 > """print data about the capacity of the bundle reply"""
55 > """print data about the capacity of the bundle reply"""
56 > if op.reply is None:
56 > if op.reply is None:
57 > op.ui.write('debugreply: no reply\n')
57 > op.ui.write('debugreply: no reply\n')
58 > else:
58 > else:
59 > op.ui.write('debugreply: capabilities:\n')
59 > op.ui.write('debugreply: capabilities:\n')
60 > for cap in sorted(op.reply.capabilities):
60 > for cap in sorted(op.reply.capabilities):
61 > op.ui.write('debugreply: %r\n' % cap)
61 > op.ui.write('debugreply: %r\n' % cap)
62 > for val in op.reply.capabilities[cap]:
62 > for val in op.reply.capabilities[cap]:
63 > op.ui.write('debugreply: %r\n' % val)
63 > op.ui.write('debugreply: %r\n' % val)
64 >
64 >
65 > @command('bundle2',
65 > @command('bundle2',
66 > [('', 'param', [], 'stream level parameter'),
66 > [('', 'param', [], 'stream level parameter'),
67 > ('', 'unknown', False, 'include an unknown mandatory part in the bundle'),
67 > ('', 'unknown', False, 'include an unknown mandatory part in the bundle'),
68 > ('', 'unknownparams', False, 'include an unknown part parameters in the bundle'),
68 > ('', 'unknownparams', False, 'include an unknown part parameters in the bundle'),
69 > ('', 'parts', False, 'include some arbitrary parts to the bundle'),
69 > ('', 'parts', False, 'include some arbitrary parts to the bundle'),
70 > ('', 'reply', False, 'produce a reply bundle'),
70 > ('', 'reply', False, 'produce a reply bundle'),
71 > ('', 'pushrace', False, 'includes a check:head part with unknown nodes'),
71 > ('', 'pushrace', False, 'includes a check:head part with unknown nodes'),
72 > ('r', 'rev', [], 'includes those changeset in the bundle'),],
72 > ('r', 'rev', [], 'includes those changeset in the bundle'),],
73 > '[OUTPUTFILE]')
73 > '[OUTPUTFILE]')
74 > def cmdbundle2(ui, repo, path=None, **opts):
74 > def cmdbundle2(ui, repo, path=None, **opts):
75 > """write a bundle2 container on standard ouput"""
75 > """write a bundle2 container on standard ouput"""
76 > bundler = bundle2.bundle20(ui)
76 > bundler = bundle2.bundle20(ui)
77 > for p in opts['param']:
77 > for p in opts['param']:
78 > p = p.split('=', 1)
78 > p = p.split('=', 1)
79 > try:
79 > try:
80 > bundler.addparam(*p)
80 > bundler.addparam(*p)
81 > except ValueError, exc:
81 > except ValueError, exc:
82 > raise util.Abort('%s' % exc)
82 > raise util.Abort('%s' % exc)
83 >
83 >
84 > if opts['reply']:
84 > if opts['reply']:
85 > capsstring = 'ping-pong\nelephants=babar,celeste\ncity%3D%21=celeste%2Cville'
85 > capsstring = 'ping-pong\nelephants=babar,celeste\ncity%3D%21=celeste%2Cville'
86 > bundler.newpart('b2x:replycaps', data=capsstring)
86 > bundler.newpart('b2x:replycaps', data=capsstring)
87 >
87 >
88 > if opts['pushrace']:
88 > if opts['pushrace']:
89 > # also serve to test the assignement of data outside of init
89 > # also serve to test the assignement of data outside of init
90 > part = bundler.newpart('b2x:check:heads')
90 > part = bundler.newpart('b2x:check:heads')
91 > part.data = '01234567890123456789'
91 > part.data = '01234567890123456789'
92 >
92 >
93 > revs = opts['rev']
93 > revs = opts['rev']
94 > if 'rev' in opts:
94 > if 'rev' in opts:
95 > revs = scmutil.revrange(repo, opts['rev'])
95 > revs = scmutil.revrange(repo, opts['rev'])
96 > if revs:
96 > if revs:
97 > # very crude version of a changegroup part creation
97 > # very crude version of a changegroup part creation
98 > bundled = repo.revs('%ld::%ld', revs, revs)
98 > bundled = repo.revs('%ld::%ld', revs, revs)
99 > headmissing = [c.node() for c in repo.set('heads(%ld)', revs)]
99 > headmissing = [c.node() for c in repo.set('heads(%ld)', revs)]
100 > headcommon = [c.node() for c in repo.set('parents(%ld) - %ld', revs, revs)]
100 > headcommon = [c.node() for c in repo.set('parents(%ld) - %ld', revs, revs)]
101 > outgoing = discovery.outgoing(repo.changelog, headcommon, headmissing)
101 > outgoing = discovery.outgoing(repo.changelog, headcommon, headmissing)
102 > cg = changegroup.getlocalbundle(repo, 'test:bundle2', outgoing, None)
102 > cg = changegroup.getlocalbundle(repo, 'test:bundle2', outgoing, None)
103 > bundler.newpart('b2x:changegroup', data=cg.getchunks())
103 > bundler.newpart('b2x:changegroup', data=cg.getchunks())
104 >
104 >
105 > if opts['parts']:
105 > if opts['parts']:
106 > bundler.newpart('test:empty')
106 > bundler.newpart('test:empty')
107 > # add a second one to make sure we handle multiple parts
107 > # add a second one to make sure we handle multiple parts
108 > bundler.newpart('test:empty')
108 > bundler.newpart('test:empty')
109 > bundler.newpart('test:song', data=ELEPHANTSSONG)
109 > bundler.newpart('test:song', data=ELEPHANTSSONG)
110 > bundler.newpart('test:debugreply')
110 > bundler.newpart('test:debugreply')
111 > mathpart = bundler.newpart('test:math')
111 > mathpart = bundler.newpart('test:math')
112 > mathpart.addparam('pi', '3.14')
112 > mathpart.addparam('pi', '3.14')
113 > mathpart.addparam('e', '2.72')
113 > mathpart.addparam('e', '2.72')
114 > mathpart.addparam('cooking', 'raw', mandatory=False)
114 > mathpart.addparam('cooking', 'raw', mandatory=False)
115 > mathpart.data = '42'
115 > mathpart.data = '42'
116 > # advisory known part with unknown mandatory param
116 > # advisory known part with unknown mandatory param
117 > bundler.newpart('test:song', [('randomparam','')])
117 > bundler.newpart('test:song', [('randomparam','')])
118 > if opts['unknown']:
118 > if opts['unknown']:
119 > bundler.newpart('test:UNKNOWN', data='some random content')
119 > bundler.newpart('test:UNKNOWN', data='some random content')
120 > if opts['unknownparams']:
120 > if opts['unknownparams']:
121 > bundler.newpart('test:SONG', [('randomparams', '')])
121 > bundler.newpart('test:SONG', [('randomparams', '')])
122 > if opts['parts']:
122 > if opts['parts']:
123 > bundler.newpart('test:ping')
123 > bundler.newpart('test:ping')
124 >
124 >
125 > if path is None:
125 > if path is None:
126 > file = sys.stdout
126 > file = sys.stdout
127 > else:
127 > else:
128 > file = open(path, 'w')
128 > file = open(path, 'w')
129 >
129 >
130 > for chunk in bundler.getchunks():
130 > for chunk in bundler.getchunks():
131 > file.write(chunk)
131 > file.write(chunk)
132 >
132 >
133 > @command('unbundle2', [], '')
133 > @command('unbundle2', [], '')
134 > def cmdunbundle2(ui, repo, replypath=None):
134 > def cmdunbundle2(ui, repo, replypath=None):
135 > """process a bundle2 stream from stdin on the current repo"""
135 > """process a bundle2 stream from stdin on the current repo"""
136 > try:
136 > try:
137 > tr = None
137 > tr = None
138 > lock = repo.lock()
138 > lock = repo.lock()
139 > tr = repo.transaction('processbundle')
139 > tr = repo.transaction('processbundle')
140 > try:
140 > try:
141 > unbundler = bundle2.unbundle20(ui, sys.stdin)
141 > unbundler = bundle2.unbundle20(ui, sys.stdin)
142 > op = bundle2.processbundle(repo, unbundler, lambda: tr)
142 > op = bundle2.processbundle(repo, unbundler, lambda: tr)
143 > tr.close()
143 > tr.close()
144 > except error.BundleValueError, exc:
144 > except error.BundleValueError, exc:
145 > raise util.Abort('missing support for %s' % exc)
145 > raise util.Abort('missing support for %s' % exc)
146 > except error.PushRaced, exc:
146 > except error.PushRaced, exc:
147 > raise util.Abort('push race: %s' % exc)
147 > raise util.Abort('push race: %s' % exc)
148 > finally:
148 > finally:
149 > if tr is not None:
149 > if tr is not None:
150 > tr.release()
150 > tr.release()
151 > lock.release()
151 > lock.release()
152 > remains = sys.stdin.read()
152 > remains = sys.stdin.read()
153 > ui.write('%i unread bytes\n' % len(remains))
153 > ui.write('%i unread bytes\n' % len(remains))
154 > if op.records['song']:
154 > if op.records['song']:
155 > totalverses = sum(r['verses'] for r in op.records['song'])
155 > totalverses = sum(r['verses'] for r in op.records['song'])
156 > ui.write('%i total verses sung\n' % totalverses)
156 > ui.write('%i total verses sung\n' % totalverses)
157 > for rec in op.records['changegroup']:
157 > for rec in op.records['changegroup']:
158 > ui.write('addchangegroup return: %i\n' % rec['return'])
158 > ui.write('addchangegroup return: %i\n' % rec['return'])
159 > if op.reply is not None and replypath is not None:
159 > if op.reply is not None and replypath is not None:
160 > file = open(replypath, 'w')
160 > file = open(replypath, 'w')
161 > for chunk in op.reply.getchunks():
161 > for chunk in op.reply.getchunks():
162 > file.write(chunk)
162 > file.write(chunk)
163 >
163 >
164 > @command('statbundle2', [], '')
164 > @command('statbundle2', [], '')
165 > def cmdstatbundle2(ui, repo):
165 > def cmdstatbundle2(ui, repo):
166 > """print statistic on the bundle2 container read from stdin"""
166 > """print statistic on the bundle2 container read from stdin"""
167 > unbundler = bundle2.unbundle20(ui, sys.stdin)
167 > unbundler = bundle2.unbundle20(ui, sys.stdin)
168 > try:
168 > try:
169 > params = unbundler.params
169 > params = unbundler.params
170 > except error.BundleValueError, exc:
170 > except error.BundleValueError, exc:
171 > raise util.Abort('unknown parameters: %s' % exc)
171 > raise util.Abort('unknown parameters: %s' % exc)
172 > ui.write('options count: %i\n' % len(params))
172 > ui.write('options count: %i\n' % len(params))
173 > for key in sorted(params):
173 > for key in sorted(params):
174 > ui.write('- %s\n' % key)
174 > ui.write('- %s\n' % key)
175 > value = params[key]
175 > value = params[key]
176 > if value is not None:
176 > if value is not None:
177 > ui.write(' %s\n' % value)
177 > ui.write(' %s\n' % value)
178 > count = 0
178 > count = 0
179 > for p in unbundler.iterparts():
179 > for p in unbundler.iterparts():
180 > count += 1
180 > count += 1
181 > ui.write(' :%s:\n' % p.type)
181 > ui.write(' :%s:\n' % p.type)
182 > ui.write(' mandatory: %i\n' % len(p.mandatoryparams))
182 > ui.write(' mandatory: %i\n' % len(p.mandatoryparams))
183 > ui.write(' advisory: %i\n' % len(p.advisoryparams))
183 > ui.write(' advisory: %i\n' % len(p.advisoryparams))
184 > ui.write(' payload: %i bytes\n' % len(p.read()))
184 > ui.write(' payload: %i bytes\n' % len(p.read()))
185 > ui.write('parts count: %i\n' % count)
185 > ui.write('parts count: %i\n' % count)
186 > EOF
186 > EOF
187 $ cat >> $HGRCPATH << EOF
187 $ cat >> $HGRCPATH << EOF
188 > [extensions]
188 > [extensions]
189 > bundle2=$TESTTMP/bundle2.py
189 > bundle2=$TESTTMP/bundle2.py
190 > [experimental]
190 > [experimental]
191 > bundle2-exp=True
191 > bundle2-exp=True
192 > [ui]
192 > [ui]
193 > ssh=python "$TESTDIR/dummyssh"
193 > ssh=python "$TESTDIR/dummyssh"
194 > logtemplate={rev}:{node|short} {phase} {author} {desc|firstline}
194 > logtemplate={rev}:{node|short} {phase} {author} {desc|firstline}
195 > [web]
195 > [web]
196 > push_ssl = false
196 > push_ssl = false
197 > allow_push = *
197 > allow_push = *
198 > [phases]
198 > [phases]
199 > publish=False
199 > publish=False
200 > EOF
200 > EOF
201
201
202 The extension requires a repo (currently unused)
202 The extension requires a repo (currently unused)
203
203
204 $ hg init main
204 $ hg init main
205 $ cd main
205 $ cd main
206 $ touch a
206 $ touch a
207 $ hg add a
207 $ hg add a
208 $ hg commit -m 'a'
208 $ hg commit -m 'a'
209
209
210
210
211 Empty bundle
211 Empty bundle
212 =================
212 =================
213
213
214 - no option
214 - no option
215 - no parts
215 - no parts
216
216
217 Test bundling
217 Test bundling
218
218
219 $ hg bundle2
219 $ hg bundle2
220 HG2X\x00\x00\x00\x00 (no-eol) (esc)
220 HG2X\x00\x00\x00\x00 (no-eol) (esc)
221
221
222 Test unbundling
222 Test unbundling
223
223
224 $ hg bundle2 | hg statbundle2
224 $ hg bundle2 | hg statbundle2
225 options count: 0
225 options count: 0
226 parts count: 0
226 parts count: 0
227
227
228 Test old style bundle are detected and refused
228 Test old style bundle are detected and refused
229
229
230 $ hg bundle --all ../bundle.hg
230 $ hg bundle --all ../bundle.hg
231 1 changesets found
231 1 changesets found
232 $ hg statbundle2 < ../bundle.hg
232 $ hg statbundle2 < ../bundle.hg
233 abort: unknown bundle version 10
233 abort: unknown bundle version 10
234 [255]
234 [255]
235
235
236 Test parameters
236 Test parameters
237 =================
237 =================
238
238
239 - some options
239 - some options
240 - no parts
240 - no parts
241
241
242 advisory parameters, no value
242 advisory parameters, no value
243 -------------------------------
243 -------------------------------
244
244
245 Simplest possible parameters form
245 Simplest possible parameters form
246
246
247 Test generation simple option
247 Test generation simple option
248
248
249 $ hg bundle2 --param 'caution'
249 $ hg bundle2 --param 'caution'
250 HG2X\x00\x07caution\x00\x00 (no-eol) (esc)
250 HG2X\x00\x07caution\x00\x00 (no-eol) (esc)
251
251
252 Test unbundling
252 Test unbundling
253
253
254 $ hg bundle2 --param 'caution' | hg statbundle2
254 $ hg bundle2 --param 'caution' | hg statbundle2
255 options count: 1
255 options count: 1
256 - caution
256 - caution
257 parts count: 0
257 parts count: 0
258
258
259 Test generation multiple option
259 Test generation multiple option
260
260
261 $ hg bundle2 --param 'caution' --param 'meal'
261 $ hg bundle2 --param 'caution' --param 'meal'
262 HG2X\x00\x0ccaution meal\x00\x00 (no-eol) (esc)
262 HG2X\x00\x0ccaution meal\x00\x00 (no-eol) (esc)
263
263
264 Test unbundling
264 Test unbundling
265
265
266 $ hg bundle2 --param 'caution' --param 'meal' | hg statbundle2
266 $ hg bundle2 --param 'caution' --param 'meal' | hg statbundle2
267 options count: 2
267 options count: 2
268 - caution
268 - caution
269 - meal
269 - meal
270 parts count: 0
270 parts count: 0
271
271
272 advisory parameters, with value
272 advisory parameters, with value
273 -------------------------------
273 -------------------------------
274
274
275 Test generation
275 Test generation
276
276
277 $ hg bundle2 --param 'caution' --param 'meal=vegan' --param 'elephants'
277 $ hg bundle2 --param 'caution' --param 'meal=vegan' --param 'elephants'
278 HG2X\x00\x1ccaution meal=vegan elephants\x00\x00 (no-eol) (esc)
278 HG2X\x00\x1ccaution meal=vegan elephants\x00\x00 (no-eol) (esc)
279
279
280 Test unbundling
280 Test unbundling
281
281
282 $ hg bundle2 --param 'caution' --param 'meal=vegan' --param 'elephants' | hg statbundle2
282 $ hg bundle2 --param 'caution' --param 'meal=vegan' --param 'elephants' | hg statbundle2
283 options count: 3
283 options count: 3
284 - caution
284 - caution
285 - elephants
285 - elephants
286 - meal
286 - meal
287 vegan
287 vegan
288 parts count: 0
288 parts count: 0
289
289
290 parameter with special char in value
290 parameter with special char in value
291 ---------------------------------------------------
291 ---------------------------------------------------
292
292
293 Test generation
293 Test generation
294
294
295 $ hg bundle2 --param 'e|! 7/=babar%#==tutu' --param simple
295 $ hg bundle2 --param 'e|! 7/=babar%#==tutu' --param simple
296 HG2X\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc)
296 HG2X\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc)
297
297
298 Test unbundling
298 Test unbundling
299
299
300 $ hg bundle2 --param 'e|! 7/=babar%#==tutu' --param simple | hg statbundle2
300 $ hg bundle2 --param 'e|! 7/=babar%#==tutu' --param simple | hg statbundle2
301 options count: 2
301 options count: 2
302 - e|! 7/
302 - e|! 7/
303 babar%#==tutu
303 babar%#==tutu
304 - simple
304 - simple
305 parts count: 0
305 parts count: 0
306
306
307 Test unknown mandatory option
307 Test unknown mandatory option
308 ---------------------------------------------------
308 ---------------------------------------------------
309
309
310 $ hg bundle2 --param 'Gravity' | hg statbundle2
310 $ hg bundle2 --param 'Gravity' | hg statbundle2
311 abort: unknown parameters: Stream Parameter - Gravity
311 abort: unknown parameters: Stream Parameter - Gravity
312 [255]
312 [255]
313
313
314 Test debug output
314 Test debug output
315 ---------------------------------------------------
315 ---------------------------------------------------
316
316
317 bundling debug
317 bundling debug
318
318
319 $ hg bundle2 --debug --param 'e|! 7/=babar%#==tutu' --param simple ../out.hg2
319 $ hg bundle2 --debug --param 'e|! 7/=babar%#==tutu' --param simple ../out.hg2
320 start emission of HG2X stream
320 start emission of HG2X stream
321 bundle parameter: e%7C%21%207/=babar%25%23%3D%3Dtutu simple
321 bundle parameter: e%7C%21%207/=babar%25%23%3D%3Dtutu simple
322 start of parts
322 start of parts
323 end of bundle
323 end of bundle
324
324
325 file content is ok
325 file content is ok
326
326
327 $ cat ../out.hg2
327 $ cat ../out.hg2
328 HG2X\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc)
328 HG2X\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc)
329
329
330 unbundling debug
330 unbundling debug
331
331
332 $ hg statbundle2 --debug < ../out.hg2
332 $ hg statbundle2 --debug < ../out.hg2
333 start processing of HG2X stream
333 start processing of HG2X stream
334 reading bundle2 stream parameters
334 reading bundle2 stream parameters
335 ignoring unknown parameter 'e|! 7/'
335 ignoring unknown parameter 'e|! 7/'
336 ignoring unknown parameter 'simple'
336 ignoring unknown parameter 'simple'
337 options count: 2
337 options count: 2
338 - e|! 7/
338 - e|! 7/
339 babar%#==tutu
339 babar%#==tutu
340 - simple
340 - simple
341 start extraction of bundle2 parts
341 start extraction of bundle2 parts
342 part header size: 0
342 part header size: 0
343 end of bundle2 stream
343 end of bundle2 stream
344 parts count: 0
344 parts count: 0
345
345
346
346
347 Test buggy input
347 Test buggy input
348 ---------------------------------------------------
348 ---------------------------------------------------
349
349
350 empty parameter name
350 empty parameter name
351
351
352 $ hg bundle2 --param '' --quiet
352 $ hg bundle2 --param '' --quiet
353 abort: empty parameter name
353 abort: empty parameter name
354 [255]
354 [255]
355
355
356 bad parameter name
356 bad parameter name
357
357
358 $ hg bundle2 --param 42babar
358 $ hg bundle2 --param 42babar
359 abort: non letter first character: '42babar'
359 abort: non letter first character: '42babar'
360 [255]
360 [255]
361
361
362
362
363 Test part
363 Test part
364 =================
364 =================
365
365
366 $ hg bundle2 --parts ../parts.hg2 --debug
366 $ hg bundle2 --parts ../parts.hg2 --debug
367 start emission of HG2X stream
367 start emission of HG2X stream
368 bundle parameter:
368 bundle parameter:
369 start of parts
369 start of parts
370 bundle part: "test:empty"
370 bundle part: "test:empty"
371 bundle part: "test:empty"
371 bundle part: "test:empty"
372 bundle part: "test:song"
372 bundle part: "test:song"
373 bundle part: "test:debugreply"
373 bundle part: "test:debugreply"
374 bundle part: "test:math"
374 bundle part: "test:math"
375 bundle part: "test:song"
375 bundle part: "test:song"
376 bundle part: "test:ping"
376 bundle part: "test:ping"
377 end of bundle
377 end of bundle
378
378
379 $ cat ../parts.hg2
379 $ cat ../parts.hg2
380 HG2X\x00\x00\x00\x11 (esc)
380 HG2X\x00\x00\x00\x11 (esc)
381 test:empty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11 (esc)
381 test:empty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11 (esc)
382 test:empty\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x10 test:song\x00\x00\x00\x02\x00\x00\x00\x00\x00\xb2Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko (esc)
382 test:empty\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x10 test:song\x00\x00\x00\x02\x00\x00\x00\x00\x00\xb2Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko (esc)
383 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
383 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
384 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.\x00\x00\x00\x00\x00\x16\x0ftest:debugreply\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00+ test:math\x00\x00\x00\x04\x02\x01\x02\x04\x01\x04\x07\x03pi3.14e2.72cookingraw\x00\x00\x00\x0242\x00\x00\x00\x00\x00\x1d test:song\x00\x00\x00\x05\x01\x00\x0b\x00randomparam\x00\x00\x00\x00\x00\x10 test:ping\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
384 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.\x00\x00\x00\x00\x00\x16\x0ftest:debugreply\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00+ test:math\x00\x00\x00\x04\x02\x01\x02\x04\x01\x04\x07\x03pi3.14e2.72cookingraw\x00\x00\x00\x0242\x00\x00\x00\x00\x00\x1d test:song\x00\x00\x00\x05\x01\x00\x0b\x00randomparam\x00\x00\x00\x00\x00\x10 test:ping\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
385
385
386
386
387 $ hg statbundle2 < ../parts.hg2
387 $ hg statbundle2 < ../parts.hg2
388 options count: 0
388 options count: 0
389 :test:empty:
389 :test:empty:
390 mandatory: 0
390 mandatory: 0
391 advisory: 0
391 advisory: 0
392 payload: 0 bytes
392 payload: 0 bytes
393 :test:empty:
393 :test:empty:
394 mandatory: 0
394 mandatory: 0
395 advisory: 0
395 advisory: 0
396 payload: 0 bytes
396 payload: 0 bytes
397 :test:song:
397 :test:song:
398 mandatory: 0
398 mandatory: 0
399 advisory: 0
399 advisory: 0
400 payload: 178 bytes
400 payload: 178 bytes
401 :test:debugreply:
401 :test:debugreply:
402 mandatory: 0
402 mandatory: 0
403 advisory: 0
403 advisory: 0
404 payload: 0 bytes
404 payload: 0 bytes
405 :test:math:
405 :test:math:
406 mandatory: 2
406 mandatory: 2
407 advisory: 1
407 advisory: 1
408 payload: 2 bytes
408 payload: 2 bytes
409 :test:song:
409 :test:song:
410 mandatory: 1
410 mandatory: 1
411 advisory: 0
411 advisory: 0
412 payload: 0 bytes
412 payload: 0 bytes
413 :test:ping:
413 :test:ping:
414 mandatory: 0
414 mandatory: 0
415 advisory: 0
415 advisory: 0
416 payload: 0 bytes
416 payload: 0 bytes
417 parts count: 7
417 parts count: 7
418
418
419 $ hg statbundle2 --debug < ../parts.hg2
419 $ hg statbundle2 --debug < ../parts.hg2
420 start processing of HG2X stream
420 start processing of HG2X stream
421 reading bundle2 stream parameters
421 reading bundle2 stream parameters
422 options count: 0
422 options count: 0
423 start extraction of bundle2 parts
423 start extraction of bundle2 parts
424 part header size: 17
424 part header size: 17
425 part type: "test:empty"
425 part type: "test:empty"
426 part id: "0"
426 part id: "0"
427 part parameters: 0
427 part parameters: 0
428 :test:empty:
428 :test:empty:
429 mandatory: 0
429 mandatory: 0
430 advisory: 0
430 advisory: 0
431 payload chunk size: 0
431 payload chunk size: 0
432 payload: 0 bytes
432 payload: 0 bytes
433 part header size: 17
433 part header size: 17
434 part type: "test:empty"
434 part type: "test:empty"
435 part id: "1"
435 part id: "1"
436 part parameters: 0
436 part parameters: 0
437 :test:empty:
437 :test:empty:
438 mandatory: 0
438 mandatory: 0
439 advisory: 0
439 advisory: 0
440 payload chunk size: 0
440 payload chunk size: 0
441 payload: 0 bytes
441 payload: 0 bytes
442 part header size: 16
442 part header size: 16
443 part type: "test:song"
443 part type: "test:song"
444 part id: "2"
444 part id: "2"
445 part parameters: 0
445 part parameters: 0
446 :test:song:
446 :test:song:
447 mandatory: 0
447 mandatory: 0
448 advisory: 0
448 advisory: 0
449 payload chunk size: 178
449 payload chunk size: 178
450 payload chunk size: 0
450 payload chunk size: 0
451 payload: 178 bytes
451 payload: 178 bytes
452 part header size: 22
452 part header size: 22
453 part type: "test:debugreply"
453 part type: "test:debugreply"
454 part id: "3"
454 part id: "3"
455 part parameters: 0
455 part parameters: 0
456 :test:debugreply:
456 :test:debugreply:
457 mandatory: 0
457 mandatory: 0
458 advisory: 0
458 advisory: 0
459 payload chunk size: 0
459 payload chunk size: 0
460 payload: 0 bytes
460 payload: 0 bytes
461 part header size: 43
461 part header size: 43
462 part type: "test:math"
462 part type: "test:math"
463 part id: "4"
463 part id: "4"
464 part parameters: 3
464 part parameters: 3
465 :test:math:
465 :test:math:
466 mandatory: 2
466 mandatory: 2
467 advisory: 1
467 advisory: 1
468 payload chunk size: 2
468 payload chunk size: 2
469 payload chunk size: 0
469 payload chunk size: 0
470 payload: 2 bytes
470 payload: 2 bytes
471 part header size: 29
471 part header size: 29
472 part type: "test:song"
472 part type: "test:song"
473 part id: "5"
473 part id: "5"
474 part parameters: 1
474 part parameters: 1
475 :test:song:
475 :test:song:
476 mandatory: 1
476 mandatory: 1
477 advisory: 0
477 advisory: 0
478 payload chunk size: 0
478 payload chunk size: 0
479 payload: 0 bytes
479 payload: 0 bytes
480 part header size: 16
480 part header size: 16
481 part type: "test:ping"
481 part type: "test:ping"
482 part id: "6"
482 part id: "6"
483 part parameters: 0
483 part parameters: 0
484 :test:ping:
484 :test:ping:
485 mandatory: 0
485 mandatory: 0
486 advisory: 0
486 advisory: 0
487 payload chunk size: 0
487 payload chunk size: 0
488 payload: 0 bytes
488 payload: 0 bytes
489 part header size: 0
489 part header size: 0
490 end of bundle2 stream
490 end of bundle2 stream
491 parts count: 7
491 parts count: 7
492
492
493 Test actual unbundling of test part
493 Test actual unbundling of test part
494 =======================================
494 =======================================
495
495
496 Process the bundle
496 Process the bundle
497
497
498 $ hg unbundle2 --debug < ../parts.hg2
498 $ hg unbundle2 --debug < ../parts.hg2
499 start processing of HG2X stream
499 start processing of HG2X stream
500 reading bundle2 stream parameters
500 reading bundle2 stream parameters
501 start extraction of bundle2 parts
501 start extraction of bundle2 parts
502 part header size: 17
502 part header size: 17
503 part type: "test:empty"
503 part type: "test:empty"
504 part id: "0"
504 part id: "0"
505 part parameters: 0
505 part parameters: 0
506 ignoring unsupported advisory part test:empty
506 ignoring unsupported advisory part test:empty
507 payload chunk size: 0
507 payload chunk size: 0
508 part header size: 17
508 part header size: 17
509 part type: "test:empty"
509 part type: "test:empty"
510 part id: "1"
510 part id: "1"
511 part parameters: 0
511 part parameters: 0
512 ignoring unsupported advisory part test:empty
512 ignoring unsupported advisory part test:empty
513 payload chunk size: 0
513 payload chunk size: 0
514 part header size: 16
514 part header size: 16
515 part type: "test:song"
515 part type: "test:song"
516 part id: "2"
516 part id: "2"
517 part parameters: 0
517 part parameters: 0
518 found a handler for part 'test:song'
518 found a handler for part 'test:song'
519 The choir starts singing:
519 The choir starts singing:
520 payload chunk size: 178
520 payload chunk size: 178
521 payload chunk size: 0
521 payload chunk size: 0
522 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
522 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
523 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
523 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
524 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
524 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
525 part header size: 22
525 part header size: 22
526 part type: "test:debugreply"
526 part type: "test:debugreply"
527 part id: "3"
527 part id: "3"
528 part parameters: 0
528 part parameters: 0
529 found a handler for part 'test:debugreply'
529 found a handler for part 'test:debugreply'
530 debugreply: no reply
530 debugreply: no reply
531 payload chunk size: 0
531 payload chunk size: 0
532 part header size: 43
532 part header size: 43
533 part type: "test:math"
533 part type: "test:math"
534 part id: "4"
534 part id: "4"
535 part parameters: 3
535 part parameters: 3
536 ignoring unsupported advisory part test:math
536 ignoring unsupported advisory part test:math
537 payload chunk size: 2
537 payload chunk size: 2
538 payload chunk size: 0
538 payload chunk size: 0
539 part header size: 29
539 part header size: 29
540 part type: "test:song"
540 part type: "test:song"
541 part id: "5"
541 part id: "5"
542 part parameters: 1
542 part parameters: 1
543 found a handler for part 'test:song'
543 found a handler for part 'test:song'
544 ignoring unsupported advisory part test:song - randomparam
544 ignoring unsupported advisory part test:song - randomparam
545 payload chunk size: 0
545 payload chunk size: 0
546 part header size: 16
546 part header size: 16
547 part type: "test:ping"
547 part type: "test:ping"
548 part id: "6"
548 part id: "6"
549 part parameters: 0
549 part parameters: 0
550 found a handler for part 'test:ping'
550 found a handler for part 'test:ping'
551 received ping request (id 6)
551 received ping request (id 6)
552 payload chunk size: 0
552 payload chunk size: 0
553 part header size: 0
553 part header size: 0
554 end of bundle2 stream
554 end of bundle2 stream
555 0 unread bytes
555 0 unread bytes
556 3 total verses sung
556 3 total verses sung
557
557
558 Unbundle with an unknown mandatory part
558 Unbundle with an unknown mandatory part
559 (should abort)
559 (should abort)
560
560
561 $ hg bundle2 --parts --unknown ../unknown.hg2
561 $ hg bundle2 --parts --unknown ../unknown.hg2
562
562
563 $ hg unbundle2 < ../unknown.hg2
563 $ hg unbundle2 < ../unknown.hg2
564 The choir starts singing:
564 The choir starts singing:
565 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
565 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
566 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
566 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
567 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
567 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
568 debugreply: no reply
568 debugreply: no reply
569 0 unread bytes
569 0 unread bytes
570 abort: missing support for test:unknown
570 abort: missing support for test:unknown
571 [255]
571 [255]
572
572
573 Unbundle with an unknown mandatory part parameters
573 Unbundle with an unknown mandatory part parameters
574 (should abort)
574 (should abort)
575
575
576 $ hg bundle2 --unknownparams ../unknown.hg2
576 $ hg bundle2 --unknownparams ../unknown.hg2
577
577
578 $ hg unbundle2 < ../unknown.hg2
578 $ hg unbundle2 < ../unknown.hg2
579 0 unread bytes
579 0 unread bytes
580 abort: missing support for test:song - randomparams
580 abort: missing support for test:song - randomparams
581 [255]
581 [255]
582
582
583 unbundle with a reply
583 unbundle with a reply
584
584
585 $ hg bundle2 --parts --reply ../parts-reply.hg2
585 $ hg bundle2 --parts --reply ../parts-reply.hg2
586 $ hg unbundle2 ../reply.hg2 < ../parts-reply.hg2
586 $ hg unbundle2 ../reply.hg2 < ../parts-reply.hg2
587 0 unread bytes
587 0 unread bytes
588 3 total verses sung
588 3 total verses sung
589
589
590 The reply is a bundle
590 The reply is a bundle
591
591
592 $ cat ../reply.hg2
592 $ cat ../reply.hg2
593 HG2X\x00\x00\x00\x1f (esc)
593 HG2X\x00\x00\x00\x1f (esc)
594 b2x:output\x00\x00\x00\x00\x00\x01\x0b\x01in-reply-to3\x00\x00\x00\xd9The choir starts singing: (esc)
594 b2x:output\x00\x00\x00\x00\x00\x01\x0b\x01in-reply-to3\x00\x00\x00\xd9The choir starts singing: (esc)
595 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
595 Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
596 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
596 Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
597 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
597 Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
598 \x00\x00\x00\x00\x00\x1f (esc)
598 \x00\x00\x00\x00\x00\x1f (esc)
599 b2x:output\x00\x00\x00\x01\x00\x01\x0b\x01in-reply-to4\x00\x00\x00\xc9debugreply: capabilities: (esc)
599 b2x:output\x00\x00\x00\x01\x00\x01\x0b\x01in-reply-to4\x00\x00\x00\xc9debugreply: capabilities: (esc)
600 debugreply: 'city=!'
600 debugreply: 'city=!'
601 debugreply: 'celeste,ville'
601 debugreply: 'celeste,ville'
602 debugreply: 'elephants'
602 debugreply: 'elephants'
603 debugreply: 'babar'
603 debugreply: 'babar'
604 debugreply: 'celeste'
604 debugreply: 'celeste'
605 debugreply: 'ping-pong'
605 debugreply: 'ping-pong'
606 \x00\x00\x00\x00\x00\x1e test:pong\x00\x00\x00\x02\x01\x00\x0b\x01in-reply-to7\x00\x00\x00\x00\x00\x1f (esc)
606 \x00\x00\x00\x00\x00\x1e test:pong\x00\x00\x00\x02\x01\x00\x0b\x01in-reply-to7\x00\x00\x00\x00\x00\x1f (esc)
607 b2x:output\x00\x00\x00\x03\x00\x01\x0b\x01in-reply-to7\x00\x00\x00=received ping request (id 7) (esc)
607 b2x:output\x00\x00\x00\x03\x00\x01\x0b\x01in-reply-to7\x00\x00\x00=received ping request (id 7) (esc)
608 replying to ping request (id 7)
608 replying to ping request (id 7)
609 \x00\x00\x00\x00\x00\x00 (no-eol) (esc)
609 \x00\x00\x00\x00\x00\x00 (no-eol) (esc)
610
610
611 The reply is valid
611 The reply is valid
612
612
613 $ hg statbundle2 < ../reply.hg2
613 $ hg statbundle2 < ../reply.hg2
614 options count: 0
614 options count: 0
615 :b2x:output:
615 :b2x:output:
616 mandatory: 0
616 mandatory: 0
617 advisory: 1
617 advisory: 1
618 payload: 217 bytes
618 payload: 217 bytes
619 :b2x:output:
619 :b2x:output:
620 mandatory: 0
620 mandatory: 0
621 advisory: 1
621 advisory: 1
622 payload: 201 bytes
622 payload: 201 bytes
623 :test:pong:
623 :test:pong:
624 mandatory: 1
624 mandatory: 1
625 advisory: 0
625 advisory: 0
626 payload: 0 bytes
626 payload: 0 bytes
627 :b2x:output:
627 :b2x:output:
628 mandatory: 0
628 mandatory: 0
629 advisory: 1
629 advisory: 1
630 payload: 61 bytes
630 payload: 61 bytes
631 parts count: 4
631 parts count: 4
632
632
633 Unbundle the reply to get the output:
633 Unbundle the reply to get the output:
634
634
635 $ hg unbundle2 < ../reply.hg2
635 $ hg unbundle2 < ../reply.hg2
636 remote: The choir starts singing:
636 remote: The choir starts singing:
637 remote: Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
637 remote: Patali Dirapata, Cromda Cromda Ripalo, Pata Pata, Ko Ko Ko
638 remote: Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
638 remote: Bokoro Dipoulito, Rondi Rondi Pepino, Pata Pata, Ko Ko Ko
639 remote: Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
639 remote: Emana Karassoli, Loucra Loucra Ponponto, Pata Pata, Ko Ko Ko.
640 remote: debugreply: capabilities:
640 remote: debugreply: capabilities:
641 remote: debugreply: 'city=!'
641 remote: debugreply: 'city=!'
642 remote: debugreply: 'celeste,ville'
642 remote: debugreply: 'celeste,ville'
643 remote: debugreply: 'elephants'
643 remote: debugreply: 'elephants'
644 remote: debugreply: 'babar'
644 remote: debugreply: 'babar'
645 remote: debugreply: 'celeste'
645 remote: debugreply: 'celeste'
646 remote: debugreply: 'ping-pong'
646 remote: debugreply: 'ping-pong'
647 remote: received ping request (id 7)
647 remote: received ping request (id 7)
648 remote: replying to ping request (id 7)
648 remote: replying to ping request (id 7)
649 0 unread bytes
649 0 unread bytes
650
650
651 Test push race detection
651 Test push race detection
652
652
653 $ hg bundle2 --pushrace ../part-race.hg2
653 $ hg bundle2 --pushrace ../part-race.hg2
654
654
655 $ hg unbundle2 < ../part-race.hg2
655 $ hg unbundle2 < ../part-race.hg2
656 0 unread bytes
656 0 unread bytes
657 abort: push race: repository changed while pushing - please try again
657 abort: push race: repository changed while pushing - please try again
658 [255]
658 [255]
659
659
660 Support for changegroup
660 Support for changegroup
661 ===================================
661 ===================================
662
662
663 $ hg unbundle $TESTDIR/bundles/rebase.hg
663 $ hg unbundle $TESTDIR/bundles/rebase.hg
664 adding changesets
664 adding changesets
665 adding manifests
665 adding manifests
666 adding file changes
666 adding file changes
667 added 8 changesets with 7 changes to 7 files (+3 heads)
667 added 8 changesets with 7 changes to 7 files (+3 heads)
668 (run 'hg heads' to see heads, 'hg merge' to merge)
668 (run 'hg heads' to see heads, 'hg merge' to merge)
669
669
670 $ hg log -G
670 $ hg log -G
671 o 8:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
671 o 8:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
672 |
672 |
673 | o 7:eea13746799a draft Nicolas Dumazet <nicdumz.commits@gmail.com> G
673 | o 7:eea13746799a draft Nicolas Dumazet <nicdumz.commits@gmail.com> G
674 |/|
674 |/|
675 o | 6:24b6387c8c8c draft Nicolas Dumazet <nicdumz.commits@gmail.com> F
675 o | 6:24b6387c8c8c draft Nicolas Dumazet <nicdumz.commits@gmail.com> F
676 | |
676 | |
677 | o 5:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
677 | o 5:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
678 |/
678 |/
679 | o 4:32af7686d403 draft Nicolas Dumazet <nicdumz.commits@gmail.com> D
679 | o 4:32af7686d403 draft Nicolas Dumazet <nicdumz.commits@gmail.com> D
680 | |
680 | |
681 | o 3:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits@gmail.com> C
681 | o 3:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits@gmail.com> C
682 | |
682 | |
683 | o 2:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits@gmail.com> B
683 | o 2:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits@gmail.com> B
684 |/
684 |/
685 o 1:cd010b8cd998 draft Nicolas Dumazet <nicdumz.commits@gmail.com> A
685 o 1:cd010b8cd998 draft Nicolas Dumazet <nicdumz.commits@gmail.com> A
686
686
687 @ 0:3903775176ed draft test a
687 @ 0:3903775176ed draft test a
688
688
689
689
690 $ hg bundle2 --debug --rev '8+7+5+4' ../rev.hg2
690 $ hg bundle2 --debug --rev '8+7+5+4' ../rev.hg2
691 4 changesets found
691 4 changesets found
692 list of changesets:
692 list of changesets:
693 32af7686d403cf45b5d95f2d70cebea587ac806a
693 32af7686d403cf45b5d95f2d70cebea587ac806a
694 9520eea781bcca16c1e15acc0ba14335a0e8e5ba
694 9520eea781bcca16c1e15acc0ba14335a0e8e5ba
695 eea13746799a9e0bfd88f29d3c2e9dc9389f524f
695 eea13746799a9e0bfd88f29d3c2e9dc9389f524f
696 02de42196ebee42ef284b6780a87cdc96e8eaab6
696 02de42196ebee42ef284b6780a87cdc96e8eaab6
697 start emission of HG2X stream
697 start emission of HG2X stream
698 bundle parameter:
698 bundle parameter:
699 start of parts
699 start of parts
700 bundle part: "b2x:changegroup"
700 bundle part: "b2x:changegroup"
701 bundling: 1/4 changesets (25.00%)
701 bundling: 1/4 changesets (25.00%)
702 bundling: 2/4 changesets (50.00%)
702 bundling: 2/4 changesets (50.00%)
703 bundling: 3/4 changesets (75.00%)
703 bundling: 3/4 changesets (75.00%)
704 bundling: 4/4 changesets (100.00%)
704 bundling: 4/4 changesets (100.00%)
705 bundling: 1/4 manifests (25.00%)
705 bundling: 1/4 manifests (25.00%)
706 bundling: 2/4 manifests (50.00%)
706 bundling: 2/4 manifests (50.00%)
707 bundling: 3/4 manifests (75.00%)
707 bundling: 3/4 manifests (75.00%)
708 bundling: 4/4 manifests (100.00%)
708 bundling: 4/4 manifests (100.00%)
709 bundling: D 1/3 files (33.33%)
709 bundling: D 1/3 files (33.33%)
710 bundling: E 2/3 files (66.67%)
710 bundling: E 2/3 files (66.67%)
711 bundling: H 3/3 files (100.00%)
711 bundling: H 3/3 files (100.00%)
712 end of bundle
712 end of bundle
713
713
714 $ cat ../rev.hg2
714 $ cat ../rev.hg2
715 HG2X\x00\x00\x00\x16\x0fb2x:changegroup\x00\x00\x00\x00\x00\x00\x00\x00\x06\x13\x00\x00\x00\xa42\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j_\xdd\xd9\x89W\xc8\xa5JMCm\xfe\x1d\xa9\xd8\x7f!\xa1\xb9{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)6e1f4c47ecb533ffd0c8e52cdc88afb6cd39e20c (esc)
715 HG2X\x00\x00\x00\x16\x0fb2x:changegroup\x00\x00\x00\x00\x00\x00\x00\x00\x06\x13\x00\x00\x00\xa42\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j_\xdd\xd9\x89W\xc8\xa5JMCm\xfe\x1d\xa9\xd8\x7f!\xa1\xb9{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)6e1f4c47ecb533ffd0c8e52cdc88afb6cd39e20c (esc)
716 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02D (esc)
716 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02D (esc)
717 \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01D\x00\x00\x00\xa4\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xcd\x01\x0b\x8c\xd9\x98\xf3\x98\x1aZ\x81\x15\xf9O\x8d\xa4\xabP`\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)4dece9c826f69490507b98c6383a3009b295837d (esc)
717 \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01D\x00\x00\x00\xa4\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xcd\x01\x0b\x8c\xd9\x98\xf3\x98\x1aZ\x81\x15\xf9O\x8d\xa4\xabP`\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)4dece9c826f69490507b98c6383a3009b295837d (esc)
718 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02E (esc)
718 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x02E (esc)
719 \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01E\x00\x00\x00\xa2\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)365b93d57fdf4814e2b5911d6bacff2b12014441 (esc)
719 \x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01E\x00\x00\x00\xa2\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)365b93d57fdf4814e2b5911d6bacff2b12014441 (esc)
720 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01G\x00\x00\x00\xa4\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
720 \x00\x00\x00f\x00\x00\x00h\x00\x00\x00\x00\x00\x00\x00i\x00\x00\x00j\x00\x00\x00\x01G\x00\x00\x00\xa4\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
721 \x87\xcd\xc9n\x8e\xaa\xb6$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
721 \x87\xcd\xc9n\x8e\xaa\xb6$\xb68|\x8c\x8c\xae7\x17\x88\x80\xf3\xfa\x95\xde\xd3\xcb\x1c\xf7\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
722 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)8bee48edc7318541fc0013ee41b089276a8c24bf (esc)
722 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00)\x00\x00\x00)8bee48edc7318541fc0013ee41b089276a8c24bf (esc)
723 \x00\x00\x00f\x00\x00\x00f\x00\x00\x00\x02H (esc)
723 \x00\x00\x00f\x00\x00\x00f\x00\x00\x00\x02H (esc)
724 \x00\x00\x00g\x00\x00\x00h\x00\x00\x00\x01H\x00\x00\x00\x00\x00\x00\x00\x8bn\x1fLG\xec\xb53\xff\xd0\xc8\xe5,\xdc\x88\xaf\xb6\xcd9\xe2\x0cf\xa5\xa0\x18\x17\xfd\xf5#\x9c'8\x02\xb5\xb7a\x8d\x05\x1c\x89\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+D\x00c3f1ca2924c16a19b0656a84900e504e5b0aec2d (esc)
724 \x00\x00\x00g\x00\x00\x00h\x00\x00\x00\x01H\x00\x00\x00\x00\x00\x00\x00\x8bn\x1fLG\xec\xb53\xff\xd0\xc8\xe5,\xdc\x88\xaf\xb6\xcd9\xe2\x0cf\xa5\xa0\x18\x17\xfd\xf5#\x9c'8\x02\xb5\xb7a\x8d\x05\x1c\x89\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+D\x00c3f1ca2924c16a19b0656a84900e504e5b0aec2d (esc)
725 \x00\x00\x00\x8bM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\x00}\x8c\x9d\x88\x84\x13%\xf5\xc6\xb0cq\xb3[N\x8a+\x1a\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00+\x00\x00\x00\xac\x00\x00\x00+E\x009c6fd0350a6c0d0c49d4a9c5017cf07043f54e58 (esc)
725 \x00\x00\x00\x8bM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\x00}\x8c\x9d\x88\x84\x13%\xf5\xc6\xb0cq\xb3[N\x8a+\x1a\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00+\x00\x00\x00\xac\x00\x00\x00+E\x009c6fd0350a6c0d0c49d4a9c5017cf07043f54e58 (esc)
726 \x00\x00\x00\x8b6[\x93\xd5\x7f\xdfH\x14\xe2\xb5\x91\x1dk\xac\xff+\x12\x01DA(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xceM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00V\x00\x00\x00V\x00\x00\x00+F\x0022bfcfd62a21a3287edbd4d656218d0f525ed76a (esc)
726 \x00\x00\x00\x8b6[\x93\xd5\x7f\xdfH\x14\xe2\xb5\x91\x1dk\xac\xff+\x12\x01DA(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xceM\xec\xe9\xc8&\xf6\x94\x90P{\x98\xc68:0 \xb2\x95\x83}\xee\xa17Fy\x9a\x9e\x0b\xfd\x88\xf2\x9d<.\x9d\xc98\x9fRO\x00\x00\x00V\x00\x00\x00V\x00\x00\x00+F\x0022bfcfd62a21a3287edbd4d656218d0f525ed76a (esc)
727 \x00\x00\x00\x97\x8b\xeeH\xed\xc71\x85A\xfc\x00\x13\xeeA\xb0\x89'j\x8c$\xbf(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
727 \x00\x00\x00\x97\x8b\xeeH\xed\xc71\x85A\xfc\x00\x13\xeeA\xb0\x89'j\x8c$\xbf(\xa5\x84\xc6^\xf1!\xf8\x9e\xb6j\xb7\xd0\xbc\x15=\x80\x99\xe7\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
728 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00+\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+H\x008500189e74a9e0475e822093bc7db0d631aeb0b4 (esc)
728 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00+\x00\x00\x00V\x00\x00\x00\x00\x00\x00\x00\x81\x00\x00\x00\x81\x00\x00\x00+H\x008500189e74a9e0475e822093bc7db0d631aeb0b4 (esc)
729 \x00\x00\x00\x00\x00\x00\x00\x05D\x00\x00\x00b\xc3\xf1\xca)$\xc1j\x19\xb0ej\x84\x90\x0ePN[ (esc)
729 \x00\x00\x00\x00\x00\x00\x00\x05D\x00\x00\x00b\xc3\xf1\xca)$\xc1j\x19\xb0ej\x84\x90\x0ePN[ (esc)
730 \xec-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02D (esc)
730 \xec-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002\xafv\x86\xd4\x03\xcfE\xb5\xd9_-p\xce\xbe\xa5\x87\xac\x80j\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02D (esc)
731 \x00\x00\x00\x00\x00\x00\x00\x05E\x00\x00\x00b\x9co\xd05 (esc)
731 \x00\x00\x00\x00\x00\x00\x00\x05E\x00\x00\x00b\x9co\xd05 (esc)
732 l\r (no-eol) (esc)
732 l\r (no-eol) (esc)
733 \x0cI\xd4\xa9\xc5\x01|\xf0pC\xf5NX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02E (esc)
733 \x0cI\xd4\xa9\xc5\x01|\xf0pC\xf5NX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95 \xee\xa7\x81\xbc\xca\x16\xc1\xe1Z\xcc\x0b\xa1C5\xa0\xe8\xe5\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02E (esc)
734 \x00\x00\x00\x00\x00\x00\x00\x05H\x00\x00\x00b\x85\x00\x18\x9et\xa9\xe0G^\x82 \x93\xbc}\xb0\xd61\xae\xb0\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
734 \x00\x00\x00\x00\x00\x00\x00\x05H\x00\x00\x00b\x85\x00\x18\x9et\xa9\xe0G^\x82 \x93\xbc}\xb0\xd61\xae\xb0\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xdeB\x19n\xbe\xe4.\xf2\x84\xb6x (esc)
735 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02H (esc)
735 \x87\xcd\xc9n\x8e\xaa\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02H (esc)
736 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
736 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 (no-eol) (esc)
737
737
738 $ hg unbundle2 < ../rev.hg2
738 $ hg unbundle2 < ../rev.hg2
739 adding changesets
739 adding changesets
740 adding manifests
740 adding manifests
741 adding file changes
741 adding file changes
742 added 0 changesets with 0 changes to 3 files
742 added 0 changesets with 0 changes to 3 files
743 0 unread bytes
743 0 unread bytes
744 addchangegroup return: 1
744 addchangegroup return: 1
745
745
746 with reply
746 with reply
747
747
748 $ hg bundle2 --rev '8+7+5+4' --reply ../rev-rr.hg2
748 $ hg bundle2 --rev '8+7+5+4' --reply ../rev-rr.hg2
749 $ hg unbundle2 ../rev-reply.hg2 < ../rev-rr.hg2
749 $ hg unbundle2 ../rev-reply.hg2 < ../rev-rr.hg2
750 0 unread bytes
750 0 unread bytes
751 addchangegroup return: 1
751 addchangegroup return: 1
752
752
753 $ cat ../rev-reply.hg2
753 $ cat ../rev-reply.hg2
754 HG2X\x00\x00\x003\x15b2x:reply:changegroup\x00\x00\x00\x00\x00\x02\x0b\x01\x06\x01in-reply-to1return1\x00\x00\x00\x00\x00\x1f (esc)
754 HG2X\x00\x00\x003\x15b2x:reply:changegroup\x00\x00\x00\x00\x00\x02\x0b\x01\x06\x01in-reply-to1return1\x00\x00\x00\x00\x00\x1f (esc)
755 b2x:output\x00\x00\x00\x01\x00\x01\x0b\x01in-reply-to1\x00\x00\x00dadding changesets (esc)
755 b2x:output\x00\x00\x00\x01\x00\x01\x0b\x01in-reply-to1\x00\x00\x00dadding changesets (esc)
756 adding manifests
756 adding manifests
757 adding file changes
757 adding file changes
758 added 0 changesets with 0 changes to 3 files
758 added 0 changesets with 0 changes to 3 files
759 \x00\x00\x00\x00\x00\x00 (no-eol) (esc)
759 \x00\x00\x00\x00\x00\x00 (no-eol) (esc)
760
760
761 Real world exchange
761 Real world exchange
762 =====================
762 =====================
763
763
764
764
765 clone --pull
765 clone --pull
766
766
767 $ cd ..
767 $ cd ..
768 $ hg -R main phase --public cd010b8cd998
768 $ hg -R main phase --public cd010b8cd998
769 $ hg clone main other --pull --rev 9520eea781bc
769 $ hg clone main other --pull --rev 9520eea781bc
770 adding changesets
770 adding changesets
771 adding manifests
771 adding manifests
772 adding file changes
772 adding file changes
773 added 2 changesets with 2 changes to 2 files
773 added 2 changesets with 2 changes to 2 files
774 updating to branch default
774 updating to branch default
775 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
775 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
776 $ hg -R other log -G
776 $ hg -R other log -G
777 @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
777 @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
778 |
778 |
779 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
779 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
780
780
781
781
782 pull
782 pull
783
783
784 $ hg -R main phase --public 9520eea781bc
784 $ hg -R main phase --public 9520eea781bc
785 $ hg -R other pull -r 24b6387c8c8c
785 $ hg -R other pull -r 24b6387c8c8c
786 pulling from $TESTTMP/main (glob)
786 pulling from $TESTTMP/main (glob)
787 searching for changes
787 searching for changes
788 adding changesets
788 adding changesets
789 adding manifests
789 adding manifests
790 adding file changes
790 adding file changes
791 added 1 changesets with 1 changes to 1 files (+1 heads)
791 added 1 changesets with 1 changes to 1 files (+1 heads)
792 (run 'hg heads' to see heads, 'hg merge' to merge)
792 (run 'hg heads' to see heads, 'hg merge' to merge)
793 $ hg -R other log -G
793 $ hg -R other log -G
794 o 2:24b6387c8c8c draft Nicolas Dumazet <nicdumz.commits@gmail.com> F
794 o 2:24b6387c8c8c draft Nicolas Dumazet <nicdumz.commits@gmail.com> F
795 |
795 |
796 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
796 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
797 |/
797 |/
798 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
798 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
799
799
800
800
801 pull empty (with phase movement)
801 pull empty (with phase movement)
802
802
803 $ hg -R main phase --public 24b6387c8c8c
803 $ hg -R main phase --public 24b6387c8c8c
804 $ hg -R other pull -r 24b6387c8c8c
804 $ hg -R other pull -r 24b6387c8c8c
805 pulling from $TESTTMP/main (glob)
805 pulling from $TESTTMP/main (glob)
806 no changes found
806 no changes found
807 $ hg -R other log -G
807 $ hg -R other log -G
808 o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
808 o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
809 |
809 |
810 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
810 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
811 |/
811 |/
812 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
812 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
813
813
814 pull empty
814 pull empty
815
815
816 $ hg -R other pull -r 24b6387c8c8c
816 $ hg -R other pull -r 24b6387c8c8c
817 pulling from $TESTTMP/main (glob)
817 pulling from $TESTTMP/main (glob)
818 no changes found
818 no changes found
819 $ hg -R other log -G
819 $ hg -R other log -G
820 o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
820 o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
821 |
821 |
822 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
822 | @ 1:9520eea781bc draft Nicolas Dumazet <nicdumz.commits@gmail.com> E
823 |/
823 |/
824 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
824 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
825
825
826
826
827 push
827 push
828
828
829 $ hg -R main phase --public eea13746799a
829 $ hg -R main phase --public eea13746799a
830 $ hg -R main push other --rev eea13746799a
830 $ hg -R main push other --rev eea13746799a
831 pushing to other
831 pushing to other
832 searching for changes
832 searching for changes
833 remote: adding changesets
833 remote: adding changesets
834 remote: adding manifests
834 remote: adding manifests
835 remote: adding file changes
835 remote: adding file changes
836 remote: added 1 changesets with 0 changes to 0 files (-1 heads)
836 remote: added 1 changesets with 0 changes to 0 files (-1 heads)
837 $ hg -R other log -G
837 $ hg -R other log -G
838 o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
838 o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
839 |\
839 |\
840 | o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
840 | o 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
841 | |
841 | |
842 @ | 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
842 @ | 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
843 |/
843 |/
844 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
844 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
845
845
846
846
847 pull over ssh
847 pull over ssh
848
848
849 $ hg -R other pull ssh://user@dummy/main -r 02de42196ebe --traceback
849 $ hg -R other pull ssh://user@dummy/main -r 02de42196ebe --traceback
850 pulling from ssh://user@dummy/main
850 pulling from ssh://user@dummy/main
851 searching for changes
851 searching for changes
852 adding changesets
852 adding changesets
853 adding manifests
853 adding manifests
854 adding file changes
854 adding file changes
855 added 1 changesets with 1 changes to 1 files (+1 heads)
855 added 1 changesets with 1 changes to 1 files (+1 heads)
856 (run 'hg heads' to see heads, 'hg merge' to merge)
856 (run 'hg heads' to see heads, 'hg merge' to merge)
857
857
858 pull over http
858 pull over http
859
859
860 $ hg -R main serve -p $HGPORT -d --pid-file=main.pid -E main-error.log
860 $ hg -R main serve -p $HGPORT -d --pid-file=main.pid -E main-error.log
861 $ cat main.pid >> $DAEMON_PIDS
861 $ cat main.pid >> $DAEMON_PIDS
862
862
863 $ hg -R other pull http://localhost:$HGPORT/ -r 42ccdea3bb16
863 $ hg -R other pull http://localhost:$HGPORT/ -r 42ccdea3bb16
864 pulling from http://localhost:$HGPORT/
864 pulling from http://localhost:$HGPORT/
865 searching for changes
865 searching for changes
866 adding changesets
866 adding changesets
867 adding manifests
867 adding manifests
868 adding file changes
868 adding file changes
869 added 1 changesets with 1 changes to 1 files (+1 heads)
869 added 1 changesets with 1 changes to 1 files (+1 heads)
870 (run 'hg heads .' to see heads, 'hg merge' to merge)
870 (run 'hg heads .' to see heads, 'hg merge' to merge)
871 $ cat main-error.log
871 $ cat main-error.log
872
872
873 push over ssh
873 push over ssh
874
874
875 $ hg -R main push ssh://user@dummy/other -r 5fddd98957c8
875 $ hg -R main push ssh://user@dummy/other -r 5fddd98957c8
876 pushing to ssh://user@dummy/other
876 pushing to ssh://user@dummy/other
877 searching for changes
877 searching for changes
878 remote: adding changesets
878 remote: adding changesets
879 remote: adding manifests
879 remote: adding manifests
880 remote: adding file changes
880 remote: adding file changes
881 remote: added 1 changesets with 1 changes to 1 files
881 remote: added 1 changesets with 1 changes to 1 files
882 $ hg -R other log -G
882 $ hg -R other log -G
883 o 6:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits@gmail.com> C
883 o 6:5fddd98957c8 draft Nicolas Dumazet <nicdumz.commits@gmail.com> C
884 |
884 |
885 o 5:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits@gmail.com> B
885 o 5:42ccdea3bb16 draft Nicolas Dumazet <nicdumz.commits@gmail.com> B
886 |
886 |
887 | o 4:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
887 | o 4:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
888 | |
888 | |
889 | | o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
889 | | o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
890 | |/|
890 | |/|
891 | o | 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
891 | o | 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
892 |/ /
892 |/ /
893 | @ 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
893 | @ 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
894 |/
894 |/
895 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
895 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
896
896
897
897
898 push over http
898 push over http
899
899
900 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
900 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
901 $ cat other.pid >> $DAEMON_PIDS
901 $ cat other.pid >> $DAEMON_PIDS
902
902
903 $ hg -R main phase --public 32af7686d403
903 $ hg -R main phase --public 32af7686d403
904 $ hg -R main push http://localhost:$HGPORT2/ -r 32af7686d403
904 $ hg -R main push http://localhost:$HGPORT2/ -r 32af7686d403
905 pushing to http://localhost:$HGPORT2/
905 pushing to http://localhost:$HGPORT2/
906 searching for changes
906 searching for changes
907 remote: adding changesets
907 remote: adding changesets
908 remote: adding manifests
908 remote: adding manifests
909 remote: adding file changes
909 remote: adding file changes
910 remote: added 1 changesets with 1 changes to 1 files
910 remote: added 1 changesets with 1 changes to 1 files
911 $ cat other-error.log
911 $ cat other-error.log
912
912
913 Check final content.
913 Check final content.
914
914
915 $ hg -R other log -G
915 $ hg -R other log -G
916 o 7:32af7686d403 public Nicolas Dumazet <nicdumz.commits@gmail.com> D
916 o 7:32af7686d403 public Nicolas Dumazet <nicdumz.commits@gmail.com> D
917 |
917 |
918 o 6:5fddd98957c8 public Nicolas Dumazet <nicdumz.commits@gmail.com> C
918 o 6:5fddd98957c8 public Nicolas Dumazet <nicdumz.commits@gmail.com> C
919 |
919 |
920 o 5:42ccdea3bb16 public Nicolas Dumazet <nicdumz.commits@gmail.com> B
920 o 5:42ccdea3bb16 public Nicolas Dumazet <nicdumz.commits@gmail.com> B
921 |
921 |
922 | o 4:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
922 | o 4:02de42196ebe draft Nicolas Dumazet <nicdumz.commits@gmail.com> H
923 | |
923 | |
924 | | o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
924 | | o 3:eea13746799a public Nicolas Dumazet <nicdumz.commits@gmail.com> G
925 | |/|
925 | |/|
926 | o | 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
926 | o | 2:24b6387c8c8c public Nicolas Dumazet <nicdumz.commits@gmail.com> F
927 |/ /
927 |/ /
928 | @ 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
928 | @ 1:9520eea781bc public Nicolas Dumazet <nicdumz.commits@gmail.com> E
929 |/
929 |/
930 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
930 o 0:cd010b8cd998 public Nicolas Dumazet <nicdumz.commits@gmail.com> A
931
931
932
932
933 Error Handling
933 Error Handling
934 ==============
934 ==============
935
935
936 Check that errors are properly returned to the client during push.
936 Check that errors are properly returned to the client during push.
937
937
938 Setting up
938 Setting up
939
939
940 $ cat > failpush.py << EOF
940 $ cat > failpush.py << EOF
941 > """A small extension that makes push fails when using bundle2
941 > """A small extension that makes push fails when using bundle2
942 >
942 >
943 > used to test error handling in bundle2
943 > used to test error handling in bundle2
944 > """
944 > """
945 >
945 >
946 > from mercurial import util
946 > from mercurial import util
947 > from mercurial import bundle2
947 > from mercurial import bundle2
948 > from mercurial import exchange
948 > from mercurial import exchange
949 > from mercurial import extensions
949 > from mercurial import extensions
950 >
950 >
951 > def _pushbundle2failpart(pushop, bundler):
951 > def _pushbundle2failpart(pushop, bundler):
952 > reason = pushop.ui.config('failpush', 'reason', None)
952 > reason = pushop.ui.config('failpush', 'reason', None)
953 > part = None
953 > part = None
954 > if reason == 'abort':
954 > if reason == 'abort':
955 > bundler.newpart('test:abort')
955 > bundler.newpart('test:abort')
956 > if reason == 'unknown':
956 > if reason == 'unknown':
957 > bundler.newpart('TEST:UNKNOWN')
957 > bundler.newpart('TEST:UNKNOWN')
958 > if reason == 'race':
958 > if reason == 'race':
959 > # 20 Bytes of crap
959 > # 20 Bytes of crap
960 > bundler.newpart('b2x:check:heads', data='01234567890123456789')
960 > bundler.newpart('b2x:check:heads', data='01234567890123456789')
961 >
961 >
962 > @bundle2.parthandler("test:abort")
962 > @bundle2.parthandler("test:abort")
963 > def handleabort(op, part):
963 > def handleabort(op, part):
964 > raise util.Abort('Abandon ship!', hint="don't panic")
964 > raise util.Abort('Abandon ship!', hint="don't panic")
965 >
965 >
966 > def uisetup(ui):
966 > def uisetup(ui):
967 > exchange.bundle2partsgenerators.insert(0, _pushbundle2failpart)
967 > exchange.bundle2partsgenerators.insert(0, _pushbundle2failpart)
968 >
968 >
969 > EOF
969 > EOF
970
970
971 $ cd main
971 $ cd main
972 $ hg up tip
972 $ hg up tip
973 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
973 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
974 $ echo 'I' > I
974 $ echo 'I' > I
975 $ hg add I
975 $ hg add I
976 $ hg ci -m 'I'
976 $ hg ci -m 'I'
977 $ hg id
977 $ hg id
978 e7ec4e813ba6 tip
978 e7ec4e813ba6 tip
979 $ cd ..
979 $ cd ..
980
980
981 $ cat << EOF >> $HGRCPATH
981 $ cat << EOF >> $HGRCPATH
982 > [extensions]
982 > [extensions]
983 > failpush=$TESTTMP/failpush.py
983 > failpush=$TESTTMP/failpush.py
984 > EOF
984 > EOF
985
985
986 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
986 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
987 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
987 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
988 $ cat other.pid >> $DAEMON_PIDS
988 $ cat other.pid >> $DAEMON_PIDS
989
989
990 Doing the actual push: Abort error
990 Doing the actual push: Abort error
991
991
992 $ cat << EOF >> $HGRCPATH
992 $ cat << EOF >> $HGRCPATH
993 > [failpush]
993 > [failpush]
994 > reason = abort
994 > reason = abort
995 > EOF
995 > EOF
996
996
997 $ hg -R main push other -r e7ec4e813ba6
997 $ hg -R main push other -r e7ec4e813ba6
998 pushing to other
998 pushing to other
999 searching for changes
999 searching for changes
1000 abort: Abandon ship!
1000 abort: Abandon ship!
1001 (don't panic)
1001 (don't panic)
1002 [255]
1002 [255]
1003
1003
1004 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1004 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1005 pushing to ssh://user@dummy/other
1005 pushing to ssh://user@dummy/other
1006 searching for changes
1006 searching for changes
1007 abort: Abandon ship!
1007 abort: Abandon ship!
1008 (don't panic)
1008 (don't panic)
1009 [255]
1009 [255]
1010
1010
1011 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1011 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1012 pushing to http://localhost:$HGPORT2/
1012 pushing to http://localhost:$HGPORT2/
1013 searching for changes
1013 searching for changes
1014 abort: Abandon ship!
1014 abort: Abandon ship!
1015 (don't panic)
1015 (don't panic)
1016 [255]
1016 [255]
1017
1017
1018
1018
1019 Doing the actual push: unknown mandatory parts
1019 Doing the actual push: unknown mandatory parts
1020
1020
1021 $ cat << EOF >> $HGRCPATH
1021 $ cat << EOF >> $HGRCPATH
1022 > [failpush]
1022 > [failpush]
1023 > reason = unknown
1023 > reason = unknown
1024 > EOF
1024 > EOF
1025
1025
1026 $ hg -R main push other -r e7ec4e813ba6
1026 $ hg -R main push other -r e7ec4e813ba6
1027 pushing to other
1027 pushing to other
1028 searching for changes
1028 searching for changes
1029 abort: missing support for test:unknown
1029 abort: missing support for test:unknown
1030 [255]
1030 [255]
1031
1031
1032 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1032 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1033 pushing to ssh://user@dummy/other
1033 pushing to ssh://user@dummy/other
1034 searching for changes
1034 searching for changes
1035 abort: missing support for test:unknown
1035 abort: missing support for test:unknown
1036 [255]
1036 [255]
1037
1037
1038 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1038 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1039 pushing to http://localhost:$HGPORT2/
1039 pushing to http://localhost:$HGPORT2/
1040 searching for changes
1040 searching for changes
1041 abort: missing support for test:unknown
1041 abort: missing support for test:unknown
1042 [255]
1042 [255]
1043
1043
1044 Doing the actual push: race
1044 Doing the actual push: race
1045
1045
1046 $ cat << EOF >> $HGRCPATH
1046 $ cat << EOF >> $HGRCPATH
1047 > [failpush]
1047 > [failpush]
1048 > reason = race
1048 > reason = race
1049 > EOF
1049 > EOF
1050
1050
1051 $ hg -R main push other -r e7ec4e813ba6
1051 $ hg -R main push other -r e7ec4e813ba6
1052 pushing to other
1052 pushing to other
1053 searching for changes
1053 searching for changes
1054 abort: push failed:
1054 abort: push failed:
1055 'repository changed while pushing - please try again'
1055 'repository changed while pushing - please try again'
1056 [255]
1056 [255]
1057
1057
1058 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1058 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1059 pushing to ssh://user@dummy/other
1059 pushing to ssh://user@dummy/other
1060 searching for changes
1060 searching for changes
1061 abort: push failed:
1061 abort: push failed:
1062 'repository changed while pushing - please try again'
1062 'repository changed while pushing - please try again'
1063 [255]
1063 [255]
1064
1064
1065 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1065 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1066 pushing to http://localhost:$HGPORT2/
1066 pushing to http://localhost:$HGPORT2/
1067 searching for changes
1067 searching for changes
1068 abort: push failed:
1068 abort: push failed:
1069 'repository changed while pushing - please try again'
1069 'repository changed while pushing - please try again'
1070 [255]
1070 [255]
1071
1071
1072 Doing the actual push: hook abort
1072 Doing the actual push: hook abort
1073
1073
1074 $ cat << EOF >> $HGRCPATH
1074 $ cat << EOF >> $HGRCPATH
1075 > [failpush]
1075 > [failpush]
1076 > reason =
1076 > reason =
1077 > [hooks]
1077 > [hooks]
1078 > b2x-pretransactionclose.failpush = false
1078 > b2x-pretransactionclose.failpush = false
1079 > EOF
1079 > EOF
1080
1080
1081 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1081 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1082 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
1082 $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
1083 $ cat other.pid >> $DAEMON_PIDS
1083 $ cat other.pid >> $DAEMON_PIDS
1084
1084
1085 $ hg -R main push other -r e7ec4e813ba6
1085 $ hg -R main push other -r e7ec4e813ba6
1086 pushing to other
1086 pushing to other
1087 searching for changes
1087 searching for changes
1088 transaction abort!
1088 transaction abort!
1089 rollback completed
1089 rollback completed
1090 abort: b2x-pretransactionclose.failpush hook exited with status 1
1090 abort: b2x-pretransactionclose.failpush hook exited with status 1
1091 [255]
1091 [255]
1092
1092
1093 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1093 $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
1094 pushing to ssh://user@dummy/other
1094 pushing to ssh://user@dummy/other
1095 searching for changes
1095 searching for changes
1096 abort: b2x-pretransactionclose.failpush hook exited with status 1
1096 abort: b2x-pretransactionclose.failpush hook exited with status 1
1097 remote: transaction abort!
1097 remote: transaction abort!
1098 remote: rollback completed
1098 remote: rollback completed
1099 [255]
1099 [255]
1100
1100
1101 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1101 $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
1102 pushing to http://localhost:$HGPORT2/
1102 pushing to http://localhost:$HGPORT2/
1103 searching for changes
1103 searching for changes
1104 abort: b2x-pretransactionclose.failpush hook exited with status 1
1104 abort: b2x-pretransactionclose.failpush hook exited with status 1
1105 [255]
1105 [255]
1106
1106
1107
1107
General Comments 0
You need to be logged in to leave comments. Login now