##// END OF EJS Templates
incoming: handle phases the same as pull...
Eric Sumner -
r23633:96c3cbec default
parent child Browse files
Show More
@@ -1,428 +1,446 b''
1 1 # bundlerepo.py - repository class for viewing uncompressed bundles
2 2 #
3 3 # Copyright 2006, 2007 Benoit Boissinot <bboissin@gmail.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 """Repository class for viewing uncompressed bundles.
9 9
10 10 This provides a read-only repository interface to bundles as if they
11 11 were part of the actual repository.
12 12 """
13 13
14 14 from node import nullid
15 15 from i18n import _
16 16 import os, tempfile, shutil
17 17 import changegroup, util, mdiff, discovery, cmdutil, scmutil, exchange
18 18 import localrepo, changelog, manifest, filelog, revlog, error, phases
19 19
20 20 class bundlerevlog(revlog.revlog):
21 21 def __init__(self, opener, indexfile, bundle, linkmapper):
22 22 # How it works:
23 23 # To retrieve a revision, we need to know the offset of the revision in
24 24 # the bundle (an unbundle object). We store this offset in the index
25 25 # (start). The base of the delta is stored in the base field.
26 26 #
27 27 # To differentiate a rev in the bundle from a rev in the revlog, we
28 28 # check revision against repotiprev.
29 29 opener = scmutil.readonlyvfs(opener)
30 30 revlog.revlog.__init__(self, opener, indexfile)
31 31 self.bundle = bundle
32 32 n = len(self)
33 33 self.repotiprev = n - 1
34 34 chain = None
35 35 self.bundlerevs = set() # used by 'bundle()' revset expression
36 36 while True:
37 37 chunkdata = bundle.deltachunk(chain)
38 38 if not chunkdata:
39 39 break
40 40 node = chunkdata['node']
41 41 p1 = chunkdata['p1']
42 42 p2 = chunkdata['p2']
43 43 cs = chunkdata['cs']
44 44 deltabase = chunkdata['deltabase']
45 45 delta = chunkdata['delta']
46 46
47 47 size = len(delta)
48 48 start = bundle.tell() - size
49 49
50 50 link = linkmapper(cs)
51 51 if node in self.nodemap:
52 52 # this can happen if two branches make the same change
53 53 chain = node
54 54 self.bundlerevs.add(self.nodemap[node])
55 55 continue
56 56
57 57 for p in (p1, p2):
58 58 if p not in self.nodemap:
59 59 raise error.LookupError(p, self.indexfile,
60 60 _("unknown parent"))
61 61
62 62 if deltabase not in self.nodemap:
63 63 raise LookupError(deltabase, self.indexfile,
64 64 _('unknown delta base'))
65 65
66 66 baserev = self.rev(deltabase)
67 67 # start, size, full unc. size, base (unused), link, p1, p2, node
68 68 e = (revlog.offset_type(start, 0), size, -1, baserev, link,
69 69 self.rev(p1), self.rev(p2), node)
70 70 self.index.insert(-1, e)
71 71 self.nodemap[node] = n
72 72 self.bundlerevs.add(n)
73 73 chain = node
74 74 n += 1
75 75
76 76 def _chunk(self, rev):
77 77 # Warning: in case of bundle, the diff is against what we stored as
78 78 # delta base, not against rev - 1
79 79 # XXX: could use some caching
80 80 if rev <= self.repotiprev:
81 81 return revlog.revlog._chunk(self, rev)
82 82 self.bundle.seek(self.start(rev))
83 83 return self.bundle.read(self.length(rev))
84 84
85 85 def revdiff(self, rev1, rev2):
86 86 """return or calculate a delta between two revisions"""
87 87 if rev1 > self.repotiprev and rev2 > self.repotiprev:
88 88 # hot path for bundle
89 89 revb = self.index[rev2][3]
90 90 if revb == rev1:
91 91 return self._chunk(rev2)
92 92 elif rev1 <= self.repotiprev and rev2 <= self.repotiprev:
93 93 return revlog.revlog.revdiff(self, rev1, rev2)
94 94
95 95 return mdiff.textdiff(self.revision(self.node(rev1)),
96 96 self.revision(self.node(rev2)))
97 97
98 98 def revision(self, nodeorrev):
99 99 """return an uncompressed revision of a given node or revision
100 100 number.
101 101 """
102 102 if isinstance(nodeorrev, int):
103 103 rev = nodeorrev
104 104 node = self.node(rev)
105 105 else:
106 106 node = nodeorrev
107 107 rev = self.rev(node)
108 108
109 109 if node == nullid:
110 110 return ""
111 111
112 112 text = None
113 113 chain = []
114 114 iterrev = rev
115 115 # reconstruct the revision if it is from a changegroup
116 116 while iterrev > self.repotiprev:
117 117 if self._cache and self._cache[1] == iterrev:
118 118 text = self._cache[2]
119 119 break
120 120 chain.append(iterrev)
121 121 iterrev = self.index[iterrev][3]
122 122 if text is None:
123 123 text = self.baserevision(iterrev)
124 124
125 125 while chain:
126 126 delta = self._chunk(chain.pop())
127 127 text = mdiff.patches(text, [delta])
128 128
129 129 self._checkhash(text, node, rev)
130 130 self._cache = (node, rev, text)
131 131 return text
132 132
133 133 def baserevision(self, nodeorrev):
134 134 # Revlog subclasses may override 'revision' method to modify format of
135 135 # content retrieved from revlog. To use bundlerevlog with such class one
136 136 # needs to override 'baserevision' and make more specific call here.
137 137 return revlog.revlog.revision(self, nodeorrev)
138 138
139 139 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
140 140 raise NotImplementedError
141 141 def addgroup(self, revs, linkmapper, transaction):
142 142 raise NotImplementedError
143 143 def strip(self, rev, minlink):
144 144 raise NotImplementedError
145 145 def checksize(self):
146 146 raise NotImplementedError
147 147
148 148 class bundlechangelog(bundlerevlog, changelog.changelog):
149 149 def __init__(self, opener, bundle):
150 150 changelog.changelog.__init__(self, opener)
151 151 linkmapper = lambda x: x
152 152 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
153 153 linkmapper)
154 154
155 155 def baserevision(self, nodeorrev):
156 156 # Although changelog doesn't override 'revision' method, some extensions
157 157 # may replace this class with another that does. Same story with
158 158 # manifest and filelog classes.
159 159 return changelog.changelog.revision(self, nodeorrev)
160 160
161 161 class bundlemanifest(bundlerevlog, manifest.manifest):
162 162 def __init__(self, opener, bundle, linkmapper):
163 163 manifest.manifest.__init__(self, opener)
164 164 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
165 165 linkmapper)
166 166
167 167 def baserevision(self, nodeorrev):
168 168 return manifest.manifest.revision(self, nodeorrev)
169 169
170 170 class bundlefilelog(bundlerevlog, filelog.filelog):
171 171 def __init__(self, opener, path, bundle, linkmapper, repo):
172 172 filelog.filelog.__init__(self, opener, path)
173 173 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
174 174 linkmapper)
175 175 self._repo = repo
176 176
177 177 def baserevision(self, nodeorrev):
178 178 return filelog.filelog.revision(self, nodeorrev)
179 179
180 180 def _file(self, f):
181 181 self._repo.file(f)
182 182
183 183 class bundlepeer(localrepo.localpeer):
184 184 def canpush(self):
185 185 return False
186 186
187 187 class bundlephasecache(phases.phasecache):
188 188 def __init__(self, *args, **kwargs):
189 189 super(bundlephasecache, self).__init__(*args, **kwargs)
190 190 if util.safehasattr(self, 'opener'):
191 191 self.opener = scmutil.readonlyvfs(self.opener)
192 192
193 193 def write(self):
194 194 raise NotImplementedError
195 195
196 196 def _write(self, fp):
197 197 raise NotImplementedError
198 198
199 199 def _updateroots(self, phase, newroots, tr):
200 200 self.phaseroots[phase] = newroots
201 201 self.invalidate()
202 202 self.dirty = True
203 203
204 204 class bundlerepository(localrepo.localrepository):
205 205 def __init__(self, ui, path, bundlename):
206 206 self._tempparent = None
207 207 try:
208 208 localrepo.localrepository.__init__(self, ui, path)
209 209 except error.RepoError:
210 210 self._tempparent = tempfile.mkdtemp()
211 211 localrepo.instance(ui, self._tempparent, 1)
212 212 localrepo.localrepository.__init__(self, ui, self._tempparent)
213 213 self.ui.setconfig('phases', 'publish', False, 'bundlerepo')
214 214
215 215 if path:
216 216 self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
217 217 else:
218 218 self._url = 'bundle:' + bundlename
219 219
220 220 self.tempfile = None
221 221 f = util.posixfile(bundlename, "rb")
222 222 self.bundle = exchange.readbundle(ui, f, bundlename)
223 223 if self.bundle.compressed():
224 224 fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-",
225 225 suffix=".hg10un")
226 226 self.tempfile = temp
227 227 fptemp = os.fdopen(fdtemp, 'wb')
228 228
229 229 try:
230 230 fptemp.write("HG10UN")
231 231 while True:
232 232 chunk = self.bundle.read(2**18)
233 233 if not chunk:
234 234 break
235 235 fptemp.write(chunk)
236 236 finally:
237 237 fptemp.close()
238 238
239 239 f = self.vfs.open(self.tempfile, mode="rb")
240 240 self.bundle = exchange.readbundle(ui, f, bundlename, self.vfs)
241 241
242 242 # dict with the mapping 'filename' -> position in the bundle
243 243 self.bundlefilespos = {}
244 244
245 245 self.firstnewrev = self.changelog.repotiprev + 1
246 246 phases.retractboundary(self, None, phases.draft,
247 247 [ctx.node() for ctx in self[self.firstnewrev:]])
248 248
249 249 @localrepo.unfilteredpropertycache
250 250 def _phasecache(self):
251 251 return bundlephasecache(self, self._phasedefaults)
252 252
253 253 @localrepo.unfilteredpropertycache
254 254 def changelog(self):
255 255 # consume the header if it exists
256 256 self.bundle.changelogheader()
257 257 c = bundlechangelog(self.sopener, self.bundle)
258 258 self.manstart = self.bundle.tell()
259 259 return c
260 260
261 261 @localrepo.unfilteredpropertycache
262 262 def manifest(self):
263 263 self.bundle.seek(self.manstart)
264 264 # consume the header if it exists
265 265 self.bundle.manifestheader()
266 266 m = bundlemanifest(self.sopener, self.bundle, self.changelog.rev)
267 267 self.filestart = self.bundle.tell()
268 268 return m
269 269
270 270 @localrepo.unfilteredpropertycache
271 271 def manstart(self):
272 272 self.changelog
273 273 return self.manstart
274 274
275 275 @localrepo.unfilteredpropertycache
276 276 def filestart(self):
277 277 self.manifest
278 278 return self.filestart
279 279
280 280 def url(self):
281 281 return self._url
282 282
283 283 def file(self, f):
284 284 if not self.bundlefilespos:
285 285 self.bundle.seek(self.filestart)
286 286 while True:
287 287 chunkdata = self.bundle.filelogheader()
288 288 if not chunkdata:
289 289 break
290 290 fname = chunkdata['filename']
291 291 self.bundlefilespos[fname] = self.bundle.tell()
292 292 while True:
293 293 c = self.bundle.deltachunk(None)
294 294 if not c:
295 295 break
296 296
297 297 if f in self.bundlefilespos:
298 298 self.bundle.seek(self.bundlefilespos[f])
299 299 return bundlefilelog(self.sopener, f, self.bundle,
300 300 self.changelog.rev, self)
301 301 else:
302 302 return filelog.filelog(self.sopener, f)
303 303
304 304 def close(self):
305 305 """Close assigned bundle file immediately."""
306 306 self.bundle.close()
307 307 if self.tempfile is not None:
308 308 self.vfs.unlink(self.tempfile)
309 309 if self._tempparent:
310 310 shutil.rmtree(self._tempparent, True)
311 311
312 312 def cancopy(self):
313 313 return False
314 314
315 315 def peer(self):
316 316 return bundlepeer(self)
317 317
318 318 def getcwd(self):
319 319 return os.getcwd() # always outside the repo
320 320
321 321
322 322 def instance(ui, path, create):
323 323 if create:
324 324 raise util.Abort(_('cannot create new bundle repository'))
325 325 parentpath = ui.config("bundle", "mainreporoot", "")
326 326 if not parentpath:
327 327 # try to find the correct path to the working directory repo
328 328 parentpath = cmdutil.findrepo(os.getcwd())
329 329 if parentpath is None:
330 330 parentpath = ''
331 331 if parentpath:
332 332 # Try to make the full path relative so we get a nice, short URL.
333 333 # In particular, we don't want temp dir names in test outputs.
334 334 cwd = os.getcwd()
335 335 if parentpath == cwd:
336 336 parentpath = ''
337 337 else:
338 338 cwd = os.path.join(cwd,'')
339 339 if parentpath.startswith(cwd):
340 340 parentpath = parentpath[len(cwd):]
341 341 u = util.url(path)
342 342 path = u.localpath()
343 343 if u.scheme == 'bundle':
344 344 s = path.split("+", 1)
345 345 if len(s) == 1:
346 346 repopath, bundlename = parentpath, s[0]
347 347 else:
348 348 repopath, bundlename = s
349 349 else:
350 350 repopath, bundlename = parentpath, path
351 351 return bundlerepository(ui, repopath, bundlename)
352 352
353 class bundletransactionmanager(object):
354 def transaction(self):
355 return None
356
357 def close(self):
358 raise NotImplementedError
359
360 def release(self):
361 raise NotImplementedError
362
353 363 def getremotechanges(ui, repo, other, onlyheads=None, bundlename=None,
354 364 force=False):
355 365 '''obtains a bundle of changes incoming from other
356 366
357 367 "onlyheads" restricts the returned changes to those reachable from the
358 368 specified heads.
359 369 "bundlename", if given, stores the bundle to this file path permanently;
360 370 otherwise it's stored to a temp file and gets deleted again when you call
361 371 the returned "cleanupfn".
362 372 "force" indicates whether to proceed on unrelated repos.
363 373
364 374 Returns a tuple (local, csets, cleanupfn):
365 375
366 376 "local" is a local repo from which to obtain the actual incoming
367 377 changesets; it is a bundlerepo for the obtained bundle when the
368 378 original "other" is remote.
369 379 "csets" lists the incoming changeset node ids.
370 380 "cleanupfn" must be called without arguments when you're done processing
371 381 the changes; it closes both the original "other" and the one returned
372 382 here.
373 383 '''
374 384 tmp = discovery.findcommonincoming(repo, other, heads=onlyheads,
375 385 force=force)
376 386 common, incoming, rheads = tmp
377 387 if not incoming:
378 388 try:
379 389 if bundlename:
380 390 os.unlink(bundlename)
381 391 except OSError:
382 392 pass
383 393 return repo, [], other.close
384 394
385 395 commonset = set(common)
386 396 rheads = [x for x in rheads if x not in commonset]
387 397
388 398 bundle = None
389 399 bundlerepo = None
390 400 localrepo = other.local()
391 401 if bundlename or not localrepo:
392 402 # create a bundle (uncompressed if other repo is not local)
393 403
394 404 if other.capable('getbundle'):
395 405 cg = other.getbundle('incoming', common=common, heads=rheads)
396 406 elif onlyheads is None and not other.capable('changegroupsubset'):
397 407 # compat with older servers when pulling all remote heads
398 408 cg = other.changegroup(incoming, "incoming")
399 409 rheads = None
400 410 else:
401 411 cg = other.changegroupsubset(incoming, rheads, 'incoming')
402 412 bundletype = localrepo and "HG10BZ" or "HG10UN"
403 413 fname = bundle = changegroup.writebundle(cg, bundlename, bundletype)
404 414 # keep written bundle?
405 415 if bundlename:
406 416 bundle = None
407 417 if not localrepo:
408 418 # use the created uncompressed bundlerepo
409 419 localrepo = bundlerepo = bundlerepository(repo.baseui, repo.root,
410 420 fname)
411 421 # this repo contains local and other now, so filter out local again
412 422 common = repo.heads()
413 423 if localrepo:
414 424 # Part of common may be remotely filtered
415 425 # So use an unfiltered version
416 426 # The discovery process probably need cleanup to avoid that
417 427 localrepo = localrepo.unfiltered()
418 428
419 429 csets = localrepo.changelog.findmissing(common, rheads)
420 430
431 if bundlerepo:
432 reponodes = [ctx.node() for ctx in bundlerepo[bundlerepo.firstnewrev:]]
433 remotephases = other.listkeys('phases')
434
435 pullop = exchange.pulloperation(bundlerepo, other, heads=reponodes)
436 pullop.trmanager = bundletransactionmanager()
437 exchange._pullapplyphases(pullop, remotephases)
438
421 439 def cleanup():
422 440 if bundlerepo:
423 441 bundlerepo.close()
424 442 if bundle:
425 443 os.unlink(bundle)
426 444 other.close()
427 445
428 446 return (localrepo, csets, cleanup)
@@ -1,408 +1,409 b''
1 1
2 2 Function to test discovery between two repos in both directions, using both the local shortcut
3 3 (which is currently not activated by default) and the full remotable protocol:
4 4
5 5 $ testdesc() { # revs_a, revs_b, dagdesc
6 6 > if [ -d foo ]; then rm -rf foo; fi
7 7 > hg init foo
8 8 > cd foo
9 9 > hg debugbuilddag "$3"
10 10 > hg clone . a $1 --quiet
11 11 > hg clone . b $2 --quiet
12 12 > echo
13 13 > echo "% -- a -> b tree"
14 14 > hg -R a debugdiscovery b --verbose --old
15 15 > echo
16 16 > echo "% -- a -> b set"
17 17 > hg -R a debugdiscovery b --verbose --debug
18 18 > echo
19 19 > echo "% -- b -> a tree"
20 20 > hg -R b debugdiscovery a --verbose --old
21 21 > echo
22 22 > echo "% -- b -> a set"
23 23 > hg -R b debugdiscovery a --verbose --debug
24 24 > cd ..
25 25 > }
26 26
27 27
28 28 Small superset:
29 29
30 30 $ testdesc '-ra1 -ra2' '-rb1 -rb2 -rb3' '
31 31 > +2:f +1:a1:b1
32 32 > <f +4 :a2
33 33 > +5 :b2
34 34 > <f +3 :b3'
35 35
36 36 % -- a -> b tree
37 37 comparing with b
38 38 searching for changes
39 39 unpruned common: 01241442b3c2 66f7d451a68b b5714e113bc0
40 40 common heads: 01241442b3c2 b5714e113bc0
41 41 local is subset
42 42
43 43 % -- a -> b set
44 44 comparing with b
45 45 query 1; heads
46 46 searching for changes
47 47 all local heads known remotely
48 48 common heads: 01241442b3c2 b5714e113bc0
49 49 local is subset
50 50
51 51 % -- b -> a tree
52 52 comparing with a
53 53 searching for changes
54 54 unpruned common: 01241442b3c2 b5714e113bc0
55 55 common heads: 01241442b3c2 b5714e113bc0
56 56 remote is subset
57 57
58 58 % -- b -> a set
59 59 comparing with a
60 60 query 1; heads
61 61 searching for changes
62 62 all remote heads known locally
63 63 common heads: 01241442b3c2 b5714e113bc0
64 64 remote is subset
65 65
66 66
67 67 Many new:
68 68
69 69 $ testdesc '-ra1 -ra2' '-rb' '
70 70 > +2:f +3:a1 +3:b
71 71 > <f +30 :a2'
72 72
73 73 % -- a -> b tree
74 74 comparing with b
75 75 searching for changes
76 76 unpruned common: bebd167eb94d
77 77 common heads: bebd167eb94d
78 78
79 79 % -- a -> b set
80 80 comparing with b
81 81 query 1; heads
82 82 searching for changes
83 83 taking initial sample
84 84 searching: 2 queries
85 85 query 2; still undecided: 29, sample size is: 29
86 86 2 total queries
87 87 common heads: bebd167eb94d
88 88
89 89 % -- b -> a tree
90 90 comparing with a
91 91 searching for changes
92 92 unpruned common: 66f7d451a68b bebd167eb94d
93 93 common heads: bebd167eb94d
94 94
95 95 % -- b -> a set
96 96 comparing with a
97 97 query 1; heads
98 98 searching for changes
99 99 taking initial sample
100 100 searching: 2 queries
101 101 query 2; still undecided: 2, sample size is: 2
102 102 2 total queries
103 103 common heads: bebd167eb94d
104 104
105 105
106 106 Both sides many new with stub:
107 107
108 108 $ testdesc '-ra1 -ra2' '-rb' '
109 109 > +2:f +2:a1 +30 :b
110 110 > <f +30 :a2'
111 111
112 112 % -- a -> b tree
113 113 comparing with b
114 114 searching for changes
115 115 unpruned common: 2dc09a01254d
116 116 common heads: 2dc09a01254d
117 117
118 118 % -- a -> b set
119 119 comparing with b
120 120 query 1; heads
121 121 searching for changes
122 122 taking initial sample
123 123 searching: 2 queries
124 124 query 2; still undecided: 29, sample size is: 29
125 125 2 total queries
126 126 common heads: 2dc09a01254d
127 127
128 128 % -- b -> a tree
129 129 comparing with a
130 130 searching for changes
131 131 unpruned common: 2dc09a01254d 66f7d451a68b
132 132 common heads: 2dc09a01254d
133 133
134 134 % -- b -> a set
135 135 comparing with a
136 136 query 1; heads
137 137 searching for changes
138 138 taking initial sample
139 139 searching: 2 queries
140 140 query 2; still undecided: 29, sample size is: 29
141 141 2 total queries
142 142 common heads: 2dc09a01254d
143 143
144 144
145 145 Both many new:
146 146
147 147 $ testdesc '-ra' '-rb' '
148 148 > +2:f +30 :b
149 149 > <f +30 :a'
150 150
151 151 % -- a -> b tree
152 152 comparing with b
153 153 searching for changes
154 154 unpruned common: 66f7d451a68b
155 155 common heads: 66f7d451a68b
156 156
157 157 % -- a -> b set
158 158 comparing with b
159 159 query 1; heads
160 160 searching for changes
161 161 taking quick initial sample
162 162 searching: 2 queries
163 163 query 2; still undecided: 31, sample size is: 31
164 164 2 total queries
165 165 common heads: 66f7d451a68b
166 166
167 167 % -- b -> a tree
168 168 comparing with a
169 169 searching for changes
170 170 unpruned common: 66f7d451a68b
171 171 common heads: 66f7d451a68b
172 172
173 173 % -- b -> a set
174 174 comparing with a
175 175 query 1; heads
176 176 searching for changes
177 177 taking quick initial sample
178 178 searching: 2 queries
179 179 query 2; still undecided: 31, sample size is: 31
180 180 2 total queries
181 181 common heads: 66f7d451a68b
182 182
183 183
184 184 Both many new skewed:
185 185
186 186 $ testdesc '-ra' '-rb' '
187 187 > +2:f +30 :b
188 188 > <f +50 :a'
189 189
190 190 % -- a -> b tree
191 191 comparing with b
192 192 searching for changes
193 193 unpruned common: 66f7d451a68b
194 194 common heads: 66f7d451a68b
195 195
196 196 % -- a -> b set
197 197 comparing with b
198 198 query 1; heads
199 199 searching for changes
200 200 taking quick initial sample
201 201 searching: 2 queries
202 202 query 2; still undecided: 51, sample size is: 51
203 203 2 total queries
204 204 common heads: 66f7d451a68b
205 205
206 206 % -- b -> a tree
207 207 comparing with a
208 208 searching for changes
209 209 unpruned common: 66f7d451a68b
210 210 common heads: 66f7d451a68b
211 211
212 212 % -- b -> a set
213 213 comparing with a
214 214 query 1; heads
215 215 searching for changes
216 216 taking quick initial sample
217 217 searching: 2 queries
218 218 query 2; still undecided: 31, sample size is: 31
219 219 2 total queries
220 220 common heads: 66f7d451a68b
221 221
222 222
223 223 Both many new on top of long history:
224 224
225 225 $ testdesc '-ra' '-rb' '
226 226 > +1000:f +30 :b
227 227 > <f +50 :a'
228 228
229 229 % -- a -> b tree
230 230 comparing with b
231 231 searching for changes
232 232 unpruned common: 7ead0cba2838
233 233 common heads: 7ead0cba2838
234 234
235 235 % -- a -> b set
236 236 comparing with b
237 237 query 1; heads
238 238 searching for changes
239 239 taking quick initial sample
240 240 searching: 2 queries
241 241 query 2; still undecided: 1049, sample size is: 11
242 242 sampling from both directions
243 243 searching: 3 queries
244 244 query 3; still undecided: 31, sample size is: 31
245 245 3 total queries
246 246 common heads: 7ead0cba2838
247 247
248 248 % -- b -> a tree
249 249 comparing with a
250 250 searching for changes
251 251 unpruned common: 7ead0cba2838
252 252 common heads: 7ead0cba2838
253 253
254 254 % -- b -> a set
255 255 comparing with a
256 256 query 1; heads
257 257 searching for changes
258 258 taking quick initial sample
259 259 searching: 2 queries
260 260 query 2; still undecided: 1029, sample size is: 11
261 261 sampling from both directions
262 262 searching: 3 queries
263 263 query 3; still undecided: 15, sample size is: 15
264 264 3 total queries
265 265 common heads: 7ead0cba2838
266 266
267 267
268 268 One with >200 heads, which used to use up all of the sample:
269 269
270 270 $ hg init manyheads
271 271 $ cd manyheads
272 272 $ echo "+300:r @a" >dagdesc
273 273 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
274 274 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
275 275 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
276 276 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
277 277 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
278 278 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
279 279 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
280 280 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
281 281 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
282 282 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
283 283 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
284 284 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
285 285 $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
286 286 $ echo "@b *r+3" >>dagdesc # one more head
287 287 $ hg debugbuilddag <dagdesc
288 288 reading DAG from stdin
289 289
290 290 $ hg heads -t --template . | wc -c
291 291 \s*261 (re)
292 292
293 293 $ hg clone -b a . a
294 294 adding changesets
295 295 adding manifests
296 296 adding file changes
297 297 added 1340 changesets with 0 changes to 0 files (+259 heads)
298 298 updating to branch a
299 299 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
300 300 $ hg clone -b b . b
301 301 adding changesets
302 302 adding manifests
303 303 adding file changes
304 304 added 304 changesets with 0 changes to 0 files
305 305 updating to branch b
306 306 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
307 307
308 308 $ hg -R a debugdiscovery b --debug --verbose
309 309 comparing with b
310 310 query 1; heads
311 311 searching for changes
312 312 taking quick initial sample
313 313 searching: 2 queries
314 314 query 2; still undecided: 1240, sample size is: 100
315 315 sampling from both directions
316 316 searching: 3 queries
317 317 query 3; still undecided: 1140, sample size is: 200
318 318 sampling from both directions
319 319 searching: 4 queries
320 320 query 4; still undecided: 940, sample size is: 200
321 321 sampling from both directions
322 322 searching: 5 queries
323 323 query 5; still undecided: 740, sample size is: 200
324 324 sampling from both directions
325 325 searching: 6 queries
326 326 query 6; still undecided: 540, sample size is: 200
327 327 sampling from both directions
328 328 searching: 7 queries
329 329 query 7; still undecided: 44, sample size is: 44
330 330 7 total queries
331 331 common heads: 3ee37d65064a
332 332
333 333 Test actual protocol when pulling one new head in addition to common heads
334 334
335 335 $ hg clone -U b c
336 336 $ hg -R c id -ir tip
337 337 513314ca8b3a
338 338 $ hg -R c up -qr default
339 339 $ touch c/f
340 340 $ hg -R c ci -Aqm "extra head"
341 341 $ hg -R c id -i
342 342 e64a39e7da8b
343 343
344 344 $ hg serve -R c -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
345 345 $ cat hg.pid >> $DAEMON_PIDS
346 346
347 347 $ hg -R b incoming http://localhost:$HGPORT/ -T '{node|short}\n'
348 348 comparing with http://localhost:$HGPORT/
349 349 searching for changes
350 350 e64a39e7da8b
351 351
352 352 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
353 353 $ cut -d' ' -f6- access.log | grep -v cmd=known # cmd=known uses random sampling
354 354 "GET /?cmd=capabilities HTTP/1.1" 200 -
355 355 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D513314ca8b3ae4dac8eec56966265b00fcf866db
356 356 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:common=513314ca8b3ae4dac8eec56966265b00fcf866db&heads=e64a39e7da8b0d54bc63e81169aff001c13b3477
357 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
357 358 $ cat errors.log
358 359
359 360 $ cd ..
360 361
361 362
362 363 Issue 4438 - test coverage for 3ef893520a85 issues.
363 364
364 365 $ mkdir issue4438
365 366 $ cd issue4438
366 367 #if false
367 368 generate new bundles:
368 369 $ hg init r1
369 370 $ for i in `seq 101`; do hg -R r1 up -qr null && hg -R r1 branch -q b$i && hg -R r1 ci -qmb$i; done
370 371 $ hg clone -q r1 r2
371 372 $ for i in `seq 10`; do hg -R r1 up -qr null && hg -R r1 branch -q c$i && hg -R r1 ci -qmc$i; done
372 373 $ hg -R r2 branch -q r2change && hg -R r2 ci -qmr2change
373 374 $ hg -R r1 bundle -qa $TESTDIR/bundles/issue4438-r1.hg
374 375 $ hg -R r2 bundle -qa $TESTDIR/bundles/issue4438-r2.hg
375 376 #else
376 377 use existing bundles:
377 378 $ hg clone -q $TESTDIR/bundles/issue4438-r1.hg r1
378 379 $ hg clone -q $TESTDIR/bundles/issue4438-r2.hg r2
379 380 #endif
380 381
381 382 Set iteration order could cause wrong and unstable results - fixed in 73cfaa348650:
382 383
383 384 $ hg -R r1 outgoing r2 -T'{rev} '
384 385 comparing with r2
385 386 searching for changes
386 387 101 102 103 104 105 106 107 108 109 110 (no-eol)
387 388
388 389 The case where all the 'initialsamplesize' samples already were common would
389 390 give 'all remote heads known locally' without checking the remaining heads -
390 391 fixed in 86c35b7ae300:
391 392
392 393 $ cat >> $TESTTMP/unrandomsample.py << EOF
393 394 > import random
394 395 > def sample(population, k):
395 396 > return sorted(population)[:k]
396 397 > random.sample = sample
397 398 > EOF
398 399
399 400 $ cat >> r1/.hg/hgrc << EOF
400 401 > [extensions]
401 402 > unrandomsample = $TESTTMP/unrandomsample.py
402 403 > EOF
403 404
404 405 $ hg -R r1 outgoing r2 -T'{rev} '
405 406 comparing with r2
406 407 searching for changes
407 408 101 102 103 104 105 106 107 108 109 110 (no-eol)
408 409 $ cd ..
@@ -1,536 +1,537 b''
1 1 #require killdaemons
2 2
3 3 Tests discovery against servers without getbundle support:
4 4
5 5 $ CAP=getbundle
6 6 $ . "$TESTDIR/notcapable"
7 7 $ cat >> $HGRCPATH <<EOF
8 8 > [ui]
9 9 > logtemplate="{rev} {node|short}: {desc} {branches}\n"
10 10 > EOF
11 11
12 12 Setup HTTP server control:
13 13
14 14 $ remote=http://localhost:$HGPORT/
15 15 $ export remote
16 16 $ tstart() {
17 17 > echo '[web]' > $1/.hg/hgrc
18 18 > echo 'push_ssl = false' >> $1/.hg/hgrc
19 19 > echo 'allow_push = *' >> $1/.hg/hgrc
20 20 > hg serve -R $1 -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
21 21 > cat hg.pid >> $DAEMON_PIDS
22 22 > }
23 23 $ tstop() {
24 24 > "$TESTDIR/killdaemons.py" $DAEMON_PIDS
25 25 > [ "$1" ] && cut -d' ' -f6- access.log && cat errors.log
26 26 > rm access.log errors.log
27 27 > }
28 28
29 29 Both are empty:
30 30
31 31 $ hg init empty1
32 32 $ hg init empty2
33 33 $ tstart empty2
34 34 $ hg incoming -R empty1 $remote
35 35 comparing with http://localhost:$HGPORT/
36 36 no changes found
37 37 [1]
38 38 $ hg outgoing -R empty1 $remote
39 39 comparing with http://localhost:$HGPORT/
40 40 no changes found
41 41 [1]
42 42 $ hg pull -R empty1 $remote
43 43 pulling from http://localhost:$HGPORT/
44 44 no changes found
45 45 $ hg push -R empty1 $remote
46 46 pushing to http://localhost:$HGPORT/
47 47 no changes found
48 48 [1]
49 49 $ tstop
50 50
51 51 Base repo:
52 52
53 53 $ hg init main
54 54 $ cd main
55 55 $ hg debugbuilddag -mo '+2:tbase @name1 +3:thead1 <tbase @name2 +4:thead2 @both /thead1 +2:tmaintip'
56 56 $ hg log -G
57 57 o 11 a19bfa7e7328: r11 both
58 58 |
59 59 o 10 8b6bad1512e1: r10 both
60 60 |
61 61 o 9 025829e08038: r9 both
62 62 |\
63 63 | o 8 d8f638ac69e9: r8 name2
64 64 | |
65 65 | o 7 b6b4d315a2ac: r7 name2
66 66 | |
67 67 | o 6 6c6f5d5f3c11: r6 name2
68 68 | |
69 69 | o 5 70314b29987d: r5 name2
70 70 | |
71 71 o | 4 e71dbbc70e03: r4 name1
72 72 | |
73 73 o | 3 2c8d5d5ec612: r3 name1
74 74 | |
75 75 o | 2 a7892891da29: r2 name1
76 76 |/
77 77 o 1 0019a3b924fd: r1
78 78 |
79 79 o 0 d57206cc072a: r0
80 80
81 81 $ cd ..
82 82 $ tstart main
83 83
84 84 Full clone:
85 85
86 86 $ hg clone main full
87 87 updating to branch default
88 88 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
89 89 $ cd full
90 90 $ hg incoming $remote
91 91 comparing with http://localhost:$HGPORT/
92 92 searching for changes
93 93 no changes found
94 94 [1]
95 95 $ hg outgoing $remote
96 96 comparing with http://localhost:$HGPORT/
97 97 searching for changes
98 98 no changes found
99 99 [1]
100 100 $ hg pull $remote
101 101 pulling from http://localhost:$HGPORT/
102 102 searching for changes
103 103 no changes found
104 104 $ hg push $remote
105 105 pushing to http://localhost:$HGPORT/
106 106 searching for changes
107 107 no changes found
108 108 [1]
109 109 $ cd ..
110 110
111 111 Local is empty:
112 112
113 113 $ cd empty1
114 114 $ hg incoming $remote
115 115 comparing with http://localhost:$HGPORT/
116 116 0 d57206cc072a: r0
117 117 1 0019a3b924fd: r1
118 118 2 a7892891da29: r2 name1
119 119 3 2c8d5d5ec612: r3 name1
120 120 4 e71dbbc70e03: r4 name1
121 121 5 70314b29987d: r5 name2
122 122 6 6c6f5d5f3c11: r6 name2
123 123 7 b6b4d315a2ac: r7 name2
124 124 8 d8f638ac69e9: r8 name2
125 125 9 025829e08038: r9 both
126 126 10 8b6bad1512e1: r10 both
127 127 11 a19bfa7e7328: r11 both
128 128 $ hg outgoing $remote
129 129 comparing with http://localhost:$HGPORT/
130 130 no changes found
131 131 [1]
132 132 $ hg push $remote
133 133 pushing to http://localhost:$HGPORT/
134 134 no changes found
135 135 [1]
136 136 $ hg pull $remote
137 137 pulling from http://localhost:$HGPORT/
138 138 requesting all changes
139 139 adding changesets
140 140 adding manifests
141 141 adding file changes
142 142 added 12 changesets with 24 changes to 2 files
143 143 (run 'hg update' to get a working copy)
144 144 $ hg incoming $remote
145 145 comparing with http://localhost:$HGPORT/
146 146 searching for changes
147 147 no changes found
148 148 [1]
149 149 $ cd ..
150 150
151 151 Local is subset:
152 152
153 153 $ hg clone main subset --rev name2 ; cd subset
154 154 adding changesets
155 155 adding manifests
156 156 adding file changes
157 157 added 6 changesets with 12 changes to 2 files
158 158 updating to branch name2
159 159 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
160 160 $ hg incoming $remote
161 161 comparing with http://localhost:$HGPORT/
162 162 searching for changes
163 163 6 a7892891da29: r2 name1
164 164 7 2c8d5d5ec612: r3 name1
165 165 8 e71dbbc70e03: r4 name1
166 166 9 025829e08038: r9 both
167 167 10 8b6bad1512e1: r10 both
168 168 11 a19bfa7e7328: r11 both
169 169 $ hg outgoing $remote
170 170 comparing with http://localhost:$HGPORT/
171 171 searching for changes
172 172 no changes found
173 173 [1]
174 174 $ hg push $remote
175 175 pushing to http://localhost:$HGPORT/
176 176 searching for changes
177 177 no changes found
178 178 [1]
179 179 $ hg pull $remote
180 180 pulling from http://localhost:$HGPORT/
181 181 searching for changes
182 182 adding changesets
183 183 adding manifests
184 184 adding file changes
185 185 added 6 changesets with 12 changes to 2 files
186 186 (run 'hg update' to get a working copy)
187 187 $ hg incoming $remote
188 188 comparing with http://localhost:$HGPORT/
189 189 searching for changes
190 190 no changes found
191 191 [1]
192 192 $ cd ..
193 193 $ tstop
194 194
195 195 Remote is empty:
196 196
197 197 $ tstart empty2
198 198 $ cd main
199 199 $ hg incoming $remote
200 200 comparing with http://localhost:$HGPORT/
201 201 searching for changes
202 202 no changes found
203 203 [1]
204 204 $ hg outgoing $remote
205 205 comparing with http://localhost:$HGPORT/
206 206 searching for changes
207 207 0 d57206cc072a: r0
208 208 1 0019a3b924fd: r1
209 209 2 a7892891da29: r2 name1
210 210 3 2c8d5d5ec612: r3 name1
211 211 4 e71dbbc70e03: r4 name1
212 212 5 70314b29987d: r5 name2
213 213 6 6c6f5d5f3c11: r6 name2
214 214 7 b6b4d315a2ac: r7 name2
215 215 8 d8f638ac69e9: r8 name2
216 216 9 025829e08038: r9 both
217 217 10 8b6bad1512e1: r10 both
218 218 11 a19bfa7e7328: r11 both
219 219 $ hg pull $remote
220 220 pulling from http://localhost:$HGPORT/
221 221 searching for changes
222 222 no changes found
223 223 $ hg push $remote
224 224 pushing to http://localhost:$HGPORT/
225 225 searching for changes
226 226 remote: adding changesets
227 227 remote: adding manifests
228 228 remote: adding file changes
229 229 remote: added 12 changesets with 24 changes to 2 files
230 230 $ hg outgoing $remote
231 231 comparing with http://localhost:$HGPORT/
232 232 searching for changes
233 233 no changes found
234 234 [1]
235 235 $ cd ..
236 236 $ tstop
237 237
238 238 Local is superset:
239 239
240 240 $ hg clone main subset2 --rev name2
241 241 adding changesets
242 242 adding manifests
243 243 adding file changes
244 244 added 6 changesets with 12 changes to 2 files
245 245 updating to branch name2
246 246 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
247 247 $ tstart subset2
248 248 $ cd main
249 249 $ hg incoming $remote
250 250 comparing with http://localhost:$HGPORT/
251 251 searching for changes
252 252 no changes found
253 253 [1]
254 254 $ hg outgoing $remote
255 255 comparing with http://localhost:$HGPORT/
256 256 searching for changes
257 257 2 a7892891da29: r2 name1
258 258 3 2c8d5d5ec612: r3 name1
259 259 4 e71dbbc70e03: r4 name1
260 260 9 025829e08038: r9 both
261 261 10 8b6bad1512e1: r10 both
262 262 11 a19bfa7e7328: r11 both
263 263 $ hg pull $remote
264 264 pulling from http://localhost:$HGPORT/
265 265 searching for changes
266 266 no changes found
267 267 $ hg push $remote
268 268 pushing to http://localhost:$HGPORT/
269 269 searching for changes
270 270 abort: push creates new remote branches: both, name1!
271 271 (use 'hg push --new-branch' to create new remote branches)
272 272 [255]
273 273 $ hg push $remote --new-branch
274 274 pushing to http://localhost:$HGPORT/
275 275 searching for changes
276 276 remote: adding changesets
277 277 remote: adding manifests
278 278 remote: adding file changes
279 279 remote: added 6 changesets with 12 changes to 2 files
280 280 $ hg outgoing $remote
281 281 comparing with http://localhost:$HGPORT/
282 282 searching for changes
283 283 no changes found
284 284 [1]
285 285 $ cd ..
286 286 $ tstop
287 287
288 288 Partial pull:
289 289
290 290 $ tstart main
291 291 $ hg clone $remote partial --rev name2
292 292 adding changesets
293 293 adding manifests
294 294 adding file changes
295 295 added 6 changesets with 12 changes to 2 files
296 296 updating to branch name2
297 297 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
298 298 $ cd partial
299 299 $ hg incoming $remote
300 300 comparing with http://localhost:$HGPORT/
301 301 searching for changes
302 302 6 a7892891da29: r2 name1
303 303 7 2c8d5d5ec612: r3 name1
304 304 8 e71dbbc70e03: r4 name1
305 305 9 025829e08038: r9 both
306 306 10 8b6bad1512e1: r10 both
307 307 11 a19bfa7e7328: r11 both
308 308 $ hg incoming $remote --rev name1
309 309 comparing with http://localhost:$HGPORT/
310 310 searching for changes
311 311 6 a7892891da29: r2 name1
312 312 7 2c8d5d5ec612: r3 name1
313 313 8 e71dbbc70e03: r4 name1
314 314 $ hg pull $remote --rev name1
315 315 pulling from http://localhost:$HGPORT/
316 316 searching for changes
317 317 adding changesets
318 318 adding manifests
319 319 adding file changes
320 320 added 3 changesets with 6 changes to 2 files (+1 heads)
321 321 (run 'hg heads' to see heads)
322 322 $ hg incoming $remote
323 323 comparing with http://localhost:$HGPORT/
324 324 searching for changes
325 325 9 025829e08038: r9 both
326 326 10 8b6bad1512e1: r10 both
327 327 11 a19bfa7e7328: r11 both
328 328 $ cd ..
329 329 $ tstop
330 330
331 331 Both have new stuff in new named branches:
332 332
333 333 $ hg clone main repo1a --rev name1 -q
334 334 $ hg clone repo1a repo1b -q
335 335 $ hg clone main repo2a --rev name2 -q
336 336 $ hg clone repo2a repo2b -q
337 337 $ tstart repo1a
338 338
339 339 $ cd repo2a
340 340 $ hg incoming $remote
341 341 comparing with http://localhost:$HGPORT/
342 342 searching for changes
343 343 6 a7892891da29: r2 name1
344 344 7 2c8d5d5ec612: r3 name1
345 345 8 e71dbbc70e03: r4 name1
346 346 $ hg outgoing $remote
347 347 comparing with http://localhost:$HGPORT/
348 348 searching for changes
349 349 2 70314b29987d: r5 name2
350 350 3 6c6f5d5f3c11: r6 name2
351 351 4 b6b4d315a2ac: r7 name2
352 352 5 d8f638ac69e9: r8 name2
353 353 $ hg push $remote --new-branch
354 354 pushing to http://localhost:$HGPORT/
355 355 searching for changes
356 356 remote: adding changesets
357 357 remote: adding manifests
358 358 remote: adding file changes
359 359 remote: added 4 changesets with 8 changes to 2 files (+1 heads)
360 360 $ hg pull $remote
361 361 pulling from http://localhost:$HGPORT/
362 362 searching for changes
363 363 adding changesets
364 364 adding manifests
365 365 adding file changes
366 366 added 3 changesets with 6 changes to 2 files (+1 heads)
367 367 (run 'hg heads' to see heads)
368 368 $ hg incoming $remote
369 369 comparing with http://localhost:$HGPORT/
370 370 searching for changes
371 371 no changes found
372 372 [1]
373 373 $ hg outgoing $remote
374 374 comparing with http://localhost:$HGPORT/
375 375 searching for changes
376 376 no changes found
377 377 [1]
378 378 $ cd ..
379 379 $ tstop
380 380
381 381 $ tstart repo1b
382 382 $ cd repo2b
383 383 $ hg incoming $remote
384 384 comparing with http://localhost:$HGPORT/
385 385 searching for changes
386 386 6 a7892891da29: r2 name1
387 387 7 2c8d5d5ec612: r3 name1
388 388 8 e71dbbc70e03: r4 name1
389 389 $ hg outgoing $remote
390 390 comparing with http://localhost:$HGPORT/
391 391 searching for changes
392 392 2 70314b29987d: r5 name2
393 393 3 6c6f5d5f3c11: r6 name2
394 394 4 b6b4d315a2ac: r7 name2
395 395 5 d8f638ac69e9: r8 name2
396 396 $ hg pull $remote
397 397 pulling from http://localhost:$HGPORT/
398 398 searching for changes
399 399 adding changesets
400 400 adding manifests
401 401 adding file changes
402 402 added 3 changesets with 6 changes to 2 files (+1 heads)
403 403 (run 'hg heads' to see heads)
404 404 $ hg push $remote --new-branch
405 405 pushing to http://localhost:$HGPORT/
406 406 searching for changes
407 407 remote: adding changesets
408 408 remote: adding manifests
409 409 remote: adding file changes
410 410 remote: added 4 changesets with 8 changes to 2 files (+1 heads)
411 411 $ hg incoming $remote
412 412 comparing with http://localhost:$HGPORT/
413 413 searching for changes
414 414 no changes found
415 415 [1]
416 416 $ hg outgoing $remote
417 417 comparing with http://localhost:$HGPORT/
418 418 searching for changes
419 419 no changes found
420 420 [1]
421 421 $ cd ..
422 422 $ tstop
423 423
424 424 Both have new stuff in existing named branches:
425 425
426 426 $ rm -r repo1a repo1b repo2a repo2b
427 427 $ hg clone main repo1a --rev 3 --rev 8 -q
428 428 $ hg clone repo1a repo1b -q
429 429 $ hg clone main repo2a --rev 4 --rev 7 -q
430 430 $ hg clone repo2a repo2b -q
431 431 $ tstart repo1a
432 432
433 433 $ cd repo2a
434 434 $ hg incoming $remote
435 435 comparing with http://localhost:$HGPORT/
436 436 searching for changes
437 437 8 d8f638ac69e9: r8 name2
438 438 $ hg outgoing $remote
439 439 comparing with http://localhost:$HGPORT/
440 440 searching for changes
441 441 4 e71dbbc70e03: r4 name1
442 442 $ hg push $remote --new-branch
443 443 pushing to http://localhost:$HGPORT/
444 444 searching for changes
445 445 remote: adding changesets
446 446 remote: adding manifests
447 447 remote: adding file changes
448 448 remote: added 1 changesets with 2 changes to 2 files
449 449 $ hg pull $remote
450 450 pulling from http://localhost:$HGPORT/
451 451 searching for changes
452 452 adding changesets
453 453 adding manifests
454 454 adding file changes
455 455 added 1 changesets with 2 changes to 2 files
456 456 (run 'hg update' to get a working copy)
457 457 $ hg incoming $remote
458 458 comparing with http://localhost:$HGPORT/
459 459 searching for changes
460 460 no changes found
461 461 [1]
462 462 $ hg outgoing $remote
463 463 comparing with http://localhost:$HGPORT/
464 464 searching for changes
465 465 no changes found
466 466 [1]
467 467 $ cd ..
468 468 $ tstop
469 469
470 470 $ tstart repo1b
471 471 $ cd repo2b
472 472 $ hg incoming $remote
473 473 comparing with http://localhost:$HGPORT/
474 474 searching for changes
475 475 8 d8f638ac69e9: r8 name2
476 476 $ hg outgoing $remote
477 477 comparing with http://localhost:$HGPORT/
478 478 searching for changes
479 479 4 e71dbbc70e03: r4 name1
480 480 $ hg pull $remote
481 481 pulling from http://localhost:$HGPORT/
482 482 searching for changes
483 483 adding changesets
484 484 adding manifests
485 485 adding file changes
486 486 added 1 changesets with 2 changes to 2 files
487 487 (run 'hg update' to get a working copy)
488 488 $ hg push $remote --new-branch
489 489 pushing to http://localhost:$HGPORT/
490 490 searching for changes
491 491 remote: adding changesets
492 492 remote: adding manifests
493 493 remote: adding file changes
494 494 remote: added 1 changesets with 2 changes to 2 files
495 495 $ hg incoming $remote
496 496 comparing with http://localhost:$HGPORT/
497 497 searching for changes
498 498 no changes found
499 499 [1]
500 500 $ hg outgoing $remote
501 501 comparing with http://localhost:$HGPORT/
502 502 searching for changes
503 503 no changes found
504 504 [1]
505 505 $ cd ..
506 506 $ tstop show
507 507 "GET /?cmd=capabilities HTTP/1.1" 200 -
508 508 "GET /?cmd=heads HTTP/1.1" 200 -
509 509 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961
510 510 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785
511 511 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961
512 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
512 513 "GET /?cmd=capabilities HTTP/1.1" 200 -
513 514 "GET /?cmd=heads HTTP/1.1" 200 -
514 515 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961
515 516 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785
516 517 "GET /?cmd=capabilities HTTP/1.1" 200 -
517 518 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
518 519 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
519 520 "GET /?cmd=heads HTTP/1.1" 200 -
520 521 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961
521 522 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785
522 523 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961+2c8d5d5ec612be65cdfdeac78b7662ab1696324a
523 524 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
524 525 "GET /?cmd=capabilities HTTP/1.1" 200 -
525 526 "GET /?cmd=heads HTTP/1.1" 200 -
526 527 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
527 528 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
528 529 "GET /?cmd=branchmap HTTP/1.1" 200 -
529 530 "GET /?cmd=branchmap HTTP/1.1" 200 -
530 531 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks
531 532 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91
532 533 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases
533 534 "GET /?cmd=capabilities HTTP/1.1" 200 -
534 535 "GET /?cmd=heads HTTP/1.1" 200 -
535 536 "GET /?cmd=capabilities HTTP/1.1" 200 -
536 537 "GET /?cmd=heads HTTP/1.1" 200 -
General Comments 0
You need to be logged in to leave comments. Login now