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