##// END OF EJS Templates
discovery: don't redundantly call branchmap...
Gregory Szorc -
r37654:330ada7e default
parent child Browse files
Show More
@@ -1,525 +1,525
1 # discovery.py - protocol changeset discovery functions
1 # discovery.py - protocol changeset discovery functions
2 #
2 #
3 # Copyright 2010 Matt Mackall <mpm@selenic.com>
3 # Copyright 2010 Matt Mackall <mpm@selenic.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 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import functools
10 import functools
11
11
12 from .i18n import _
12 from .i18n import _
13 from .node import (
13 from .node import (
14 hex,
14 hex,
15 nullid,
15 nullid,
16 short,
16 short,
17 )
17 )
18
18
19 from . import (
19 from . import (
20 bookmarks,
20 bookmarks,
21 branchmap,
21 branchmap,
22 error,
22 error,
23 phases,
23 phases,
24 scmutil,
24 scmutil,
25 setdiscovery,
25 setdiscovery,
26 treediscovery,
26 treediscovery,
27 util,
27 util,
28 )
28 )
29
29
30 def findcommonincoming(repo, remote, heads=None, force=False, ancestorsof=None):
30 def findcommonincoming(repo, remote, heads=None, force=False, ancestorsof=None):
31 """Return a tuple (common, anyincoming, heads) used to identify the common
31 """Return a tuple (common, anyincoming, heads) used to identify the common
32 subset of nodes between repo and remote.
32 subset of nodes between repo and remote.
33
33
34 "common" is a list of (at least) the heads of the common subset.
34 "common" is a list of (at least) the heads of the common subset.
35 "anyincoming" is testable as a boolean indicating if any nodes are missing
35 "anyincoming" is testable as a boolean indicating if any nodes are missing
36 locally. If remote does not support getbundle, this actually is a list of
36 locally. If remote does not support getbundle, this actually is a list of
37 roots of the nodes that would be incoming, to be supplied to
37 roots of the nodes that would be incoming, to be supplied to
38 changegroupsubset. No code except for pull should be relying on this fact
38 changegroupsubset. No code except for pull should be relying on this fact
39 any longer.
39 any longer.
40 "heads" is either the supplied heads, or else the remote's heads.
40 "heads" is either the supplied heads, or else the remote's heads.
41 "ancestorsof" if not None, restrict the discovery to a subset defined by
41 "ancestorsof" if not None, restrict the discovery to a subset defined by
42 these nodes. Changeset outside of this set won't be considered (and
42 these nodes. Changeset outside of this set won't be considered (and
43 won't appears in "common")
43 won't appears in "common")
44
44
45 If you pass heads and they are all known locally, the response lists just
45 If you pass heads and they are all known locally, the response lists just
46 these heads in "common" and in "heads".
46 these heads in "common" and in "heads".
47
47
48 Please use findcommonoutgoing to compute the set of outgoing nodes to give
48 Please use findcommonoutgoing to compute the set of outgoing nodes to give
49 extensions a good hook into outgoing.
49 extensions a good hook into outgoing.
50 """
50 """
51
51
52 if not remote.capable('getbundle'):
52 if not remote.capable('getbundle'):
53 return treediscovery.findcommonincoming(repo, remote, heads, force)
53 return treediscovery.findcommonincoming(repo, remote, heads, force)
54
54
55 if heads:
55 if heads:
56 knownnode = repo.changelog.hasnode # no nodemap until it is filtered
56 knownnode = repo.changelog.hasnode # no nodemap until it is filtered
57 if all(knownnode(h) for h in heads):
57 if all(knownnode(h) for h in heads):
58 return (heads, False, heads)
58 return (heads, False, heads)
59
59
60 res = setdiscovery.findcommonheads(repo.ui, repo, remote,
60 res = setdiscovery.findcommonheads(repo.ui, repo, remote,
61 abortwhenunrelated=not force,
61 abortwhenunrelated=not force,
62 ancestorsof=ancestorsof)
62 ancestorsof=ancestorsof)
63 common, anyinc, srvheads = res
63 common, anyinc, srvheads = res
64 return (list(common), anyinc, heads or list(srvheads))
64 return (list(common), anyinc, heads or list(srvheads))
65
65
66 class outgoing(object):
66 class outgoing(object):
67 '''Represents the set of nodes present in a local repo but not in a
67 '''Represents the set of nodes present in a local repo but not in a
68 (possibly) remote one.
68 (possibly) remote one.
69
69
70 Members:
70 Members:
71
71
72 missing is a list of all nodes present in local but not in remote.
72 missing is a list of all nodes present in local but not in remote.
73 common is a list of all nodes shared between the two repos.
73 common is a list of all nodes shared between the two repos.
74 excluded is the list of missing changeset that shouldn't be sent remotely.
74 excluded is the list of missing changeset that shouldn't be sent remotely.
75 missingheads is the list of heads of missing.
75 missingheads is the list of heads of missing.
76 commonheads is the list of heads of common.
76 commonheads is the list of heads of common.
77
77
78 The sets are computed on demand from the heads, unless provided upfront
78 The sets are computed on demand from the heads, unless provided upfront
79 by discovery.'''
79 by discovery.'''
80
80
81 def __init__(self, repo, commonheads=None, missingheads=None,
81 def __init__(self, repo, commonheads=None, missingheads=None,
82 missingroots=None):
82 missingroots=None):
83 # at least one of them must not be set
83 # at least one of them must not be set
84 assert None in (commonheads, missingroots)
84 assert None in (commonheads, missingroots)
85 cl = repo.changelog
85 cl = repo.changelog
86 if missingheads is None:
86 if missingheads is None:
87 missingheads = cl.heads()
87 missingheads = cl.heads()
88 if missingroots:
88 if missingroots:
89 discbases = []
89 discbases = []
90 for n in missingroots:
90 for n in missingroots:
91 discbases.extend([p for p in cl.parents(n) if p != nullid])
91 discbases.extend([p for p in cl.parents(n) if p != nullid])
92 # TODO remove call to nodesbetween.
92 # TODO remove call to nodesbetween.
93 # TODO populate attributes on outgoing instance instead of setting
93 # TODO populate attributes on outgoing instance instead of setting
94 # discbases.
94 # discbases.
95 csets, roots, heads = cl.nodesbetween(missingroots, missingheads)
95 csets, roots, heads = cl.nodesbetween(missingroots, missingheads)
96 included = set(csets)
96 included = set(csets)
97 missingheads = heads
97 missingheads = heads
98 commonheads = [n for n in discbases if n not in included]
98 commonheads = [n for n in discbases if n not in included]
99 elif not commonheads:
99 elif not commonheads:
100 commonheads = [nullid]
100 commonheads = [nullid]
101 self.commonheads = commonheads
101 self.commonheads = commonheads
102 self.missingheads = missingheads
102 self.missingheads = missingheads
103 self._revlog = cl
103 self._revlog = cl
104 self._common = None
104 self._common = None
105 self._missing = None
105 self._missing = None
106 self.excluded = []
106 self.excluded = []
107
107
108 def _computecommonmissing(self):
108 def _computecommonmissing(self):
109 sets = self._revlog.findcommonmissing(self.commonheads,
109 sets = self._revlog.findcommonmissing(self.commonheads,
110 self.missingheads)
110 self.missingheads)
111 self._common, self._missing = sets
111 self._common, self._missing = sets
112
112
113 @util.propertycache
113 @util.propertycache
114 def common(self):
114 def common(self):
115 if self._common is None:
115 if self._common is None:
116 self._computecommonmissing()
116 self._computecommonmissing()
117 return self._common
117 return self._common
118
118
119 @util.propertycache
119 @util.propertycache
120 def missing(self):
120 def missing(self):
121 if self._missing is None:
121 if self._missing is None:
122 self._computecommonmissing()
122 self._computecommonmissing()
123 return self._missing
123 return self._missing
124
124
125 def findcommonoutgoing(repo, other, onlyheads=None, force=False,
125 def findcommonoutgoing(repo, other, onlyheads=None, force=False,
126 commoninc=None, portable=False):
126 commoninc=None, portable=False):
127 '''Return an outgoing instance to identify the nodes present in repo but
127 '''Return an outgoing instance to identify the nodes present in repo but
128 not in other.
128 not in other.
129
129
130 If onlyheads is given, only nodes ancestral to nodes in onlyheads
130 If onlyheads is given, only nodes ancestral to nodes in onlyheads
131 (inclusive) are included. If you already know the local repo's heads,
131 (inclusive) are included. If you already know the local repo's heads,
132 passing them in onlyheads is faster than letting them be recomputed here.
132 passing them in onlyheads is faster than letting them be recomputed here.
133
133
134 If commoninc is given, it must be the result of a prior call to
134 If commoninc is given, it must be the result of a prior call to
135 findcommonincoming(repo, other, force) to avoid recomputing it here.
135 findcommonincoming(repo, other, force) to avoid recomputing it here.
136
136
137 If portable is given, compute more conservative common and missingheads,
137 If portable is given, compute more conservative common and missingheads,
138 to make bundles created from the instance more portable.'''
138 to make bundles created from the instance more portable.'''
139 # declare an empty outgoing object to be filled later
139 # declare an empty outgoing object to be filled later
140 og = outgoing(repo, None, None)
140 og = outgoing(repo, None, None)
141
141
142 # get common set if not provided
142 # get common set if not provided
143 if commoninc is None:
143 if commoninc is None:
144 commoninc = findcommonincoming(repo, other, force=force,
144 commoninc = findcommonincoming(repo, other, force=force,
145 ancestorsof=onlyheads)
145 ancestorsof=onlyheads)
146 og.commonheads, _any, _hds = commoninc
146 og.commonheads, _any, _hds = commoninc
147
147
148 # compute outgoing
148 # compute outgoing
149 mayexclude = (repo._phasecache.phaseroots[phases.secret] or repo.obsstore)
149 mayexclude = (repo._phasecache.phaseroots[phases.secret] or repo.obsstore)
150 if not mayexclude:
150 if not mayexclude:
151 og.missingheads = onlyheads or repo.heads()
151 og.missingheads = onlyheads or repo.heads()
152 elif onlyheads is None:
152 elif onlyheads is None:
153 # use visible heads as it should be cached
153 # use visible heads as it should be cached
154 og.missingheads = repo.filtered("served").heads()
154 og.missingheads = repo.filtered("served").heads()
155 og.excluded = [ctx.node() for ctx in repo.set('secret() or extinct()')]
155 og.excluded = [ctx.node() for ctx in repo.set('secret() or extinct()')]
156 else:
156 else:
157 # compute common, missing and exclude secret stuff
157 # compute common, missing and exclude secret stuff
158 sets = repo.changelog.findcommonmissing(og.commonheads, onlyheads)
158 sets = repo.changelog.findcommonmissing(og.commonheads, onlyheads)
159 og._common, allmissing = sets
159 og._common, allmissing = sets
160 og._missing = missing = []
160 og._missing = missing = []
161 og.excluded = excluded = []
161 og.excluded = excluded = []
162 for node in allmissing:
162 for node in allmissing:
163 ctx = repo[node]
163 ctx = repo[node]
164 if ctx.phase() >= phases.secret or ctx.extinct():
164 if ctx.phase() >= phases.secret or ctx.extinct():
165 excluded.append(node)
165 excluded.append(node)
166 else:
166 else:
167 missing.append(node)
167 missing.append(node)
168 if len(missing) == len(allmissing):
168 if len(missing) == len(allmissing):
169 missingheads = onlyheads
169 missingheads = onlyheads
170 else: # update missing heads
170 else: # update missing heads
171 missingheads = phases.newheads(repo, onlyheads, excluded)
171 missingheads = phases.newheads(repo, onlyheads, excluded)
172 og.missingheads = missingheads
172 og.missingheads = missingheads
173 if portable:
173 if portable:
174 # recompute common and missingheads as if -r<rev> had been given for
174 # recompute common and missingheads as if -r<rev> had been given for
175 # each head of missing, and --base <rev> for each head of the proper
175 # each head of missing, and --base <rev> for each head of the proper
176 # ancestors of missing
176 # ancestors of missing
177 og._computecommonmissing()
177 og._computecommonmissing()
178 cl = repo.changelog
178 cl = repo.changelog
179 missingrevs = set(cl.rev(n) for n in og._missing)
179 missingrevs = set(cl.rev(n) for n in og._missing)
180 og._common = set(cl.ancestors(missingrevs)) - missingrevs
180 og._common = set(cl.ancestors(missingrevs)) - missingrevs
181 commonheads = set(og.commonheads)
181 commonheads = set(og.commonheads)
182 og.missingheads = [h for h in og.missingheads if h not in commonheads]
182 og.missingheads = [h for h in og.missingheads if h not in commonheads]
183
183
184 return og
184 return og
185
185
186 def _headssummary(pushop):
186 def _headssummary(pushop):
187 """compute a summary of branch and heads status before and after push
187 """compute a summary of branch and heads status before and after push
188
188
189 return {'branch': ([remoteheads], [newheads],
189 return {'branch': ([remoteheads], [newheads],
190 [unsyncedheads], [discardedheads])} mapping
190 [unsyncedheads], [discardedheads])} mapping
191
191
192 - branch: the branch name,
192 - branch: the branch name,
193 - remoteheads: the list of remote heads known locally
193 - remoteheads: the list of remote heads known locally
194 None if the branch is new,
194 None if the branch is new,
195 - newheads: the new remote heads (known locally) with outgoing pushed,
195 - newheads: the new remote heads (known locally) with outgoing pushed,
196 - unsyncedheads: the list of remote heads unknown locally,
196 - unsyncedheads: the list of remote heads unknown locally,
197 - discardedheads: the list of heads made obsolete by the push.
197 - discardedheads: the list of heads made obsolete by the push.
198 """
198 """
199 repo = pushop.repo.unfiltered()
199 repo = pushop.repo.unfiltered()
200 remote = pushop.remote
200 remote = pushop.remote
201 outgoing = pushop.outgoing
201 outgoing = pushop.outgoing
202 cl = repo.changelog
202 cl = repo.changelog
203 headssum = {}
203 headssum = {}
204 # A. Create set of branches involved in the push.
204 # A. Create set of branches involved in the push.
205 branches = set(repo[n].branch() for n in outgoing.missing)
205 branches = set(repo[n].branch() for n in outgoing.missing)
206 remotemap = remote.branchmap()
206 remotemap = remote.branchmap()
207 newbranches = branches - set(remotemap)
207 newbranches = branches - set(remotemap)
208 branches.difference_update(newbranches)
208 branches.difference_update(newbranches)
209
209
210 # A. register remote heads
210 # A. register remote heads
211 remotebranches = set()
211 remotebranches = set()
212 for branch, heads in remote.branchmap().iteritems():
212 for branch, heads in remotemap.iteritems():
213 remotebranches.add(branch)
213 remotebranches.add(branch)
214 known = []
214 known = []
215 unsynced = []
215 unsynced = []
216 knownnode = cl.hasnode # do not use nodemap until it is filtered
216 knownnode = cl.hasnode # do not use nodemap until it is filtered
217 for h in heads:
217 for h in heads:
218 if knownnode(h):
218 if knownnode(h):
219 known.append(h)
219 known.append(h)
220 else:
220 else:
221 unsynced.append(h)
221 unsynced.append(h)
222 headssum[branch] = (known, list(known), unsynced)
222 headssum[branch] = (known, list(known), unsynced)
223 # B. add new branch data
223 # B. add new branch data
224 missingctx = list(repo[n] for n in outgoing.missing)
224 missingctx = list(repo[n] for n in outgoing.missing)
225 touchedbranches = set()
225 touchedbranches = set()
226 for ctx in missingctx:
226 for ctx in missingctx:
227 branch = ctx.branch()
227 branch = ctx.branch()
228 touchedbranches.add(branch)
228 touchedbranches.add(branch)
229 if branch not in headssum:
229 if branch not in headssum:
230 headssum[branch] = (None, [], [])
230 headssum[branch] = (None, [], [])
231
231
232 # C drop data about untouched branches:
232 # C drop data about untouched branches:
233 for branch in remotebranches - touchedbranches:
233 for branch in remotebranches - touchedbranches:
234 del headssum[branch]
234 del headssum[branch]
235
235
236 # D. Update newmap with outgoing changes.
236 # D. Update newmap with outgoing changes.
237 # This will possibly add new heads and remove existing ones.
237 # This will possibly add new heads and remove existing ones.
238 newmap = branchmap.branchcache((branch, heads[1])
238 newmap = branchmap.branchcache((branch, heads[1])
239 for branch, heads in headssum.iteritems()
239 for branch, heads in headssum.iteritems()
240 if heads[0] is not None)
240 if heads[0] is not None)
241 newmap.update(repo, (ctx.rev() for ctx in missingctx))
241 newmap.update(repo, (ctx.rev() for ctx in missingctx))
242 for branch, newheads in newmap.iteritems():
242 for branch, newheads in newmap.iteritems():
243 headssum[branch][1][:] = newheads
243 headssum[branch][1][:] = newheads
244 for branch, items in headssum.iteritems():
244 for branch, items in headssum.iteritems():
245 for l in items:
245 for l in items:
246 if l is not None:
246 if l is not None:
247 l.sort()
247 l.sort()
248 headssum[branch] = items + ([],)
248 headssum[branch] = items + ([],)
249
249
250 # If there are no obsstore, no post processing are needed.
250 # If there are no obsstore, no post processing are needed.
251 if repo.obsstore:
251 if repo.obsstore:
252 torev = repo.changelog.rev
252 torev = repo.changelog.rev
253 futureheads = set(torev(h) for h in outgoing.missingheads)
253 futureheads = set(torev(h) for h in outgoing.missingheads)
254 futureheads |= set(torev(h) for h in outgoing.commonheads)
254 futureheads |= set(torev(h) for h in outgoing.commonheads)
255 allfuturecommon = repo.changelog.ancestors(futureheads, inclusive=True)
255 allfuturecommon = repo.changelog.ancestors(futureheads, inclusive=True)
256 for branch, heads in sorted(headssum.iteritems()):
256 for branch, heads in sorted(headssum.iteritems()):
257 remoteheads, newheads, unsyncedheads, placeholder = heads
257 remoteheads, newheads, unsyncedheads, placeholder = heads
258 result = _postprocessobsolete(pushop, allfuturecommon, newheads)
258 result = _postprocessobsolete(pushop, allfuturecommon, newheads)
259 headssum[branch] = (remoteheads, sorted(result[0]), unsyncedheads,
259 headssum[branch] = (remoteheads, sorted(result[0]), unsyncedheads,
260 sorted(result[1]))
260 sorted(result[1]))
261 return headssum
261 return headssum
262
262
263 def _oldheadssummary(repo, remoteheads, outgoing, inc=False):
263 def _oldheadssummary(repo, remoteheads, outgoing, inc=False):
264 """Compute branchmapsummary for repo without branchmap support"""
264 """Compute branchmapsummary for repo without branchmap support"""
265
265
266 # 1-4b. old servers: Check for new topological heads.
266 # 1-4b. old servers: Check for new topological heads.
267 # Construct {old,new}map with branch = None (topological branch).
267 # Construct {old,new}map with branch = None (topological branch).
268 # (code based on update)
268 # (code based on update)
269 knownnode = repo.changelog.hasnode # no nodemap until it is filtered
269 knownnode = repo.changelog.hasnode # no nodemap until it is filtered
270 oldheads = sorted(h for h in remoteheads if knownnode(h))
270 oldheads = sorted(h for h in remoteheads if knownnode(h))
271 # all nodes in outgoing.missing are children of either:
271 # all nodes in outgoing.missing are children of either:
272 # - an element of oldheads
272 # - an element of oldheads
273 # - another element of outgoing.missing
273 # - another element of outgoing.missing
274 # - nullrev
274 # - nullrev
275 # This explains why the new head are very simple to compute.
275 # This explains why the new head are very simple to compute.
276 r = repo.set('heads(%ln + %ln)', oldheads, outgoing.missing)
276 r = repo.set('heads(%ln + %ln)', oldheads, outgoing.missing)
277 newheads = sorted(c.node() for c in r)
277 newheads = sorted(c.node() for c in r)
278 # set some unsynced head to issue the "unsynced changes" warning
278 # set some unsynced head to issue the "unsynced changes" warning
279 if inc:
279 if inc:
280 unsynced = [None]
280 unsynced = [None]
281 else:
281 else:
282 unsynced = []
282 unsynced = []
283 return {None: (oldheads, newheads, unsynced, [])}
283 return {None: (oldheads, newheads, unsynced, [])}
284
284
285 def _nowarnheads(pushop):
285 def _nowarnheads(pushop):
286 # Compute newly pushed bookmarks. We don't warn about bookmarked heads.
286 # Compute newly pushed bookmarks. We don't warn about bookmarked heads.
287 repo = pushop.repo.unfiltered()
287 repo = pushop.repo.unfiltered()
288 remote = pushop.remote
288 remote = pushop.remote
289 localbookmarks = repo._bookmarks
289 localbookmarks = repo._bookmarks
290 remotebookmarks = remote.listkeys('bookmarks')
290 remotebookmarks = remote.listkeys('bookmarks')
291 bookmarkedheads = set()
291 bookmarkedheads = set()
292
292
293 # internal config: bookmarks.pushing
293 # internal config: bookmarks.pushing
294 newbookmarks = [localbookmarks.expandname(b)
294 newbookmarks = [localbookmarks.expandname(b)
295 for b in pushop.ui.configlist('bookmarks', 'pushing')]
295 for b in pushop.ui.configlist('bookmarks', 'pushing')]
296
296
297 for bm in localbookmarks:
297 for bm in localbookmarks:
298 rnode = remotebookmarks.get(bm)
298 rnode = remotebookmarks.get(bm)
299 if rnode and rnode in repo:
299 if rnode and rnode in repo:
300 lctx, rctx = localbookmarks.changectx(bm), repo[rnode]
300 lctx, rctx = localbookmarks.changectx(bm), repo[rnode]
301 if bookmarks.validdest(repo, rctx, lctx):
301 if bookmarks.validdest(repo, rctx, lctx):
302 bookmarkedheads.add(lctx.node())
302 bookmarkedheads.add(lctx.node())
303 else:
303 else:
304 if bm in newbookmarks and bm not in remotebookmarks:
304 if bm in newbookmarks and bm not in remotebookmarks:
305 bookmarkedheads.add(localbookmarks[bm])
305 bookmarkedheads.add(localbookmarks[bm])
306
306
307 return bookmarkedheads
307 return bookmarkedheads
308
308
309 def checkheads(pushop):
309 def checkheads(pushop):
310 """Check that a push won't add any outgoing head
310 """Check that a push won't add any outgoing head
311
311
312 raise Abort error and display ui message as needed.
312 raise Abort error and display ui message as needed.
313 """
313 """
314
314
315 repo = pushop.repo.unfiltered()
315 repo = pushop.repo.unfiltered()
316 remote = pushop.remote
316 remote = pushop.remote
317 outgoing = pushop.outgoing
317 outgoing = pushop.outgoing
318 remoteheads = pushop.remoteheads
318 remoteheads = pushop.remoteheads
319 newbranch = pushop.newbranch
319 newbranch = pushop.newbranch
320 inc = bool(pushop.incoming)
320 inc = bool(pushop.incoming)
321
321
322 # Check for each named branch if we're creating new remote heads.
322 # Check for each named branch if we're creating new remote heads.
323 # To be a remote head after push, node must be either:
323 # To be a remote head after push, node must be either:
324 # - unknown locally
324 # - unknown locally
325 # - a local outgoing head descended from update
325 # - a local outgoing head descended from update
326 # - a remote head that's known locally and not
326 # - a remote head that's known locally and not
327 # ancestral to an outgoing head
327 # ancestral to an outgoing head
328 if remoteheads == [nullid]:
328 if remoteheads == [nullid]:
329 # remote is empty, nothing to check.
329 # remote is empty, nothing to check.
330 return
330 return
331
331
332 if remote.capable('branchmap'):
332 if remote.capable('branchmap'):
333 headssum = _headssummary(pushop)
333 headssum = _headssummary(pushop)
334 else:
334 else:
335 headssum = _oldheadssummary(repo, remoteheads, outgoing, inc)
335 headssum = _oldheadssummary(repo, remoteheads, outgoing, inc)
336 pushop.pushbranchmap = headssum
336 pushop.pushbranchmap = headssum
337 newbranches = [branch for branch, heads in headssum.iteritems()
337 newbranches = [branch for branch, heads in headssum.iteritems()
338 if heads[0] is None]
338 if heads[0] is None]
339 # 1. Check for new branches on the remote.
339 # 1. Check for new branches on the remote.
340 if newbranches and not newbranch: # new branch requires --new-branch
340 if newbranches and not newbranch: # new branch requires --new-branch
341 branchnames = ', '.join(sorted(newbranches))
341 branchnames = ', '.join(sorted(newbranches))
342 raise error.Abort(_("push creates new remote branches: %s!")
342 raise error.Abort(_("push creates new remote branches: %s!")
343 % branchnames,
343 % branchnames,
344 hint=_("use 'hg push --new-branch' to create"
344 hint=_("use 'hg push --new-branch' to create"
345 " new remote branches"))
345 " new remote branches"))
346
346
347 # 2. Find heads that we need not warn about
347 # 2. Find heads that we need not warn about
348 nowarnheads = _nowarnheads(pushop)
348 nowarnheads = _nowarnheads(pushop)
349
349
350 # 3. Check for new heads.
350 # 3. Check for new heads.
351 # If there are more heads after the push than before, a suitable
351 # If there are more heads after the push than before, a suitable
352 # error message, depending on unsynced status, is displayed.
352 # error message, depending on unsynced status, is displayed.
353 errormsg = None
353 errormsg = None
354 for branch, heads in sorted(headssum.iteritems()):
354 for branch, heads in sorted(headssum.iteritems()):
355 remoteheads, newheads, unsyncedheads, discardedheads = heads
355 remoteheads, newheads, unsyncedheads, discardedheads = heads
356 # add unsynced data
356 # add unsynced data
357 if remoteheads is None:
357 if remoteheads is None:
358 oldhs = set()
358 oldhs = set()
359 else:
359 else:
360 oldhs = set(remoteheads)
360 oldhs = set(remoteheads)
361 oldhs.update(unsyncedheads)
361 oldhs.update(unsyncedheads)
362 dhs = None # delta heads, the new heads on branch
362 dhs = None # delta heads, the new heads on branch
363 newhs = set(newheads)
363 newhs = set(newheads)
364 newhs.update(unsyncedheads)
364 newhs.update(unsyncedheads)
365 if unsyncedheads:
365 if unsyncedheads:
366 if None in unsyncedheads:
366 if None in unsyncedheads:
367 # old remote, no heads data
367 # old remote, no heads data
368 heads = None
368 heads = None
369 else:
369 else:
370 heads = scmutil.nodesummaries(repo, unsyncedheads)
370 heads = scmutil.nodesummaries(repo, unsyncedheads)
371 if heads is None:
371 if heads is None:
372 repo.ui.status(_("remote has heads that are "
372 repo.ui.status(_("remote has heads that are "
373 "not known locally\n"))
373 "not known locally\n"))
374 elif branch is None:
374 elif branch is None:
375 repo.ui.status(_("remote has heads that are "
375 repo.ui.status(_("remote has heads that are "
376 "not known locally: %s\n") % heads)
376 "not known locally: %s\n") % heads)
377 else:
377 else:
378 repo.ui.status(_("remote has heads on branch '%s' that are "
378 repo.ui.status(_("remote has heads on branch '%s' that are "
379 "not known locally: %s\n") % (branch, heads))
379 "not known locally: %s\n") % (branch, heads))
380 if remoteheads is None:
380 if remoteheads is None:
381 if len(newhs) > 1:
381 if len(newhs) > 1:
382 dhs = list(newhs)
382 dhs = list(newhs)
383 if errormsg is None:
383 if errormsg is None:
384 errormsg = (_("push creates new branch '%s' "
384 errormsg = (_("push creates new branch '%s' "
385 "with multiple heads") % (branch))
385 "with multiple heads") % (branch))
386 hint = _("merge or"
386 hint = _("merge or"
387 " see 'hg help push' for details about"
387 " see 'hg help push' for details about"
388 " pushing new heads")
388 " pushing new heads")
389 elif len(newhs) > len(oldhs):
389 elif len(newhs) > len(oldhs):
390 # remove bookmarked or existing remote heads from the new heads list
390 # remove bookmarked or existing remote heads from the new heads list
391 dhs = sorted(newhs - nowarnheads - oldhs)
391 dhs = sorted(newhs - nowarnheads - oldhs)
392 if dhs:
392 if dhs:
393 if errormsg is None:
393 if errormsg is None:
394 if branch not in ('default', None):
394 if branch not in ('default', None):
395 errormsg = _("push creates new remote head %s "
395 errormsg = _("push creates new remote head %s "
396 "on branch '%s'!") % (short(dhs[0]), branch)
396 "on branch '%s'!") % (short(dhs[0]), branch)
397 elif repo[dhs[0]].bookmarks():
397 elif repo[dhs[0]].bookmarks():
398 errormsg = _("push creates new remote head %s "
398 errormsg = _("push creates new remote head %s "
399 "with bookmark '%s'!") % (
399 "with bookmark '%s'!") % (
400 short(dhs[0]), repo[dhs[0]].bookmarks()[0])
400 short(dhs[0]), repo[dhs[0]].bookmarks()[0])
401 else:
401 else:
402 errormsg = _("push creates new remote head %s!"
402 errormsg = _("push creates new remote head %s!"
403 ) % short(dhs[0])
403 ) % short(dhs[0])
404 if unsyncedheads:
404 if unsyncedheads:
405 hint = _("pull and merge or"
405 hint = _("pull and merge or"
406 " see 'hg help push' for details about"
406 " see 'hg help push' for details about"
407 " pushing new heads")
407 " pushing new heads")
408 else:
408 else:
409 hint = _("merge or"
409 hint = _("merge or"
410 " see 'hg help push' for details about"
410 " see 'hg help push' for details about"
411 " pushing new heads")
411 " pushing new heads")
412 if branch is None:
412 if branch is None:
413 repo.ui.note(_("new remote heads:\n"))
413 repo.ui.note(_("new remote heads:\n"))
414 else:
414 else:
415 repo.ui.note(_("new remote heads on branch '%s':\n") % branch)
415 repo.ui.note(_("new remote heads on branch '%s':\n") % branch)
416 for h in dhs:
416 for h in dhs:
417 repo.ui.note((" %s\n") % short(h))
417 repo.ui.note((" %s\n") % short(h))
418 if errormsg:
418 if errormsg:
419 raise error.Abort(errormsg, hint=hint)
419 raise error.Abort(errormsg, hint=hint)
420
420
421 def _postprocessobsolete(pushop, futurecommon, candidate_newhs):
421 def _postprocessobsolete(pushop, futurecommon, candidate_newhs):
422 """post process the list of new heads with obsolescence information
422 """post process the list of new heads with obsolescence information
423
423
424 Exists as a sub-function to contain the complexity and allow extensions to
424 Exists as a sub-function to contain the complexity and allow extensions to
425 experiment with smarter logic.
425 experiment with smarter logic.
426
426
427 Returns (newheads, discarded_heads) tuple
427 Returns (newheads, discarded_heads) tuple
428 """
428 """
429 # known issue
429 # known issue
430 #
430 #
431 # * We "silently" skip processing on all changeset unknown locally
431 # * We "silently" skip processing on all changeset unknown locally
432 #
432 #
433 # * if <nh> is public on the remote, it won't be affected by obsolete
433 # * if <nh> is public on the remote, it won't be affected by obsolete
434 # marker and a new is created
434 # marker and a new is created
435
435
436 # define various utilities and containers
436 # define various utilities and containers
437 repo = pushop.repo
437 repo = pushop.repo
438 unfi = repo.unfiltered()
438 unfi = repo.unfiltered()
439 tonode = unfi.changelog.node
439 tonode = unfi.changelog.node
440 torev = unfi.changelog.nodemap.get
440 torev = unfi.changelog.nodemap.get
441 public = phases.public
441 public = phases.public
442 getphase = unfi._phasecache.phase
442 getphase = unfi._phasecache.phase
443 ispublic = (lambda r: getphase(unfi, r) == public)
443 ispublic = (lambda r: getphase(unfi, r) == public)
444 ispushed = (lambda n: torev(n) in futurecommon)
444 ispushed = (lambda n: torev(n) in futurecommon)
445 hasoutmarker = functools.partial(pushingmarkerfor, unfi.obsstore, ispushed)
445 hasoutmarker = functools.partial(pushingmarkerfor, unfi.obsstore, ispushed)
446 successorsmarkers = unfi.obsstore.successors
446 successorsmarkers = unfi.obsstore.successors
447 newhs = set() # final set of new heads
447 newhs = set() # final set of new heads
448 discarded = set() # new head of fully replaced branch
448 discarded = set() # new head of fully replaced branch
449
449
450 localcandidate = set() # candidate heads known locally
450 localcandidate = set() # candidate heads known locally
451 unknownheads = set() # candidate heads unknown locally
451 unknownheads = set() # candidate heads unknown locally
452 for h in candidate_newhs:
452 for h in candidate_newhs:
453 if h in unfi:
453 if h in unfi:
454 localcandidate.add(h)
454 localcandidate.add(h)
455 else:
455 else:
456 if successorsmarkers.get(h) is not None:
456 if successorsmarkers.get(h) is not None:
457 msg = ('checkheads: remote head unknown locally has'
457 msg = ('checkheads: remote head unknown locally has'
458 ' local marker: %s\n')
458 ' local marker: %s\n')
459 repo.ui.debug(msg % hex(h))
459 repo.ui.debug(msg % hex(h))
460 unknownheads.add(h)
460 unknownheads.add(h)
461
461
462 # fast path the simple case
462 # fast path the simple case
463 if len(localcandidate) == 1:
463 if len(localcandidate) == 1:
464 return unknownheads | set(candidate_newhs), set()
464 return unknownheads | set(candidate_newhs), set()
465
465
466 # actually process branch replacement
466 # actually process branch replacement
467 while localcandidate:
467 while localcandidate:
468 nh = localcandidate.pop()
468 nh = localcandidate.pop()
469 # run this check early to skip the evaluation of the whole branch
469 # run this check early to skip the evaluation of the whole branch
470 if (torev(nh) in futurecommon or ispublic(torev(nh))):
470 if (torev(nh) in futurecommon or ispublic(torev(nh))):
471 newhs.add(nh)
471 newhs.add(nh)
472 continue
472 continue
473
473
474 # Get all revs/nodes on the branch exclusive to this head
474 # Get all revs/nodes on the branch exclusive to this head
475 # (already filtered heads are "ignored"))
475 # (already filtered heads are "ignored"))
476 branchrevs = unfi.revs('only(%n, (%ln+%ln))',
476 branchrevs = unfi.revs('only(%n, (%ln+%ln))',
477 nh, localcandidate, newhs)
477 nh, localcandidate, newhs)
478 branchnodes = [tonode(r) for r in branchrevs]
478 branchnodes = [tonode(r) for r in branchrevs]
479
479
480 # The branch won't be hidden on the remote if
480 # The branch won't be hidden on the remote if
481 # * any part of it is public,
481 # * any part of it is public,
482 # * any part of it is considered part of the result by previous logic,
482 # * any part of it is considered part of the result by previous logic,
483 # * if we have no markers to push to obsolete it.
483 # * if we have no markers to push to obsolete it.
484 if (any(ispublic(r) for r in branchrevs)
484 if (any(ispublic(r) for r in branchrevs)
485 or any(torev(n) in futurecommon for n in branchnodes)
485 or any(torev(n) in futurecommon for n in branchnodes)
486 or any(not hasoutmarker(n) for n in branchnodes)):
486 or any(not hasoutmarker(n) for n in branchnodes)):
487 newhs.add(nh)
487 newhs.add(nh)
488 else:
488 else:
489 # note: there is a corner case if there is a merge in the branch.
489 # note: there is a corner case if there is a merge in the branch.
490 # we might end up with -more- heads. However, these heads are not
490 # we might end up with -more- heads. However, these heads are not
491 # "added" by the push, but more by the "removal" on the remote so I
491 # "added" by the push, but more by the "removal" on the remote so I
492 # think is a okay to ignore them,
492 # think is a okay to ignore them,
493 discarded.add(nh)
493 discarded.add(nh)
494 newhs |= unknownheads
494 newhs |= unknownheads
495 return newhs, discarded
495 return newhs, discarded
496
496
497 def pushingmarkerfor(obsstore, ispushed, node):
497 def pushingmarkerfor(obsstore, ispushed, node):
498 """true if some markers are to be pushed for node
498 """true if some markers are to be pushed for node
499
499
500 We cannot just look in to the pushed obsmarkers from the pushop because
500 We cannot just look in to the pushed obsmarkers from the pushop because
501 discovery might have filtered relevant markers. In addition listing all
501 discovery might have filtered relevant markers. In addition listing all
502 markers relevant to all changesets in the pushed set would be too expensive
502 markers relevant to all changesets in the pushed set would be too expensive
503 (O(len(repo)))
503 (O(len(repo)))
504
504
505 (note: There are cache opportunity in this function. but it would requires
505 (note: There are cache opportunity in this function. but it would requires
506 a two dimensional stack.)
506 a two dimensional stack.)
507 """
507 """
508 successorsmarkers = obsstore.successors
508 successorsmarkers = obsstore.successors
509 stack = [node]
509 stack = [node]
510 seen = set(stack)
510 seen = set(stack)
511 while stack:
511 while stack:
512 current = stack.pop()
512 current = stack.pop()
513 if ispushed(current):
513 if ispushed(current):
514 return True
514 return True
515 markers = successorsmarkers.get(current, ())
515 markers = successorsmarkers.get(current, ())
516 # markers fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents')
516 # markers fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents')
517 for m in markers:
517 for m in markers:
518 nexts = m[1] # successors
518 nexts = m[1] # successors
519 if not nexts: # this is a prune marker
519 if not nexts: # this is a prune marker
520 nexts = m[5] or () # parents
520 nexts = m[5] or () # parents
521 for n in nexts:
521 for n in nexts:
522 if n not in seen:
522 if n not in seen:
523 seen.add(n)
523 seen.add(n)
524 stack.append(n)
524 stack.append(n)
525 return False
525 return False
@@ -1,413 +1,412
1 #require serve
1 #require serve
2
2
3 This test is a duplicate of 'test-http.t', feel free to factor out
3 This test is a duplicate of 'test-http.t', feel free to factor out
4 parts that are not bundle1/bundle2 specific.
4 parts that are not bundle1/bundle2 specific.
5
5
6 $ cat << EOF >> $HGRCPATH
6 $ cat << EOF >> $HGRCPATH
7 > [devel]
7 > [devel]
8 > # This test is dedicated to interaction through old bundle
8 > # This test is dedicated to interaction through old bundle
9 > legacy.exchange = bundle1
9 > legacy.exchange = bundle1
10 > EOF
10 > EOF
11
11
12 $ hg init test
12 $ hg init test
13 $ cd test
13 $ cd test
14 $ echo foo>foo
14 $ echo foo>foo
15 $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
15 $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
16 $ echo foo>foo.d/foo
16 $ echo foo>foo.d/foo
17 $ echo bar>foo.d/bAr.hg.d/BaR
17 $ echo bar>foo.d/bAr.hg.d/BaR
18 $ echo bar>foo.d/baR.d.hg/bAR
18 $ echo bar>foo.d/baR.d.hg/bAR
19 $ hg commit -A -m 1
19 $ hg commit -A -m 1
20 adding foo
20 adding foo
21 adding foo.d/bAr.hg.d/BaR
21 adding foo.d/bAr.hg.d/BaR
22 adding foo.d/baR.d.hg/bAR
22 adding foo.d/baR.d.hg/bAR
23 adding foo.d/foo
23 adding foo.d/foo
24 $ hg serve -p $HGPORT -d --pid-file=../hg1.pid -E ../error.log
24 $ hg serve -p $HGPORT -d --pid-file=../hg1.pid -E ../error.log
25 $ hg serve --config server.uncompressed=False -p $HGPORT1 -d --pid-file=../hg2.pid
25 $ hg serve --config server.uncompressed=False -p $HGPORT1 -d --pid-file=../hg2.pid
26
26
27 Test server address cannot be reused
27 Test server address cannot be reused
28
28
29 $ hg serve -p $HGPORT1 2>&1
29 $ hg serve -p $HGPORT1 2>&1
30 abort: cannot start server at 'localhost:$HGPORT1': $EADDRINUSE$
30 abort: cannot start server at 'localhost:$HGPORT1': $EADDRINUSE$
31 [255]
31 [255]
32
32
33 $ cd ..
33 $ cd ..
34 $ cat hg1.pid hg2.pid >> $DAEMON_PIDS
34 $ cat hg1.pid hg2.pid >> $DAEMON_PIDS
35
35
36 clone via stream
36 clone via stream
37
37
38 #if no-reposimplestore
38 #if no-reposimplestore
39 $ hg clone --stream http://localhost:$HGPORT/ copy 2>&1
39 $ hg clone --stream http://localhost:$HGPORT/ copy 2>&1
40 streaming all changes
40 streaming all changes
41 6 files to transfer, 606 bytes of data
41 6 files to transfer, 606 bytes of data
42 transferred * bytes in * seconds (*/sec) (glob)
42 transferred * bytes in * seconds (*/sec) (glob)
43 searching for changes
43 searching for changes
44 no changes found
44 no changes found
45 updating to branch default
45 updating to branch default
46 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
46 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
47 $ hg verify -R copy
47 $ hg verify -R copy
48 checking changesets
48 checking changesets
49 checking manifests
49 checking manifests
50 crosschecking files in changesets and manifests
50 crosschecking files in changesets and manifests
51 checking files
51 checking files
52 4 files, 1 changesets, 4 total revisions
52 4 files, 1 changesets, 4 total revisions
53 #endif
53 #endif
54
54
55 try to clone via stream, should use pull instead
55 try to clone via stream, should use pull instead
56
56
57 $ hg clone --stream http://localhost:$HGPORT1/ copy2
57 $ hg clone --stream http://localhost:$HGPORT1/ copy2
58 warning: stream clone requested but server has them disabled
58 warning: stream clone requested but server has them disabled
59 requesting all changes
59 requesting all changes
60 adding changesets
60 adding changesets
61 adding manifests
61 adding manifests
62 adding file changes
62 adding file changes
63 added 1 changesets with 4 changes to 4 files
63 added 1 changesets with 4 changes to 4 files
64 new changesets 8b6053c928fe
64 new changesets 8b6053c928fe
65 updating to branch default
65 updating to branch default
66 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
66 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
67
67
68 try to clone via stream but missing requirements, so should use pull instead
68 try to clone via stream but missing requirements, so should use pull instead
69
69
70 $ cat > $TESTTMP/removesupportedformat.py << EOF
70 $ cat > $TESTTMP/removesupportedformat.py << EOF
71 > from mercurial import localrepo
71 > from mercurial import localrepo
72 > def extsetup(ui):
72 > def extsetup(ui):
73 > localrepo.localrepository.supportedformats.remove(b'generaldelta')
73 > localrepo.localrepository.supportedformats.remove(b'generaldelta')
74 > EOF
74 > EOF
75
75
76 $ hg clone --config extensions.rsf=$TESTTMP/removesupportedformat.py --stream http://localhost:$HGPORT/ copy3
76 $ hg clone --config extensions.rsf=$TESTTMP/removesupportedformat.py --stream http://localhost:$HGPORT/ copy3
77 warning: stream clone requested but client is missing requirements: generaldelta
77 warning: stream clone requested but client is missing requirements: generaldelta
78 (see https://www.mercurial-scm.org/wiki/MissingRequirement for more information)
78 (see https://www.mercurial-scm.org/wiki/MissingRequirement for more information)
79 requesting all changes
79 requesting all changes
80 adding changesets
80 adding changesets
81 adding manifests
81 adding manifests
82 adding file changes
82 adding file changes
83 added 1 changesets with 4 changes to 4 files
83 added 1 changesets with 4 changes to 4 files
84 new changesets 8b6053c928fe
84 new changesets 8b6053c928fe
85 updating to branch default
85 updating to branch default
86 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
86 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
87
87
88 clone via pull
88 clone via pull
89
89
90 $ hg clone http://localhost:$HGPORT1/ copy-pull
90 $ hg clone http://localhost:$HGPORT1/ copy-pull
91 requesting all changes
91 requesting all changes
92 adding changesets
92 adding changesets
93 adding manifests
93 adding manifests
94 adding file changes
94 adding file changes
95 added 1 changesets with 4 changes to 4 files
95 added 1 changesets with 4 changes to 4 files
96 new changesets 8b6053c928fe
96 new changesets 8b6053c928fe
97 updating to branch default
97 updating to branch default
98 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
98 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
99 $ hg verify -R copy-pull
99 $ hg verify -R copy-pull
100 checking changesets
100 checking changesets
101 checking manifests
101 checking manifests
102 crosschecking files in changesets and manifests
102 crosschecking files in changesets and manifests
103 checking files
103 checking files
104 4 files, 1 changesets, 4 total revisions
104 4 files, 1 changesets, 4 total revisions
105 $ cd test
105 $ cd test
106 $ echo bar > bar
106 $ echo bar > bar
107 $ hg commit -A -d '1 0' -m 2
107 $ hg commit -A -d '1 0' -m 2
108 adding bar
108 adding bar
109 $ cd ..
109 $ cd ..
110
110
111 clone over http with --update
111 clone over http with --update
112
112
113 $ hg clone http://localhost:$HGPORT1/ updated --update 0
113 $ hg clone http://localhost:$HGPORT1/ updated --update 0
114 requesting all changes
114 requesting all changes
115 adding changesets
115 adding changesets
116 adding manifests
116 adding manifests
117 adding file changes
117 adding file changes
118 added 2 changesets with 5 changes to 5 files
118 added 2 changesets with 5 changes to 5 files
119 new changesets 8b6053c928fe:5fed3813f7f5
119 new changesets 8b6053c928fe:5fed3813f7f5
120 updating to branch default
120 updating to branch default
121 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
121 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
122 $ hg log -r . -R updated
122 $ hg log -r . -R updated
123 changeset: 0:8b6053c928fe
123 changeset: 0:8b6053c928fe
124 user: test
124 user: test
125 date: Thu Jan 01 00:00:00 1970 +0000
125 date: Thu Jan 01 00:00:00 1970 +0000
126 summary: 1
126 summary: 1
127
127
128 $ rm -rf updated
128 $ rm -rf updated
129
129
130 incoming via HTTP
130 incoming via HTTP
131
131
132 $ hg clone http://localhost:$HGPORT1/ --rev 0 partial
132 $ hg clone http://localhost:$HGPORT1/ --rev 0 partial
133 adding changesets
133 adding changesets
134 adding manifests
134 adding manifests
135 adding file changes
135 adding file changes
136 added 1 changesets with 4 changes to 4 files
136 added 1 changesets with 4 changes to 4 files
137 new changesets 8b6053c928fe
137 new changesets 8b6053c928fe
138 updating to branch default
138 updating to branch default
139 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
139 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
140 $ cd partial
140 $ cd partial
141 $ touch LOCAL
141 $ touch LOCAL
142 $ hg ci -qAm LOCAL
142 $ hg ci -qAm LOCAL
143 $ hg incoming http://localhost:$HGPORT1/ --template '{desc}\n'
143 $ hg incoming http://localhost:$HGPORT1/ --template '{desc}\n'
144 comparing with http://localhost:$HGPORT1/
144 comparing with http://localhost:$HGPORT1/
145 searching for changes
145 searching for changes
146 2
146 2
147 $ cd ..
147 $ cd ..
148
148
149 pull
149 pull
150
150
151 $ cd copy-pull
151 $ cd copy-pull
152 $ cat >> .hg/hgrc <<EOF
152 $ cat >> .hg/hgrc <<EOF
153 > [hooks]
153 > [hooks]
154 > changegroup = sh -c "printenv.py changegroup"
154 > changegroup = sh -c "printenv.py changegroup"
155 > EOF
155 > EOF
156 $ hg pull
156 $ hg pull
157 pulling from http://localhost:$HGPORT1/
157 pulling from http://localhost:$HGPORT1/
158 searching for changes
158 searching for changes
159 adding changesets
159 adding changesets
160 adding manifests
160 adding manifests
161 adding file changes
161 adding file changes
162 added 1 changesets with 1 changes to 1 files
162 added 1 changesets with 1 changes to 1 files
163 new changesets 5fed3813f7f5
163 new changesets 5fed3813f7f5
164 changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_NODE_LAST=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=http://localhost:$HGPORT1/
164 changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_NODE_LAST=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=http://localhost:$HGPORT1/
165 (run 'hg update' to get a working copy)
165 (run 'hg update' to get a working copy)
166 $ cd ..
166 $ cd ..
167
167
168 clone from invalid URL
168 clone from invalid URL
169
169
170 $ hg clone http://localhost:$HGPORT/bad
170 $ hg clone http://localhost:$HGPORT/bad
171 abort: HTTP Error 404: Not Found
171 abort: HTTP Error 404: Not Found
172 [255]
172 [255]
173
173
174 test http authentication
174 test http authentication
175 + use the same server to test server side streaming preference
175 + use the same server to test server side streaming preference
176
176
177 $ cd test
177 $ cd test
178 $ cat << EOT > userpass.py
178 $ cat << EOT > userpass.py
179 > import base64
179 > import base64
180 > from mercurial.hgweb import common
180 > from mercurial.hgweb import common
181 > def perform_authentication(hgweb, req, op):
181 > def perform_authentication(hgweb, req, op):
182 > auth = req.headers.get('Authorization')
182 > auth = req.headers.get('Authorization')
183 > if not auth:
183 > if not auth:
184 > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who',
184 > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who',
185 > [('WWW-Authenticate', 'Basic Realm="mercurial"')])
185 > [('WWW-Authenticate', 'Basic Realm="mercurial"')])
186 > if base64.b64decode(auth.split()[1]).split(b':', 1) != [b'user',
186 > if base64.b64decode(auth.split()[1]).split(b':', 1) != [b'user',
187 > b'pass']:
187 > b'pass']:
188 > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no')
188 > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no')
189 > def extsetup():
189 > def extsetup():
190 > common.permhooks.insert(0, perform_authentication)
190 > common.permhooks.insert(0, perform_authentication)
191 > EOT
191 > EOT
192 $ hg serve --config extensions.x=userpass.py -p $HGPORT2 -d --pid-file=pid \
192 $ hg serve --config extensions.x=userpass.py -p $HGPORT2 -d --pid-file=pid \
193 > --config server.preferuncompressed=True \
193 > --config server.preferuncompressed=True \
194 > --config web.push_ssl=False --config web.allow_push=* -A ../access.log
194 > --config web.push_ssl=False --config web.allow_push=* -A ../access.log
195 $ cat pid >> $DAEMON_PIDS
195 $ cat pid >> $DAEMON_PIDS
196
196
197 $ cat << EOF > get_pass.py
197 $ cat << EOF > get_pass.py
198 > import getpass
198 > import getpass
199 > def newgetpass(arg):
199 > def newgetpass(arg):
200 > return "pass"
200 > return "pass"
201 > getpass.getpass = newgetpass
201 > getpass.getpass = newgetpass
202 > EOF
202 > EOF
203
203
204 $ hg id http://localhost:$HGPORT2/
204 $ hg id http://localhost:$HGPORT2/
205 abort: http authorization required for http://localhost:$HGPORT2/
205 abort: http authorization required for http://localhost:$HGPORT2/
206 [255]
206 [255]
207 $ hg id http://localhost:$HGPORT2/
207 $ hg id http://localhost:$HGPORT2/
208 abort: http authorization required for http://localhost:$HGPORT2/
208 abort: http authorization required for http://localhost:$HGPORT2/
209 [255]
209 [255]
210 $ hg id --config ui.interactive=true --config extensions.getpass=get_pass.py http://user@localhost:$HGPORT2/
210 $ hg id --config ui.interactive=true --config extensions.getpass=get_pass.py http://user@localhost:$HGPORT2/
211 http authorization required for http://localhost:$HGPORT2/
211 http authorization required for http://localhost:$HGPORT2/
212 realm: mercurial
212 realm: mercurial
213 user: user
213 user: user
214 password: 5fed3813f7f5
214 password: 5fed3813f7f5
215 $ hg id http://user:pass@localhost:$HGPORT2/
215 $ hg id http://user:pass@localhost:$HGPORT2/
216 5fed3813f7f5
216 5fed3813f7f5
217 $ echo '[auth]' >> .hg/hgrc
217 $ echo '[auth]' >> .hg/hgrc
218 $ echo 'l.schemes=http' >> .hg/hgrc
218 $ echo 'l.schemes=http' >> .hg/hgrc
219 $ echo 'l.prefix=lo' >> .hg/hgrc
219 $ echo 'l.prefix=lo' >> .hg/hgrc
220 $ echo 'l.username=user' >> .hg/hgrc
220 $ echo 'l.username=user' >> .hg/hgrc
221 $ echo 'l.password=pass' >> .hg/hgrc
221 $ echo 'l.password=pass' >> .hg/hgrc
222 $ hg id http://localhost:$HGPORT2/
222 $ hg id http://localhost:$HGPORT2/
223 5fed3813f7f5
223 5fed3813f7f5
224 $ hg id http://localhost:$HGPORT2/
224 $ hg id http://localhost:$HGPORT2/
225 5fed3813f7f5
225 5fed3813f7f5
226 $ hg id http://user@localhost:$HGPORT2/
226 $ hg id http://user@localhost:$HGPORT2/
227 5fed3813f7f5
227 5fed3813f7f5
228
228
229 #if no-reposimplestore
229 #if no-reposimplestore
230 $ hg clone http://user:pass@localhost:$HGPORT2/ dest 2>&1
230 $ hg clone http://user:pass@localhost:$HGPORT2/ dest 2>&1
231 streaming all changes
231 streaming all changes
232 7 files to transfer, 916 bytes of data
232 7 files to transfer, 916 bytes of data
233 transferred * bytes in * seconds (*/sec) (glob)
233 transferred * bytes in * seconds (*/sec) (glob)
234 searching for changes
234 searching for changes
235 no changes found
235 no changes found
236 updating to branch default
236 updating to branch default
237 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
237 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
238 #endif
238 #endif
239
239
240 --pull should override server's preferuncompressed
240 --pull should override server's preferuncompressed
241
241
242 $ hg clone --pull http://user:pass@localhost:$HGPORT2/ dest-pull 2>&1
242 $ hg clone --pull http://user:pass@localhost:$HGPORT2/ dest-pull 2>&1
243 requesting all changes
243 requesting all changes
244 adding changesets
244 adding changesets
245 adding manifests
245 adding manifests
246 adding file changes
246 adding file changes
247 added 2 changesets with 5 changes to 5 files
247 added 2 changesets with 5 changes to 5 files
248 new changesets 8b6053c928fe:5fed3813f7f5
248 new changesets 8b6053c928fe:5fed3813f7f5
249 updating to branch default
249 updating to branch default
250 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
250 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
251
251
252 $ hg id http://user2@localhost:$HGPORT2/
252 $ hg id http://user2@localhost:$HGPORT2/
253 abort: http authorization required for http://localhost:$HGPORT2/
253 abort: http authorization required for http://localhost:$HGPORT2/
254 [255]
254 [255]
255 $ hg id http://user:pass2@localhost:$HGPORT2/
255 $ hg id http://user:pass2@localhost:$HGPORT2/
256 abort: HTTP Error 403: no
256 abort: HTTP Error 403: no
257 [255]
257 [255]
258
258
259 $ hg -R dest-pull tag -r tip top
259 $ hg -R dest-pull tag -r tip top
260 $ hg -R dest-pull push http://user:pass@localhost:$HGPORT2/
260 $ hg -R dest-pull push http://user:pass@localhost:$HGPORT2/
261 pushing to http://user:***@localhost:$HGPORT2/
261 pushing to http://user:***@localhost:$HGPORT2/
262 searching for changes
262 searching for changes
263 remote: adding changesets
263 remote: adding changesets
264 remote: adding manifests
264 remote: adding manifests
265 remote: adding file changes
265 remote: adding file changes
266 remote: added 1 changesets with 1 changes to 1 files
266 remote: added 1 changesets with 1 changes to 1 files
267 $ hg rollback -q
267 $ hg rollback -q
268
268
269 $ sed 's/.*] "/"/' < ../access.log
269 $ sed 's/.*] "/"/' < ../access.log
270 "GET /?cmd=capabilities HTTP/1.1" 401 -
270 "GET /?cmd=capabilities HTTP/1.1" 401 -
271 "GET /?cmd=capabilities HTTP/1.1" 401 -
271 "GET /?cmd=capabilities HTTP/1.1" 401 -
272 "GET /?cmd=capabilities HTTP/1.1" 401 -
272 "GET /?cmd=capabilities HTTP/1.1" 401 -
273 "GET /?cmd=capabilities HTTP/1.1" 200 -
273 "GET /?cmd=capabilities HTTP/1.1" 200 -
274 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
274 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
275 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
275 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
276 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
276 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
277 "GET /?cmd=capabilities HTTP/1.1" 401 -
277 "GET /?cmd=capabilities HTTP/1.1" 401 -
278 "GET /?cmd=capabilities HTTP/1.1" 200 -
278 "GET /?cmd=capabilities HTTP/1.1" 200 -
279 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
279 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
280 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
280 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
281 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
281 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
282 "GET /?cmd=capabilities HTTP/1.1" 401 -
282 "GET /?cmd=capabilities HTTP/1.1" 401 -
283 "GET /?cmd=capabilities HTTP/1.1" 200 -
283 "GET /?cmd=capabilities HTTP/1.1" 200 -
284 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
284 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
285 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
285 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
286 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
286 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
287 "GET /?cmd=capabilities HTTP/1.1" 401 -
287 "GET /?cmd=capabilities HTTP/1.1" 401 -
288 "GET /?cmd=capabilities HTTP/1.1" 200 -
288 "GET /?cmd=capabilities HTTP/1.1" 200 -
289 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
289 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
290 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
290 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
291 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
291 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
292 "GET /?cmd=capabilities HTTP/1.1" 401 -
292 "GET /?cmd=capabilities HTTP/1.1" 401 -
293 "GET /?cmd=capabilities HTTP/1.1" 200 -
293 "GET /?cmd=capabilities HTTP/1.1" 200 -
294 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
294 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
295 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
295 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
296 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
296 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
297 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
297 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
298 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
298 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
299 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
299 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
300 "GET /?cmd=stream_out HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
300 "GET /?cmd=stream_out HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
301 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
301 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
302 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D5fed3813f7f5e1824344fdc9cf8f63bb662c292d x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
302 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D5fed3813f7f5e1824344fdc9cf8f63bb662c292d x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
303 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
303 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
304 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
304 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
305 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
305 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
306 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
306 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
307 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
307 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
308 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=5fed3813f7f5e1824344fdc9cf8f63bb662c292d x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
308 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=5fed3813f7f5e1824344fdc9cf8f63bb662c292d x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
309 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
309 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
310 "GET /?cmd=capabilities HTTP/1.1" 401 -
310 "GET /?cmd=capabilities HTTP/1.1" 401 -
311 "GET /?cmd=capabilities HTTP/1.1" 401 -
311 "GET /?cmd=capabilities HTTP/1.1" 401 -
312 "GET /?cmd=capabilities HTTP/1.1" 403 -
312 "GET /?cmd=capabilities HTTP/1.1" 403 -
313 "GET /?cmd=capabilities HTTP/1.1" 401 -
313 "GET /?cmd=capabilities HTTP/1.1" 401 -
314 "GET /?cmd=capabilities HTTP/1.1" 200 -
314 "GET /?cmd=capabilities HTTP/1.1" 200 -
315 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D7f4e523d01f2cc3765ac8934da3d14db775ff872 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
315 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D7f4e523d01f2cc3765ac8934da3d14db775ff872 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
316 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
316 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
317 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
317 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
318 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
318 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
319 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
320 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
319 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
321 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+5eb5abfefeea63c80dd7553bcc3783f37e0c5524* (glob)
320 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+5eb5abfefeea63c80dd7553bcc3783f37e0c5524* (glob)
322 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
321 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
323
322
324 $ cd ..
323 $ cd ..
325
324
326 clone of serve with repo in root and unserved subrepo (issue2970)
325 clone of serve with repo in root and unserved subrepo (issue2970)
327
326
328 $ hg --cwd test init sub
327 $ hg --cwd test init sub
329 $ echo empty > test/sub/empty
328 $ echo empty > test/sub/empty
330 $ hg --cwd test/sub add empty
329 $ hg --cwd test/sub add empty
331 $ hg --cwd test/sub commit -qm 'add empty'
330 $ hg --cwd test/sub commit -qm 'add empty'
332 $ hg --cwd test/sub tag -r 0 something
331 $ hg --cwd test/sub tag -r 0 something
333 $ echo sub = sub > test/.hgsub
332 $ echo sub = sub > test/.hgsub
334 $ hg --cwd test add .hgsub
333 $ hg --cwd test add .hgsub
335 $ hg --cwd test commit -qm 'add subrepo'
334 $ hg --cwd test commit -qm 'add subrepo'
336 $ hg clone http://localhost:$HGPORT noslash-clone
335 $ hg clone http://localhost:$HGPORT noslash-clone
337 requesting all changes
336 requesting all changes
338 adding changesets
337 adding changesets
339 adding manifests
338 adding manifests
340 adding file changes
339 adding file changes
341 added 3 changesets with 7 changes to 7 files
340 added 3 changesets with 7 changes to 7 files
342 new changesets 8b6053c928fe:56f9bc90cce6
341 new changesets 8b6053c928fe:56f9bc90cce6
343 updating to branch default
342 updating to branch default
344 abort: HTTP Error 404: Not Found
343 abort: HTTP Error 404: Not Found
345 [255]
344 [255]
346 $ hg clone http://localhost:$HGPORT/ slash-clone
345 $ hg clone http://localhost:$HGPORT/ slash-clone
347 requesting all changes
346 requesting all changes
348 adding changesets
347 adding changesets
349 adding manifests
348 adding manifests
350 adding file changes
349 adding file changes
351 added 3 changesets with 7 changes to 7 files
350 added 3 changesets with 7 changes to 7 files
352 new changesets 8b6053c928fe:56f9bc90cce6
351 new changesets 8b6053c928fe:56f9bc90cce6
353 updating to branch default
352 updating to branch default
354 abort: HTTP Error 404: Not Found
353 abort: HTTP Error 404: Not Found
355 [255]
354 [255]
356
355
357 check error log
356 check error log
358
357
359 $ cat error.log
358 $ cat error.log
360
359
361 Check error reporting while pulling/cloning
360 Check error reporting while pulling/cloning
362
361
363 $ $RUNTESTDIR/killdaemons.py
362 $ $RUNTESTDIR/killdaemons.py
364 $ hg serve -R test -p $HGPORT -d --pid-file=hg3.pid -E error.log --config extensions.crash=${TESTDIR}/crashgetbundler.py
363 $ hg serve -R test -p $HGPORT -d --pid-file=hg3.pid -E error.log --config extensions.crash=${TESTDIR}/crashgetbundler.py
365 $ cat hg3.pid >> $DAEMON_PIDS
364 $ cat hg3.pid >> $DAEMON_PIDS
366 $ hg clone http://localhost:$HGPORT/ abort-clone
365 $ hg clone http://localhost:$HGPORT/ abort-clone
367 requesting all changes
366 requesting all changes
368 abort: remote error:
367 abort: remote error:
369 this is an exercise
368 this is an exercise
370 [255]
369 [255]
371 $ cat error.log
370 $ cat error.log
372
371
373 disable pull-based clones
372 disable pull-based clones
374
373
375 $ hg serve -R test -p $HGPORT1 -d --pid-file=hg4.pid -E error.log --config server.disablefullbundle=True
374 $ hg serve -R test -p $HGPORT1 -d --pid-file=hg4.pid -E error.log --config server.disablefullbundle=True
376 $ cat hg4.pid >> $DAEMON_PIDS
375 $ cat hg4.pid >> $DAEMON_PIDS
377 $ hg clone http://localhost:$HGPORT1/ disable-pull-clone
376 $ hg clone http://localhost:$HGPORT1/ disable-pull-clone
378 requesting all changes
377 requesting all changes
379 abort: remote error:
378 abort: remote error:
380 server has pull-based clones disabled
379 server has pull-based clones disabled
381 [255]
380 [255]
382
381
383 #if no-reposimplestore
382 #if no-reposimplestore
384 ... but keep stream clones working
383 ... but keep stream clones working
385
384
386 $ hg clone --stream --noupdate http://localhost:$HGPORT1/ test-stream-clone
385 $ hg clone --stream --noupdate http://localhost:$HGPORT1/ test-stream-clone
387 streaming all changes
386 streaming all changes
388 * files to transfer, * of data (glob)
387 * files to transfer, * of data (glob)
389 transferred * in * seconds (* KB/sec) (glob)
388 transferred * in * seconds (* KB/sec) (glob)
390 searching for changes
389 searching for changes
391 no changes found
390 no changes found
392 #endif
391 #endif
393
392
394 ... and also keep partial clones and pulls working
393 ... and also keep partial clones and pulls working
395 $ hg clone http://localhost:$HGPORT1 --rev 0 test-partial-clone
394 $ hg clone http://localhost:$HGPORT1 --rev 0 test-partial-clone
396 adding changesets
395 adding changesets
397 adding manifests
396 adding manifests
398 adding file changes
397 adding file changes
399 added 1 changesets with 4 changes to 4 files
398 added 1 changesets with 4 changes to 4 files
400 new changesets 8b6053c928fe
399 new changesets 8b6053c928fe
401 updating to branch default
400 updating to branch default
402 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
401 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
403 $ hg pull -R test-partial-clone
402 $ hg pull -R test-partial-clone
404 pulling from http://localhost:$HGPORT1/
403 pulling from http://localhost:$HGPORT1/
405 searching for changes
404 searching for changes
406 adding changesets
405 adding changesets
407 adding manifests
406 adding manifests
408 adding file changes
407 adding file changes
409 added 2 changesets with 3 changes to 3 files
408 added 2 changesets with 3 changes to 3 files
410 new changesets 5fed3813f7f5:56f9bc90cce6
409 new changesets 5fed3813f7f5:56f9bc90cce6
411 (run 'hg update' to get a working copy)
410 (run 'hg update' to get a working copy)
412
411
413 $ cat error.log
412 $ cat error.log
@@ -1,563 +1,556
1 #require killdaemons serve
1 #require killdaemons serve
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ echo foo>foo
5 $ echo foo>foo
6 $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
6 $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
7 $ echo foo>foo.d/foo
7 $ echo foo>foo.d/foo
8 $ echo bar>foo.d/bAr.hg.d/BaR
8 $ echo bar>foo.d/bAr.hg.d/BaR
9 $ echo bar>foo.d/baR.d.hg/bAR
9 $ echo bar>foo.d/baR.d.hg/bAR
10 $ hg commit -A -m 1
10 $ hg commit -A -m 1
11 adding foo
11 adding foo
12 adding foo.d/bAr.hg.d/BaR
12 adding foo.d/bAr.hg.d/BaR
13 adding foo.d/baR.d.hg/bAR
13 adding foo.d/baR.d.hg/bAR
14 adding foo.d/foo
14 adding foo.d/foo
15 $ hg serve -p $HGPORT -d --pid-file=../hg1.pid -E ../error.log
15 $ hg serve -p $HGPORT -d --pid-file=../hg1.pid -E ../error.log
16 $ hg serve --config server.uncompressed=False -p $HGPORT1 -d --pid-file=../hg2.pid
16 $ hg serve --config server.uncompressed=False -p $HGPORT1 -d --pid-file=../hg2.pid
17
17
18 Test server address cannot be reused
18 Test server address cannot be reused
19
19
20 $ hg serve -p $HGPORT1 2>&1
20 $ hg serve -p $HGPORT1 2>&1
21 abort: cannot start server at 'localhost:$HGPORT1': $EADDRINUSE$
21 abort: cannot start server at 'localhost:$HGPORT1': $EADDRINUSE$
22 [255]
22 [255]
23
23
24 $ cd ..
24 $ cd ..
25 $ cat hg1.pid hg2.pid >> $DAEMON_PIDS
25 $ cat hg1.pid hg2.pid >> $DAEMON_PIDS
26
26
27 clone via stream
27 clone via stream
28
28
29 #if no-reposimplestore
29 #if no-reposimplestore
30 $ hg clone --stream http://localhost:$HGPORT/ copy 2>&1
30 $ hg clone --stream http://localhost:$HGPORT/ copy 2>&1
31 streaming all changes
31 streaming all changes
32 6 files to transfer, 606 bytes of data
32 6 files to transfer, 606 bytes of data
33 transferred * bytes in * seconds (*/sec) (glob)
33 transferred * bytes in * seconds (*/sec) (glob)
34 searching for changes
34 searching for changes
35 no changes found
35 no changes found
36 updating to branch default
36 updating to branch default
37 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
37 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
38 $ hg verify -R copy
38 $ hg verify -R copy
39 checking changesets
39 checking changesets
40 checking manifests
40 checking manifests
41 crosschecking files in changesets and manifests
41 crosschecking files in changesets and manifests
42 checking files
42 checking files
43 4 files, 1 changesets, 4 total revisions
43 4 files, 1 changesets, 4 total revisions
44 #endif
44 #endif
45
45
46 try to clone via stream, should use pull instead
46 try to clone via stream, should use pull instead
47
47
48 $ hg clone --stream http://localhost:$HGPORT1/ copy2
48 $ hg clone --stream http://localhost:$HGPORT1/ copy2
49 warning: stream clone requested but server has them disabled
49 warning: stream clone requested but server has them disabled
50 requesting all changes
50 requesting all changes
51 adding changesets
51 adding changesets
52 adding manifests
52 adding manifests
53 adding file changes
53 adding file changes
54 added 1 changesets with 4 changes to 4 files
54 added 1 changesets with 4 changes to 4 files
55 new changesets 8b6053c928fe
55 new changesets 8b6053c928fe
56 updating to branch default
56 updating to branch default
57 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
57 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
58
58
59 try to clone via stream but missing requirements, so should use pull instead
59 try to clone via stream but missing requirements, so should use pull instead
60
60
61 $ cat > $TESTTMP/removesupportedformat.py << EOF
61 $ cat > $TESTTMP/removesupportedformat.py << EOF
62 > from mercurial import localrepo
62 > from mercurial import localrepo
63 > def extsetup(ui):
63 > def extsetup(ui):
64 > localrepo.localrepository.supportedformats.remove('generaldelta')
64 > localrepo.localrepository.supportedformats.remove('generaldelta')
65 > EOF
65 > EOF
66
66
67 $ hg clone --config extensions.rsf=$TESTTMP/removesupportedformat.py --stream http://localhost:$HGPORT/ copy3
67 $ hg clone --config extensions.rsf=$TESTTMP/removesupportedformat.py --stream http://localhost:$HGPORT/ copy3
68 warning: stream clone requested but client is missing requirements: generaldelta
68 warning: stream clone requested but client is missing requirements: generaldelta
69 (see https://www.mercurial-scm.org/wiki/MissingRequirement for more information)
69 (see https://www.mercurial-scm.org/wiki/MissingRequirement for more information)
70 requesting all changes
70 requesting all changes
71 adding changesets
71 adding changesets
72 adding manifests
72 adding manifests
73 adding file changes
73 adding file changes
74 added 1 changesets with 4 changes to 4 files
74 added 1 changesets with 4 changes to 4 files
75 new changesets 8b6053c928fe
75 new changesets 8b6053c928fe
76 updating to branch default
76 updating to branch default
77 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
77 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
78
78
79 clone via pull
79 clone via pull
80
80
81 $ hg clone http://localhost:$HGPORT1/ copy-pull
81 $ hg clone http://localhost:$HGPORT1/ copy-pull
82 requesting all changes
82 requesting all changes
83 adding changesets
83 adding changesets
84 adding manifests
84 adding manifests
85 adding file changes
85 adding file changes
86 added 1 changesets with 4 changes to 4 files
86 added 1 changesets with 4 changes to 4 files
87 new changesets 8b6053c928fe
87 new changesets 8b6053c928fe
88 updating to branch default
88 updating to branch default
89 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
89 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
90 $ hg verify -R copy-pull
90 $ hg verify -R copy-pull
91 checking changesets
91 checking changesets
92 checking manifests
92 checking manifests
93 crosschecking files in changesets and manifests
93 crosschecking files in changesets and manifests
94 checking files
94 checking files
95 4 files, 1 changesets, 4 total revisions
95 4 files, 1 changesets, 4 total revisions
96 $ cd test
96 $ cd test
97 $ echo bar > bar
97 $ echo bar > bar
98 $ hg commit -A -d '1 0' -m 2
98 $ hg commit -A -d '1 0' -m 2
99 adding bar
99 adding bar
100 $ cd ..
100 $ cd ..
101
101
102 clone over http with --update
102 clone over http with --update
103
103
104 $ hg clone http://localhost:$HGPORT1/ updated --update 0
104 $ hg clone http://localhost:$HGPORT1/ updated --update 0
105 requesting all changes
105 requesting all changes
106 adding changesets
106 adding changesets
107 adding manifests
107 adding manifests
108 adding file changes
108 adding file changes
109 added 2 changesets with 5 changes to 5 files
109 added 2 changesets with 5 changes to 5 files
110 new changesets 8b6053c928fe:5fed3813f7f5
110 new changesets 8b6053c928fe:5fed3813f7f5
111 updating to branch default
111 updating to branch default
112 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 $ hg log -r . -R updated
113 $ hg log -r . -R updated
114 changeset: 0:8b6053c928fe
114 changeset: 0:8b6053c928fe
115 user: test
115 user: test
116 date: Thu Jan 01 00:00:00 1970 +0000
116 date: Thu Jan 01 00:00:00 1970 +0000
117 summary: 1
117 summary: 1
118
118
119 $ rm -rf updated
119 $ rm -rf updated
120
120
121 incoming via HTTP
121 incoming via HTTP
122
122
123 $ hg clone http://localhost:$HGPORT1/ --rev 0 partial
123 $ hg clone http://localhost:$HGPORT1/ --rev 0 partial
124 adding changesets
124 adding changesets
125 adding manifests
125 adding manifests
126 adding file changes
126 adding file changes
127 added 1 changesets with 4 changes to 4 files
127 added 1 changesets with 4 changes to 4 files
128 new changesets 8b6053c928fe
128 new changesets 8b6053c928fe
129 updating to branch default
129 updating to branch default
130 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
130 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
131 $ cd partial
131 $ cd partial
132 $ touch LOCAL
132 $ touch LOCAL
133 $ hg ci -qAm LOCAL
133 $ hg ci -qAm LOCAL
134 $ hg incoming http://localhost:$HGPORT1/ --template '{desc}\n'
134 $ hg incoming http://localhost:$HGPORT1/ --template '{desc}\n'
135 comparing with http://localhost:$HGPORT1/
135 comparing with http://localhost:$HGPORT1/
136 searching for changes
136 searching for changes
137 2
137 2
138 $ cd ..
138 $ cd ..
139
139
140 pull
140 pull
141
141
142 $ cd copy-pull
142 $ cd copy-pull
143 $ cat >> .hg/hgrc <<EOF
143 $ cat >> .hg/hgrc <<EOF
144 > [hooks]
144 > [hooks]
145 > changegroup = sh -c "printenv.py changegroup"
145 > changegroup = sh -c "printenv.py changegroup"
146 > EOF
146 > EOF
147 $ hg pull
147 $ hg pull
148 pulling from http://localhost:$HGPORT1/
148 pulling from http://localhost:$HGPORT1/
149 searching for changes
149 searching for changes
150 adding changesets
150 adding changesets
151 adding manifests
151 adding manifests
152 adding file changes
152 adding file changes
153 added 1 changesets with 1 changes to 1 files
153 added 1 changesets with 1 changes to 1 files
154 new changesets 5fed3813f7f5
154 new changesets 5fed3813f7f5
155 changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_NODE_LAST=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=http://localhost:$HGPORT1/
155 changegroup hook: HG_HOOKNAME=changegroup HG_HOOKTYPE=changegroup HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_NODE_LAST=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_TXNID=TXN:$ID$ HG_URL=http://localhost:$HGPORT1/
156 (run 'hg update' to get a working copy)
156 (run 'hg update' to get a working copy)
157 $ cd ..
157 $ cd ..
158
158
159 clone from invalid URL
159 clone from invalid URL
160
160
161 $ hg clone http://localhost:$HGPORT/bad
161 $ hg clone http://localhost:$HGPORT/bad
162 abort: HTTP Error 404: Not Found
162 abort: HTTP Error 404: Not Found
163 [255]
163 [255]
164
164
165 test http authentication
165 test http authentication
166 + use the same server to test server side streaming preference
166 + use the same server to test server side streaming preference
167
167
168 $ cd test
168 $ cd test
169 $ cat << EOT > userpass.py
169 $ cat << EOT > userpass.py
170 > import base64
170 > import base64
171 > from mercurial.hgweb import common
171 > from mercurial.hgweb import common
172 > def perform_authentication(hgweb, req, op):
172 > def perform_authentication(hgweb, req, op):
173 > auth = req.headers.get('Authorization')
173 > auth = req.headers.get('Authorization')
174 > if not auth:
174 > if not auth:
175 > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who',
175 > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who',
176 > [('WWW-Authenticate', 'Basic Realm="mercurial"')])
176 > [('WWW-Authenticate', 'Basic Realm="mercurial"')])
177 > if base64.b64decode(auth.split()[1]).split(':', 1) != ['user', 'pass']:
177 > if base64.b64decode(auth.split()[1]).split(':', 1) != ['user', 'pass']:
178 > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no')
178 > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no')
179 > def extsetup():
179 > def extsetup():
180 > common.permhooks.insert(0, perform_authentication)
180 > common.permhooks.insert(0, perform_authentication)
181 > EOT
181 > EOT
182 $ hg serve --config extensions.x=userpass.py -p $HGPORT2 -d --pid-file=pid \
182 $ hg serve --config extensions.x=userpass.py -p $HGPORT2 -d --pid-file=pid \
183 > --config server.preferuncompressed=True \
183 > --config server.preferuncompressed=True \
184 > --config web.push_ssl=False --config web.allow_push=* -A ../access.log
184 > --config web.push_ssl=False --config web.allow_push=* -A ../access.log
185 $ cat pid >> $DAEMON_PIDS
185 $ cat pid >> $DAEMON_PIDS
186
186
187 $ cat << EOF > get_pass.py
187 $ cat << EOF > get_pass.py
188 > import getpass
188 > import getpass
189 > def newgetpass(arg):
189 > def newgetpass(arg):
190 > return "pass"
190 > return "pass"
191 > getpass.getpass = newgetpass
191 > getpass.getpass = newgetpass
192 > EOF
192 > EOF
193
193
194 $ hg id http://localhost:$HGPORT2/
194 $ hg id http://localhost:$HGPORT2/
195 abort: http authorization required for http://localhost:$HGPORT2/
195 abort: http authorization required for http://localhost:$HGPORT2/
196 [255]
196 [255]
197 $ hg id http://localhost:$HGPORT2/
197 $ hg id http://localhost:$HGPORT2/
198 abort: http authorization required for http://localhost:$HGPORT2/
198 abort: http authorization required for http://localhost:$HGPORT2/
199 [255]
199 [255]
200 $ hg id --config ui.interactive=true --config extensions.getpass=get_pass.py http://user@localhost:$HGPORT2/
200 $ hg id --config ui.interactive=true --config extensions.getpass=get_pass.py http://user@localhost:$HGPORT2/
201 http authorization required for http://localhost:$HGPORT2/
201 http authorization required for http://localhost:$HGPORT2/
202 realm: mercurial
202 realm: mercurial
203 user: user
203 user: user
204 password: 5fed3813f7f5
204 password: 5fed3813f7f5
205 $ hg id http://user:pass@localhost:$HGPORT2/
205 $ hg id http://user:pass@localhost:$HGPORT2/
206 5fed3813f7f5
206 5fed3813f7f5
207 $ echo '[auth]' >> .hg/hgrc
207 $ echo '[auth]' >> .hg/hgrc
208 $ echo 'l.schemes=http' >> .hg/hgrc
208 $ echo 'l.schemes=http' >> .hg/hgrc
209 $ echo 'l.prefix=lo' >> .hg/hgrc
209 $ echo 'l.prefix=lo' >> .hg/hgrc
210 $ echo 'l.username=user' >> .hg/hgrc
210 $ echo 'l.username=user' >> .hg/hgrc
211 $ echo 'l.password=pass' >> .hg/hgrc
211 $ echo 'l.password=pass' >> .hg/hgrc
212 $ hg id http://localhost:$HGPORT2/
212 $ hg id http://localhost:$HGPORT2/
213 5fed3813f7f5
213 5fed3813f7f5
214 $ hg id http://localhost:$HGPORT2/
214 $ hg id http://localhost:$HGPORT2/
215 5fed3813f7f5
215 5fed3813f7f5
216 $ hg id http://user@localhost:$HGPORT2/
216 $ hg id http://user@localhost:$HGPORT2/
217 5fed3813f7f5
217 5fed3813f7f5
218
218
219 #if no-reposimplestore
219 #if no-reposimplestore
220 $ hg clone http://user:pass@localhost:$HGPORT2/ dest 2>&1
220 $ hg clone http://user:pass@localhost:$HGPORT2/ dest 2>&1
221 streaming all changes
221 streaming all changes
222 7 files to transfer, 916 bytes of data
222 7 files to transfer, 916 bytes of data
223 transferred * bytes in * seconds (*/sec) (glob)
223 transferred * bytes in * seconds (*/sec) (glob)
224 searching for changes
224 searching for changes
225 no changes found
225 no changes found
226 updating to branch default
226 updating to branch default
227 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
227 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
228 #endif
228 #endif
229
229
230 --pull should override server's preferuncompressed
230 --pull should override server's preferuncompressed
231 $ hg clone --pull http://user:pass@localhost:$HGPORT2/ dest-pull 2>&1
231 $ hg clone --pull http://user:pass@localhost:$HGPORT2/ dest-pull 2>&1
232 requesting all changes
232 requesting all changes
233 adding changesets
233 adding changesets
234 adding manifests
234 adding manifests
235 adding file changes
235 adding file changes
236 added 2 changesets with 5 changes to 5 files
236 added 2 changesets with 5 changes to 5 files
237 new changesets 8b6053c928fe:5fed3813f7f5
237 new changesets 8b6053c928fe:5fed3813f7f5
238 updating to branch default
238 updating to branch default
239 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
239 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
240
240
241 $ hg id http://user2@localhost:$HGPORT2/
241 $ hg id http://user2@localhost:$HGPORT2/
242 abort: http authorization required for http://localhost:$HGPORT2/
242 abort: http authorization required for http://localhost:$HGPORT2/
243 [255]
243 [255]
244 $ hg id http://user:pass2@localhost:$HGPORT2/
244 $ hg id http://user:pass2@localhost:$HGPORT2/
245 abort: HTTP Error 403: no
245 abort: HTTP Error 403: no
246 [255]
246 [255]
247
247
248 $ hg -R dest-pull tag -r tip top
248 $ hg -R dest-pull tag -r tip top
249 $ hg -R dest-pull push http://user:pass@localhost:$HGPORT2/
249 $ hg -R dest-pull push http://user:pass@localhost:$HGPORT2/
250 pushing to http://user:***@localhost:$HGPORT2/
250 pushing to http://user:***@localhost:$HGPORT2/
251 searching for changes
251 searching for changes
252 remote: adding changesets
252 remote: adding changesets
253 remote: adding manifests
253 remote: adding manifests
254 remote: adding file changes
254 remote: adding file changes
255 remote: added 1 changesets with 1 changes to 1 files
255 remote: added 1 changesets with 1 changes to 1 files
256 $ hg rollback -q
256 $ hg rollback -q
257 $ hg -R dest-pull push http://user:pass@localhost:$HGPORT2/ --debug --config devel.debug.peer-request=yes
257 $ hg -R dest-pull push http://user:pass@localhost:$HGPORT2/ --debug --config devel.debug.peer-request=yes
258 pushing to http://user:***@localhost:$HGPORT2/
258 pushing to http://user:***@localhost:$HGPORT2/
259 using http://localhost:$HGPORT2/
259 using http://localhost:$HGPORT2/
260 http auth: user user, password ****
260 http auth: user user, password ****
261 sending capabilities command
261 sending capabilities command
262 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=capabilities
262 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=capabilities
263 http auth: user user, password ****
263 http auth: user user, password ****
264 devel-peer-request: finished in *.???? seconds (200) (glob)
264 devel-peer-request: finished in *.???? seconds (200) (glob)
265 query 1; heads
265 query 1; heads
266 devel-peer-request: batched-content
266 devel-peer-request: batched-content
267 devel-peer-request: - heads (0 arguments)
267 devel-peer-request: - heads (0 arguments)
268 devel-peer-request: - known (1 arguments)
268 devel-peer-request: - known (1 arguments)
269 sending batch command
269 sending batch command
270 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=batch
270 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=batch
271 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
271 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
272 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
272 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
273 devel-peer-request: 68 bytes of commands arguments in headers
273 devel-peer-request: 68 bytes of commands arguments in headers
274 devel-peer-request: finished in *.???? seconds (200) (glob)
274 devel-peer-request: finished in *.???? seconds (200) (glob)
275 searching for changes
275 searching for changes
276 all remote heads known locally
276 all remote heads known locally
277 preparing listkeys for "phases"
277 preparing listkeys for "phases"
278 sending listkeys command
278 sending listkeys command
279 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
279 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
280 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
280 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
281 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
281 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
282 devel-peer-request: 16 bytes of commands arguments in headers
282 devel-peer-request: 16 bytes of commands arguments in headers
283 devel-peer-request: finished in *.???? seconds (200) (glob)
283 devel-peer-request: finished in *.???? seconds (200) (glob)
284 received listkey for "phases": 58 bytes
284 received listkey for "phases": 58 bytes
285 checking for updated bookmarks
285 checking for updated bookmarks
286 preparing listkeys for "bookmarks"
286 preparing listkeys for "bookmarks"
287 sending listkeys command
287 sending listkeys command
288 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
288 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
289 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
289 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
290 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
290 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
291 devel-peer-request: 19 bytes of commands arguments in headers
291 devel-peer-request: 19 bytes of commands arguments in headers
292 devel-peer-request: finished in *.???? seconds (200) (glob)
292 devel-peer-request: finished in *.???? seconds (200) (glob)
293 received listkey for "bookmarks": 0 bytes
293 received listkey for "bookmarks": 0 bytes
294 sending branchmap command
294 sending branchmap command
295 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=branchmap
295 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=branchmap
296 devel-peer-request: Vary X-HgProto-1
296 devel-peer-request: Vary X-HgProto-1
297 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
297 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
298 devel-peer-request: finished in *.???? seconds (200) (glob)
298 devel-peer-request: finished in *.???? seconds (200) (glob)
299 sending branchmap command
300 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=branchmap
301 devel-peer-request: Vary X-HgProto-1
302 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
303 devel-peer-request: finished in *.???? seconds (200) (glob)
304 preparing listkeys for "bookmarks"
299 preparing listkeys for "bookmarks"
305 sending listkeys command
300 sending listkeys command
306 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
301 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
307 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
302 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
308 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
303 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
309 devel-peer-request: 19 bytes of commands arguments in headers
304 devel-peer-request: 19 bytes of commands arguments in headers
310 devel-peer-request: finished in *.???? seconds (200) (glob)
305 devel-peer-request: finished in *.???? seconds (200) (glob)
311 received listkey for "bookmarks": 0 bytes
306 received listkey for "bookmarks": 0 bytes
312 1 changesets found
307 1 changesets found
313 list of changesets:
308 list of changesets:
314 7f4e523d01f2cc3765ac8934da3d14db775ff872
309 7f4e523d01f2cc3765ac8934da3d14db775ff872
315 bundle2-output-bundle: "HG20", 5 parts total
310 bundle2-output-bundle: "HG20", 5 parts total
316 bundle2-output-part: "replycaps" 205 bytes payload
311 bundle2-output-part: "replycaps" 205 bytes payload
317 bundle2-output-part: "check:phases" 24 bytes payload
312 bundle2-output-part: "check:phases" 24 bytes payload
318 bundle2-output-part: "check:heads" streamed payload
313 bundle2-output-part: "check:heads" streamed payload
319 bundle2-output-part: "changegroup" (params: 1 mandatory) streamed payload
314 bundle2-output-part: "changegroup" (params: 1 mandatory) streamed payload
320 bundle2-output-part: "phase-heads" 24 bytes payload
315 bundle2-output-part: "phase-heads" 24 bytes payload
321 sending unbundle command
316 sending unbundle command
322 sending 1013 bytes
317 sending 1013 bytes
323 devel-peer-request: POST http://localhost:$HGPORT2/?cmd=unbundle
318 devel-peer-request: POST http://localhost:$HGPORT2/?cmd=unbundle
324 devel-peer-request: Content-length 1013
319 devel-peer-request: Content-length 1013
325 devel-peer-request: Content-type application/mercurial-0.1
320 devel-peer-request: Content-type application/mercurial-0.1
326 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
321 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
327 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
322 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
328 devel-peer-request: 16 bytes of commands arguments in headers
323 devel-peer-request: 16 bytes of commands arguments in headers
329 devel-peer-request: 1013 bytes of data
324 devel-peer-request: 1013 bytes of data
330 devel-peer-request: finished in *.???? seconds (200) (glob)
325 devel-peer-request: finished in *.???? seconds (200) (glob)
331 bundle2-input-bundle: no-transaction
326 bundle2-input-bundle: no-transaction
332 bundle2-input-part: "reply:changegroup" (advisory) (params: 0 advisory) supported
327 bundle2-input-part: "reply:changegroup" (advisory) (params: 0 advisory) supported
333 bundle2-input-part: "output" (advisory) (params: 0 advisory) supported
328 bundle2-input-part: "output" (advisory) (params: 0 advisory) supported
334 bundle2-input-part: total payload size 100
329 bundle2-input-part: total payload size 100
335 remote: adding changesets
330 remote: adding changesets
336 remote: adding manifests
331 remote: adding manifests
337 remote: adding file changes
332 remote: adding file changes
338 remote: added 1 changesets with 1 changes to 1 files
333 remote: added 1 changesets with 1 changes to 1 files
339 bundle2-input-part: "output" (advisory) supported
334 bundle2-input-part: "output" (advisory) supported
340 bundle2-input-bundle: 2 parts total
335 bundle2-input-bundle: 2 parts total
341 preparing listkeys for "phases"
336 preparing listkeys for "phases"
342 sending listkeys command
337 sending listkeys command
343 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
338 devel-peer-request: GET http://localhost:$HGPORT2/?cmd=listkeys
344 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
339 devel-peer-request: Vary X-HgArg-1,X-HgProto-1
345 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
340 devel-peer-request: X-hgproto-1 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
346 devel-peer-request: 16 bytes of commands arguments in headers
341 devel-peer-request: 16 bytes of commands arguments in headers
347 devel-peer-request: finished in *.???? seconds (200) (glob)
342 devel-peer-request: finished in *.???? seconds (200) (glob)
348 received listkey for "phases": 15 bytes
343 received listkey for "phases": 15 bytes
349 $ hg rollback -q
344 $ hg rollback -q
350
345
351 $ sed 's/.*] "/"/' < ../access.log
346 $ sed 's/.*] "/"/' < ../access.log
352 "GET /?cmd=capabilities HTTP/1.1" 401 -
347 "GET /?cmd=capabilities HTTP/1.1" 401 -
353 "GET /?cmd=capabilities HTTP/1.1" 401 -
348 "GET /?cmd=capabilities HTTP/1.1" 401 -
354 "GET /?cmd=capabilities HTTP/1.1" 401 -
349 "GET /?cmd=capabilities HTTP/1.1" 401 -
355 "GET /?cmd=capabilities HTTP/1.1" 200 -
350 "GET /?cmd=capabilities HTTP/1.1" 200 -
356 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
351 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
357 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
352 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
358 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
353 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
359 "GET /?cmd=capabilities HTTP/1.1" 401 -
354 "GET /?cmd=capabilities HTTP/1.1" 401 -
360 "GET /?cmd=capabilities HTTP/1.1" 200 -
355 "GET /?cmd=capabilities HTTP/1.1" 200 -
361 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
356 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
362 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
357 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
363 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
358 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
364 "GET /?cmd=capabilities HTTP/1.1" 401 -
359 "GET /?cmd=capabilities HTTP/1.1" 401 -
365 "GET /?cmd=capabilities HTTP/1.1" 200 -
360 "GET /?cmd=capabilities HTTP/1.1" 200 -
366 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
361 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
367 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
362 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
368 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
363 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
369 "GET /?cmd=capabilities HTTP/1.1" 401 -
364 "GET /?cmd=capabilities HTTP/1.1" 401 -
370 "GET /?cmd=capabilities HTTP/1.1" 200 -
365 "GET /?cmd=capabilities HTTP/1.1" 200 -
371 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
366 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
372 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
367 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
373 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
368 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
374 "GET /?cmd=capabilities HTTP/1.1" 401 -
369 "GET /?cmd=capabilities HTTP/1.1" 401 -
375 "GET /?cmd=capabilities HTTP/1.1" 200 -
370 "GET /?cmd=capabilities HTTP/1.1" 200 -
376 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
371 "GET /?cmd=lookup HTTP/1.1" 200 - x-hgarg-1:key=tip x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
377 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
372 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=namespaces x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
378 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
373 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
379 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
374 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
380 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
375 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
381 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
376 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
382 "GET /?cmd=stream_out HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
377 "GET /?cmd=stream_out HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
383 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D5fed3813f7f5e1824344fdc9cf8f63bb662c292d x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
378 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D5fed3813f7f5e1824344fdc9cf8f63bb662c292d x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
384 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:bookmarks=1&$USUAL_BUNDLE_CAPS$&cg=0&common=5fed3813f7f5e1824344fdc9cf8f63bb662c292d&heads=5fed3813f7f5e1824344fdc9cf8f63bb662c292d&listkeys=bookmarks&phases=1 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
379 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:bookmarks=1&$USUAL_BUNDLE_CAPS$&cg=0&common=5fed3813f7f5e1824344fdc9cf8f63bb662c292d&heads=5fed3813f7f5e1824344fdc9cf8f63bb662c292d&listkeys=bookmarks&phases=1 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull (no-reposimplestore !)
385 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
380 "GET /?cmd=capabilities HTTP/1.1" 401 - (no-reposimplestore !)
386 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
381 "GET /?cmd=capabilities HTTP/1.1" 200 - (no-reposimplestore !)
387 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
382 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
388 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:bookmarks=1&$USUAL_BUNDLE_CAPS$&cg=1&common=0000000000000000000000000000000000000000&heads=5fed3813f7f5e1824344fdc9cf8f63bb662c292d&listkeys=bookmarks&phases=1 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
383 "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:bookmarks=1&$USUAL_BUNDLE_CAPS$&cg=1&common=0000000000000000000000000000000000000000&heads=5fed3813f7f5e1824344fdc9cf8f63bb662c292d&listkeys=bookmarks&phases=1 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
389 "GET /?cmd=capabilities HTTP/1.1" 401 -
384 "GET /?cmd=capabilities HTTP/1.1" 401 -
390 "GET /?cmd=capabilities HTTP/1.1" 401 -
385 "GET /?cmd=capabilities HTTP/1.1" 401 -
391 "GET /?cmd=capabilities HTTP/1.1" 403 -
386 "GET /?cmd=capabilities HTTP/1.1" 403 -
392 "GET /?cmd=capabilities HTTP/1.1" 401 -
387 "GET /?cmd=capabilities HTTP/1.1" 401 -
393 "GET /?cmd=capabilities HTTP/1.1" 200 -
388 "GET /?cmd=capabilities HTTP/1.1" 200 -
394 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D7f4e523d01f2cc3765ac8934da3d14db775ff872 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
389 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D7f4e523d01f2cc3765ac8934da3d14db775ff872 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
395 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
390 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
396 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
391 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
397 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
392 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
398 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
399 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
393 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
400 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=666f726365* (glob)
394 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=666f726365* (glob)
401 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
395 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
402 "GET /?cmd=capabilities HTTP/1.1" 401 -
396 "GET /?cmd=capabilities HTTP/1.1" 401 -
403 "GET /?cmd=capabilities HTTP/1.1" 200 -
397 "GET /?cmd=capabilities HTTP/1.1" 200 -
404 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D7f4e523d01f2cc3765ac8934da3d14db775ff872 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
398 "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D7f4e523d01f2cc3765ac8934da3d14db775ff872 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
405 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
399 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
406 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
400 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
407 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
401 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
408 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
409 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
402 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
410 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=666f726365 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
403 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=666f726365 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
411 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
404 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
412
405
413 $ cd ..
406 $ cd ..
414
407
415 clone of serve with repo in root and unserved subrepo (issue2970)
408 clone of serve with repo in root and unserved subrepo (issue2970)
416
409
417 $ hg --cwd test init sub
410 $ hg --cwd test init sub
418 $ echo empty > test/sub/empty
411 $ echo empty > test/sub/empty
419 $ hg --cwd test/sub add empty
412 $ hg --cwd test/sub add empty
420 $ hg --cwd test/sub commit -qm 'add empty'
413 $ hg --cwd test/sub commit -qm 'add empty'
421 $ hg --cwd test/sub tag -r 0 something
414 $ hg --cwd test/sub tag -r 0 something
422 $ echo sub = sub > test/.hgsub
415 $ echo sub = sub > test/.hgsub
423 $ hg --cwd test add .hgsub
416 $ hg --cwd test add .hgsub
424 $ hg --cwd test commit -qm 'add subrepo'
417 $ hg --cwd test commit -qm 'add subrepo'
425 $ hg clone http://localhost:$HGPORT noslash-clone
418 $ hg clone http://localhost:$HGPORT noslash-clone
426 requesting all changes
419 requesting all changes
427 adding changesets
420 adding changesets
428 adding manifests
421 adding manifests
429 adding file changes
422 adding file changes
430 added 3 changesets with 7 changes to 7 files
423 added 3 changesets with 7 changes to 7 files
431 new changesets 8b6053c928fe:56f9bc90cce6
424 new changesets 8b6053c928fe:56f9bc90cce6
432 updating to branch default
425 updating to branch default
433 abort: HTTP Error 404: Not Found
426 abort: HTTP Error 404: Not Found
434 [255]
427 [255]
435 $ hg clone http://localhost:$HGPORT/ slash-clone
428 $ hg clone http://localhost:$HGPORT/ slash-clone
436 requesting all changes
429 requesting all changes
437 adding changesets
430 adding changesets
438 adding manifests
431 adding manifests
439 adding file changes
432 adding file changes
440 added 3 changesets with 7 changes to 7 files
433 added 3 changesets with 7 changes to 7 files
441 new changesets 8b6053c928fe:56f9bc90cce6
434 new changesets 8b6053c928fe:56f9bc90cce6
442 updating to branch default
435 updating to branch default
443 abort: HTTP Error 404: Not Found
436 abort: HTTP Error 404: Not Found
444 [255]
437 [255]
445
438
446 check error log
439 check error log
447
440
448 $ cat error.log
441 $ cat error.log
449
442
450 check abort error reporting while pulling/cloning
443 check abort error reporting while pulling/cloning
451
444
452 $ $RUNTESTDIR/killdaemons.py
445 $ $RUNTESTDIR/killdaemons.py
453 $ hg serve -R test -p $HGPORT -d --pid-file=hg3.pid -E error.log --config extensions.crash=${TESTDIR}/crashgetbundler.py
446 $ hg serve -R test -p $HGPORT -d --pid-file=hg3.pid -E error.log --config extensions.crash=${TESTDIR}/crashgetbundler.py
454 $ cat hg3.pid >> $DAEMON_PIDS
447 $ cat hg3.pid >> $DAEMON_PIDS
455 $ hg clone http://localhost:$HGPORT/ abort-clone
448 $ hg clone http://localhost:$HGPORT/ abort-clone
456 requesting all changes
449 requesting all changes
457 remote: abort: this is an exercise
450 remote: abort: this is an exercise
458 abort: pull failed on remote
451 abort: pull failed on remote
459 [255]
452 [255]
460 $ cat error.log
453 $ cat error.log
461
454
462 disable pull-based clones
455 disable pull-based clones
463
456
464 $ hg serve -R test -p $HGPORT1 -d --pid-file=hg4.pid -E error.log --config server.disablefullbundle=True
457 $ hg serve -R test -p $HGPORT1 -d --pid-file=hg4.pid -E error.log --config server.disablefullbundle=True
465 $ cat hg4.pid >> $DAEMON_PIDS
458 $ cat hg4.pid >> $DAEMON_PIDS
466 $ hg clone http://localhost:$HGPORT1/ disable-pull-clone
459 $ hg clone http://localhost:$HGPORT1/ disable-pull-clone
467 requesting all changes
460 requesting all changes
468 remote: abort: server has pull-based clones disabled
461 remote: abort: server has pull-based clones disabled
469 abort: pull failed on remote
462 abort: pull failed on remote
470 (remove --pull if specified or upgrade Mercurial)
463 (remove --pull if specified or upgrade Mercurial)
471 [255]
464 [255]
472
465
473 #if no-reposimplestore
466 #if no-reposimplestore
474 ... but keep stream clones working
467 ... but keep stream clones working
475
468
476 $ hg clone --stream --noupdate http://localhost:$HGPORT1/ test-stream-clone
469 $ hg clone --stream --noupdate http://localhost:$HGPORT1/ test-stream-clone
477 streaming all changes
470 streaming all changes
478 * files to transfer, * of data (glob)
471 * files to transfer, * of data (glob)
479 transferred * in * seconds (*/sec) (glob)
472 transferred * in * seconds (*/sec) (glob)
480 searching for changes
473 searching for changes
481 no changes found
474 no changes found
482 $ cat error.log
475 $ cat error.log
483 #endif
476 #endif
484
477
485 ... and also keep partial clones and pulls working
478 ... and also keep partial clones and pulls working
486 $ hg clone http://localhost:$HGPORT1 --rev 0 test-partial-clone
479 $ hg clone http://localhost:$HGPORT1 --rev 0 test-partial-clone
487 adding changesets
480 adding changesets
488 adding manifests
481 adding manifests
489 adding file changes
482 adding file changes
490 added 1 changesets with 4 changes to 4 files
483 added 1 changesets with 4 changes to 4 files
491 new changesets 8b6053c928fe
484 new changesets 8b6053c928fe
492 updating to branch default
485 updating to branch default
493 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
486 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
494 $ hg pull -R test-partial-clone
487 $ hg pull -R test-partial-clone
495 pulling from http://localhost:$HGPORT1/
488 pulling from http://localhost:$HGPORT1/
496 searching for changes
489 searching for changes
497 adding changesets
490 adding changesets
498 adding manifests
491 adding manifests
499 adding file changes
492 adding file changes
500 added 2 changesets with 3 changes to 3 files
493 added 2 changesets with 3 changes to 3 files
501 new changesets 5fed3813f7f5:56f9bc90cce6
494 new changesets 5fed3813f7f5:56f9bc90cce6
502 (run 'hg update' to get a working copy)
495 (run 'hg update' to get a working copy)
503
496
504 corrupt cookies file should yield a warning
497 corrupt cookies file should yield a warning
505
498
506 $ cat > $TESTTMP/cookies.txt << EOF
499 $ cat > $TESTTMP/cookies.txt << EOF
507 > bad format
500 > bad format
508 > EOF
501 > EOF
509
502
510 $ hg --config auth.cookiefile=$TESTTMP/cookies.txt id http://localhost:$HGPORT/
503 $ hg --config auth.cookiefile=$TESTTMP/cookies.txt id http://localhost:$HGPORT/
511 (error loading cookie file $TESTTMP/cookies.txt: '*/cookies.txt' does not look like a Netscape format cookies file; continuing without cookies) (glob)
504 (error loading cookie file $TESTTMP/cookies.txt: '*/cookies.txt' does not look like a Netscape format cookies file; continuing without cookies) (glob)
512 56f9bc90cce6
505 56f9bc90cce6
513
506
514 $ killdaemons.py
507 $ killdaemons.py
515
508
516 Create dummy authentication handler that looks for cookies. It doesn't do anything
509 Create dummy authentication handler that looks for cookies. It doesn't do anything
517 useful. It just raises an HTTP 500 with details about the Cookie request header.
510 useful. It just raises an HTTP 500 with details about the Cookie request header.
518 We raise HTTP 500 because its message is printed in the abort message.
511 We raise HTTP 500 because its message is printed in the abort message.
519
512
520 $ cat > cookieauth.py << EOF
513 $ cat > cookieauth.py << EOF
521 > from mercurial import util
514 > from mercurial import util
522 > from mercurial.hgweb import common
515 > from mercurial.hgweb import common
523 > def perform_authentication(hgweb, req, op):
516 > def perform_authentication(hgweb, req, op):
524 > cookie = req.headers.get('Cookie')
517 > cookie = req.headers.get('Cookie')
525 > if not cookie:
518 > if not cookie:
526 > raise common.ErrorResponse(common.HTTP_SERVER_ERROR, 'no-cookie')
519 > raise common.ErrorResponse(common.HTTP_SERVER_ERROR, 'no-cookie')
527 > raise common.ErrorResponse(common.HTTP_SERVER_ERROR, 'Cookie: %s' % cookie)
520 > raise common.ErrorResponse(common.HTTP_SERVER_ERROR, 'Cookie: %s' % cookie)
528 > def extsetup():
521 > def extsetup():
529 > common.permhooks.insert(0, perform_authentication)
522 > common.permhooks.insert(0, perform_authentication)
530 > EOF
523 > EOF
531
524
532 $ hg serve --config extensions.cookieauth=cookieauth.py -R test -p $HGPORT -d --pid-file=pid
525 $ hg serve --config extensions.cookieauth=cookieauth.py -R test -p $HGPORT -d --pid-file=pid
533 $ cat pid > $DAEMON_PIDS
526 $ cat pid > $DAEMON_PIDS
534
527
535 Request without cookie sent should fail due to lack of cookie
528 Request without cookie sent should fail due to lack of cookie
536
529
537 $ hg id http://localhost:$HGPORT
530 $ hg id http://localhost:$HGPORT
538 abort: HTTP Error 500: no-cookie
531 abort: HTTP Error 500: no-cookie
539 [255]
532 [255]
540
533
541 Populate a cookies file
534 Populate a cookies file
542
535
543 $ cat > cookies.txt << EOF
536 $ cat > cookies.txt << EOF
544 > # HTTP Cookie File
537 > # HTTP Cookie File
545 > # Expiration is 2030-01-01 at midnight
538 > # Expiration is 2030-01-01 at midnight
546 > .example.com TRUE / FALSE 1893456000 hgkey examplevalue
539 > .example.com TRUE / FALSE 1893456000 hgkey examplevalue
547 > EOF
540 > EOF
548
541
549 Should not send a cookie for another domain
542 Should not send a cookie for another domain
550
543
551 $ hg --config auth.cookiefile=cookies.txt id http://localhost:$HGPORT/
544 $ hg --config auth.cookiefile=cookies.txt id http://localhost:$HGPORT/
552 abort: HTTP Error 500: no-cookie
545 abort: HTTP Error 500: no-cookie
553 [255]
546 [255]
554
547
555 Add a cookie entry for our test server and verify it is sent
548 Add a cookie entry for our test server and verify it is sent
556
549
557 $ cat >> cookies.txt << EOF
550 $ cat >> cookies.txt << EOF
558 > localhost.local FALSE / FALSE 1893456000 hgkey localhostvalue
551 > localhost.local FALSE / FALSE 1893456000 hgkey localhostvalue
559 > EOF
552 > EOF
560
553
561 $ hg --config auth.cookiefile=cookies.txt id http://localhost:$HGPORT/
554 $ hg --config auth.cookiefile=cookies.txt id http://localhost:$HGPORT/
562 abort: HTTP Error 500: Cookie: hgkey=localhostvalue
555 abort: HTTP Error 500: Cookie: hgkey=localhostvalue
563 [255]
556 [255]
@@ -1,580 +1,579
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 bundle2"
5 $ CAP="getbundle bundle2"
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 > killdaemons.py
24 > killdaemons.py
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 new changesets d57206cc072a:a19bfa7e7328
143 new changesets d57206cc072a:a19bfa7e7328
144 (run 'hg update' to get a working copy)
144 (run 'hg update' to get a working copy)
145 $ hg incoming $remote
145 $ hg incoming $remote
146 comparing with http://localhost:$HGPORT/
146 comparing with http://localhost:$HGPORT/
147 searching for changes
147 searching for changes
148 no changes found
148 no changes found
149 [1]
149 [1]
150 $ cd ..
150 $ cd ..
151
151
152 Local is subset:
152 Local is subset:
153
153
154 $ hg clone main subset --rev name2 ; cd subset
154 $ hg clone main subset --rev name2 ; cd subset
155 adding changesets
155 adding changesets
156 adding manifests
156 adding manifests
157 adding file changes
157 adding file changes
158 added 6 changesets with 12 changes to 2 files
158 added 6 changesets with 12 changes to 2 files
159 new changesets d57206cc072a:d8f638ac69e9
159 new changesets d57206cc072a:d8f638ac69e9
160 updating to branch name2
160 updating to branch name2
161 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
161 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
162 $ hg incoming $remote
162 $ hg incoming $remote
163 comparing with http://localhost:$HGPORT/
163 comparing with http://localhost:$HGPORT/
164 searching for changes
164 searching for changes
165 6 a7892891da29: r2 name1
165 6 a7892891da29: r2 name1
166 7 2c8d5d5ec612: r3 name1
166 7 2c8d5d5ec612: r3 name1
167 8 e71dbbc70e03: r4 name1
167 8 e71dbbc70e03: r4 name1
168 9 025829e08038: r9 both
168 9 025829e08038: r9 both
169 10 8b6bad1512e1: r10 both
169 10 8b6bad1512e1: r10 both
170 11 a19bfa7e7328: r11 both
170 11 a19bfa7e7328: r11 both
171 $ hg outgoing $remote
171 $ hg outgoing $remote
172 comparing with http://localhost:$HGPORT/
172 comparing with http://localhost:$HGPORT/
173 searching for changes
173 searching for changes
174 no changes found
174 no changes found
175 [1]
175 [1]
176 $ hg push $remote
176 $ hg push $remote
177 pushing to http://localhost:$HGPORT/
177 pushing to http://localhost:$HGPORT/
178 searching for changes
178 searching for changes
179 no changes found
179 no changes found
180 [1]
180 [1]
181 $ hg pull $remote
181 $ hg pull $remote
182 pulling from http://localhost:$HGPORT/
182 pulling from http://localhost:$HGPORT/
183 searching for changes
183 searching for changes
184 adding changesets
184 adding changesets
185 adding manifests
185 adding manifests
186 adding file changes
186 adding file changes
187 added 6 changesets with 12 changes to 2 files
187 added 6 changesets with 12 changes to 2 files
188 new changesets a7892891da29:a19bfa7e7328
188 new changesets a7892891da29:a19bfa7e7328
189 (run 'hg update' to get a working copy)
189 (run 'hg update' to get a working copy)
190 $ hg incoming $remote
190 $ hg incoming $remote
191 comparing with http://localhost:$HGPORT/
191 comparing with http://localhost:$HGPORT/
192 searching for changes
192 searching for changes
193 no changes found
193 no changes found
194 [1]
194 [1]
195 $ cd ..
195 $ cd ..
196 $ tstop
196 $ tstop
197
197
198 Remote is empty:
198 Remote is empty:
199
199
200 $ tstart empty2
200 $ tstart empty2
201 $ cd main
201 $ cd main
202 $ hg incoming $remote
202 $ hg incoming $remote
203 comparing with http://localhost:$HGPORT/
203 comparing with http://localhost:$HGPORT/
204 searching for changes
204 searching for changes
205 no changes found
205 no changes found
206 [1]
206 [1]
207 $ hg outgoing $remote
207 $ hg outgoing $remote
208 comparing with http://localhost:$HGPORT/
208 comparing with http://localhost:$HGPORT/
209 searching for changes
209 searching for changes
210 0 d57206cc072a: r0
210 0 d57206cc072a: r0
211 1 0019a3b924fd: r1
211 1 0019a3b924fd: r1
212 2 a7892891da29: r2 name1
212 2 a7892891da29: r2 name1
213 3 2c8d5d5ec612: r3 name1
213 3 2c8d5d5ec612: r3 name1
214 4 e71dbbc70e03: r4 name1
214 4 e71dbbc70e03: r4 name1
215 5 70314b29987d: r5 name2
215 5 70314b29987d: r5 name2
216 6 6c6f5d5f3c11: r6 name2
216 6 6c6f5d5f3c11: r6 name2
217 7 b6b4d315a2ac: r7 name2
217 7 b6b4d315a2ac: r7 name2
218 8 d8f638ac69e9: r8 name2
218 8 d8f638ac69e9: r8 name2
219 9 025829e08038: r9 both
219 9 025829e08038: r9 both
220 10 8b6bad1512e1: r10 both
220 10 8b6bad1512e1: r10 both
221 11 a19bfa7e7328: r11 both
221 11 a19bfa7e7328: r11 both
222 $ hg pull $remote
222 $ hg pull $remote
223 pulling from http://localhost:$HGPORT/
223 pulling from http://localhost:$HGPORT/
224 searching for changes
224 searching for changes
225 no changes found
225 no changes found
226 $ hg push $remote
226 $ hg push $remote
227 pushing to http://localhost:$HGPORT/
227 pushing to http://localhost:$HGPORT/
228 searching for changes
228 searching for changes
229 remote: adding changesets
229 remote: adding changesets
230 remote: adding manifests
230 remote: adding manifests
231 remote: adding file changes
231 remote: adding file changes
232 remote: added 12 changesets with 24 changes to 2 files
232 remote: added 12 changesets with 24 changes to 2 files
233 $ hg outgoing $remote
233 $ hg outgoing $remote
234 comparing with http://localhost:$HGPORT/
234 comparing with http://localhost:$HGPORT/
235 searching for changes
235 searching for changes
236 no changes found
236 no changes found
237 [1]
237 [1]
238 $ cd ..
238 $ cd ..
239 $ tstop
239 $ tstop
240
240
241 Local is superset:
241 Local is superset:
242
242
243 $ hg clone main subset2 --rev name2
243 $ hg clone main subset2 --rev name2
244 adding changesets
244 adding changesets
245 adding manifests
245 adding manifests
246 adding file changes
246 adding file changes
247 added 6 changesets with 12 changes to 2 files
247 added 6 changesets with 12 changes to 2 files
248 new changesets d57206cc072a:d8f638ac69e9
248 new changesets d57206cc072a:d8f638ac69e9
249 updating to branch name2
249 updating to branch name2
250 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
250 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
251 $ tstart subset2
251 $ tstart subset2
252 $ cd main
252 $ cd main
253 $ hg incoming $remote
253 $ hg incoming $remote
254 comparing with http://localhost:$HGPORT/
254 comparing with http://localhost:$HGPORT/
255 searching for changes
255 searching for changes
256 no changes found
256 no changes found
257 [1]
257 [1]
258 $ hg outgoing $remote
258 $ hg outgoing $remote
259 comparing with http://localhost:$HGPORT/
259 comparing with http://localhost:$HGPORT/
260 searching for changes
260 searching for changes
261 2 a7892891da29: r2 name1
261 2 a7892891da29: r2 name1
262 3 2c8d5d5ec612: r3 name1
262 3 2c8d5d5ec612: r3 name1
263 4 e71dbbc70e03: r4 name1
263 4 e71dbbc70e03: r4 name1
264 9 025829e08038: r9 both
264 9 025829e08038: r9 both
265 10 8b6bad1512e1: r10 both
265 10 8b6bad1512e1: r10 both
266 11 a19bfa7e7328: r11 both
266 11 a19bfa7e7328: r11 both
267 $ hg pull $remote
267 $ hg pull $remote
268 pulling from http://localhost:$HGPORT/
268 pulling from http://localhost:$HGPORT/
269 searching for changes
269 searching for changes
270 no changes found
270 no changes found
271 $ hg push $remote
271 $ hg push $remote
272 pushing to http://localhost:$HGPORT/
272 pushing to http://localhost:$HGPORT/
273 searching for changes
273 searching for changes
274 abort: push creates new remote branches: both, name1!
274 abort: push creates new remote branches: both, name1!
275 (use 'hg push --new-branch' to create new remote branches)
275 (use 'hg push --new-branch' to create new remote branches)
276 [255]
276 [255]
277 $ hg push $remote --new-branch
277 $ hg push $remote --new-branch
278 pushing to http://localhost:$HGPORT/
278 pushing to http://localhost:$HGPORT/
279 searching for changes
279 searching for changes
280 remote: adding changesets
280 remote: adding changesets
281 remote: adding manifests
281 remote: adding manifests
282 remote: adding file changes
282 remote: adding file changes
283 remote: added 6 changesets with 12 changes to 2 files
283 remote: added 6 changesets with 12 changes to 2 files
284 $ hg outgoing $remote
284 $ hg outgoing $remote
285 comparing with http://localhost:$HGPORT/
285 comparing with http://localhost:$HGPORT/
286 searching for changes
286 searching for changes
287 no changes found
287 no changes found
288 [1]
288 [1]
289 $ cd ..
289 $ cd ..
290 $ tstop
290 $ tstop
291
291
292 Partial pull:
292 Partial pull:
293
293
294 $ tstart main
294 $ tstart main
295 $ hg clone $remote partial --rev name2
295 $ hg clone $remote partial --rev name2
296 adding changesets
296 adding changesets
297 adding manifests
297 adding manifests
298 adding file changes
298 adding file changes
299 added 6 changesets with 12 changes to 2 files
299 added 6 changesets with 12 changes to 2 files
300 new changesets d57206cc072a:d8f638ac69e9
300 new changesets d57206cc072a:d8f638ac69e9
301 updating to branch name2
301 updating to branch name2
302 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
302 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
303 $ cd partial
303 $ cd partial
304 $ hg incoming $remote
304 $ hg incoming $remote
305 comparing with http://localhost:$HGPORT/
305 comparing with http://localhost:$HGPORT/
306 searching for changes
306 searching for changes
307 6 a7892891da29: r2 name1
307 6 a7892891da29: r2 name1
308 7 2c8d5d5ec612: r3 name1
308 7 2c8d5d5ec612: r3 name1
309 8 e71dbbc70e03: r4 name1
309 8 e71dbbc70e03: r4 name1
310 9 025829e08038: r9 both
310 9 025829e08038: r9 both
311 10 8b6bad1512e1: r10 both
311 10 8b6bad1512e1: r10 both
312 11 a19bfa7e7328: r11 both
312 11 a19bfa7e7328: r11 both
313 $ hg incoming $remote --rev name1
313 $ hg incoming $remote --rev name1
314 comparing with http://localhost:$HGPORT/
314 comparing with http://localhost:$HGPORT/
315 searching for changes
315 searching for changes
316 6 a7892891da29: r2 name1
316 6 a7892891da29: r2 name1
317 7 2c8d5d5ec612: r3 name1
317 7 2c8d5d5ec612: r3 name1
318 8 e71dbbc70e03: r4 name1
318 8 e71dbbc70e03: r4 name1
319 $ hg pull $remote --rev name1
319 $ hg pull $remote --rev name1
320 pulling from http://localhost:$HGPORT/
320 pulling from http://localhost:$HGPORT/
321 searching for changes
321 searching for changes
322 adding changesets
322 adding changesets
323 adding manifests
323 adding manifests
324 adding file changes
324 adding file changes
325 added 3 changesets with 6 changes to 2 files (+1 heads)
325 added 3 changesets with 6 changes to 2 files (+1 heads)
326 new changesets a7892891da29:e71dbbc70e03
326 new changesets a7892891da29:e71dbbc70e03
327 (run 'hg heads' to see heads)
327 (run 'hg heads' to see heads)
328 $ hg incoming $remote
328 $ hg incoming $remote
329 comparing with http://localhost:$HGPORT/
329 comparing with http://localhost:$HGPORT/
330 searching for changes
330 searching for changes
331 9 025829e08038: r9 both
331 9 025829e08038: r9 both
332 10 8b6bad1512e1: r10 both
332 10 8b6bad1512e1: r10 both
333 11 a19bfa7e7328: r11 both
333 11 a19bfa7e7328: r11 both
334 $ cd ..
334 $ cd ..
335 $ tstop
335 $ tstop
336
336
337 Both have new stuff in new named branches:
337 Both have new stuff in new named branches:
338
338
339 $ hg clone main repo1a --rev name1 -q
339 $ hg clone main repo1a --rev name1 -q
340 $ hg clone repo1a repo1b -q
340 $ hg clone repo1a repo1b -q
341 $ hg clone main repo2a --rev name2 -q
341 $ hg clone main repo2a --rev name2 -q
342 $ hg clone repo2a repo2b -q
342 $ hg clone repo2a repo2b -q
343 $ tstart repo1a
343 $ tstart repo1a
344
344
345 $ cd repo2a
345 $ cd repo2a
346 $ hg incoming $remote
346 $ hg incoming $remote
347 comparing with http://localhost:$HGPORT/
347 comparing with http://localhost:$HGPORT/
348 searching for changes
348 searching for changes
349 6 a7892891da29: r2 name1
349 6 a7892891da29: r2 name1
350 7 2c8d5d5ec612: r3 name1
350 7 2c8d5d5ec612: r3 name1
351 8 e71dbbc70e03: r4 name1
351 8 e71dbbc70e03: r4 name1
352 $ hg outgoing $remote
352 $ hg outgoing $remote
353 comparing with http://localhost:$HGPORT/
353 comparing with http://localhost:$HGPORT/
354 searching for changes
354 searching for changes
355 2 70314b29987d: r5 name2
355 2 70314b29987d: r5 name2
356 3 6c6f5d5f3c11: r6 name2
356 3 6c6f5d5f3c11: r6 name2
357 4 b6b4d315a2ac: r7 name2
357 4 b6b4d315a2ac: r7 name2
358 5 d8f638ac69e9: r8 name2
358 5 d8f638ac69e9: r8 name2
359 $ hg push $remote --new-branch
359 $ hg push $remote --new-branch
360 pushing to http://localhost:$HGPORT/
360 pushing to http://localhost:$HGPORT/
361 searching for changes
361 searching for changes
362 remote: adding changesets
362 remote: adding changesets
363 remote: adding manifests
363 remote: adding manifests
364 remote: adding file changes
364 remote: adding file changes
365 remote: added 4 changesets with 8 changes to 2 files (+1 heads)
365 remote: added 4 changesets with 8 changes to 2 files (+1 heads)
366 $ hg pull $remote
366 $ hg pull $remote
367 pulling from http://localhost:$HGPORT/
367 pulling from http://localhost:$HGPORT/
368 searching for changes
368 searching for changes
369 adding changesets
369 adding changesets
370 adding manifests
370 adding manifests
371 adding file changes
371 adding file changes
372 added 3 changesets with 6 changes to 2 files (+1 heads)
372 added 3 changesets with 6 changes to 2 files (+1 heads)
373 new changesets a7892891da29:e71dbbc70e03
373 new changesets a7892891da29:e71dbbc70e03
374 (run 'hg heads' to see heads)
374 (run 'hg heads' to see heads)
375 $ hg incoming $remote
375 $ hg incoming $remote
376 comparing with http://localhost:$HGPORT/
376 comparing with http://localhost:$HGPORT/
377 searching for changes
377 searching for changes
378 no changes found
378 no changes found
379 [1]
379 [1]
380 $ hg outgoing $remote
380 $ hg outgoing $remote
381 comparing with http://localhost:$HGPORT/
381 comparing with http://localhost:$HGPORT/
382 searching for changes
382 searching for changes
383 no changes found
383 no changes found
384 [1]
384 [1]
385 $ cd ..
385 $ cd ..
386 $ tstop
386 $ tstop
387
387
388 $ tstart repo1b
388 $ tstart repo1b
389 $ cd repo2b
389 $ cd repo2b
390 $ hg incoming $remote
390 $ hg incoming $remote
391 comparing with http://localhost:$HGPORT/
391 comparing with http://localhost:$HGPORT/
392 searching for changes
392 searching for changes
393 6 a7892891da29: r2 name1
393 6 a7892891da29: r2 name1
394 7 2c8d5d5ec612: r3 name1
394 7 2c8d5d5ec612: r3 name1
395 8 e71dbbc70e03: r4 name1
395 8 e71dbbc70e03: r4 name1
396 $ hg outgoing $remote
396 $ hg outgoing $remote
397 comparing with http://localhost:$HGPORT/
397 comparing with http://localhost:$HGPORT/
398 searching for changes
398 searching for changes
399 2 70314b29987d: r5 name2
399 2 70314b29987d: r5 name2
400 3 6c6f5d5f3c11: r6 name2
400 3 6c6f5d5f3c11: r6 name2
401 4 b6b4d315a2ac: r7 name2
401 4 b6b4d315a2ac: r7 name2
402 5 d8f638ac69e9: r8 name2
402 5 d8f638ac69e9: r8 name2
403 $ hg pull $remote
403 $ hg pull $remote
404 pulling from http://localhost:$HGPORT/
404 pulling from http://localhost:$HGPORT/
405 searching for changes
405 searching for changes
406 adding changesets
406 adding changesets
407 adding manifests
407 adding manifests
408 adding file changes
408 adding file changes
409 added 3 changesets with 6 changes to 2 files (+1 heads)
409 added 3 changesets with 6 changes to 2 files (+1 heads)
410 new changesets a7892891da29:e71dbbc70e03
410 new changesets a7892891da29:e71dbbc70e03
411 (run 'hg heads' to see heads)
411 (run 'hg heads' to see heads)
412 $ hg push $remote --new-branch
412 $ hg push $remote --new-branch
413 pushing to http://localhost:$HGPORT/
413 pushing to http://localhost:$HGPORT/
414 searching for changes
414 searching for changes
415 remote: adding changesets
415 remote: adding changesets
416 remote: adding manifests
416 remote: adding manifests
417 remote: adding file changes
417 remote: adding file changes
418 remote: added 4 changesets with 8 changes to 2 files (+1 heads)
418 remote: added 4 changesets with 8 changes to 2 files (+1 heads)
419 $ hg incoming $remote
419 $ hg incoming $remote
420 comparing with http://localhost:$HGPORT/
420 comparing with http://localhost:$HGPORT/
421 searching for changes
421 searching for changes
422 no changes found
422 no changes found
423 [1]
423 [1]
424 $ hg outgoing $remote
424 $ hg outgoing $remote
425 comparing with http://localhost:$HGPORT/
425 comparing with http://localhost:$HGPORT/
426 searching for changes
426 searching for changes
427 no changes found
427 no changes found
428 [1]
428 [1]
429 $ cd ..
429 $ cd ..
430 $ tstop
430 $ tstop
431
431
432 Both have new stuff in existing named branches:
432 Both have new stuff in existing named branches:
433
433
434 $ rm -r repo1a repo1b repo2a repo2b
434 $ rm -r repo1a repo1b repo2a repo2b
435 $ hg clone main repo1a --rev 3 --rev 8 -q
435 $ hg clone main repo1a --rev 3 --rev 8 -q
436 $ hg clone repo1a repo1b -q
436 $ hg clone repo1a repo1b -q
437 $ hg clone main repo2a --rev 4 --rev 7 -q
437 $ hg clone main repo2a --rev 4 --rev 7 -q
438 $ hg clone repo2a repo2b -q
438 $ hg clone repo2a repo2b -q
439 $ tstart repo1a
439 $ tstart repo1a
440
440
441 $ cd repo2a
441 $ cd repo2a
442 $ hg incoming $remote
442 $ hg incoming $remote
443 comparing with http://localhost:$HGPORT/
443 comparing with http://localhost:$HGPORT/
444 searching for changes
444 searching for changes
445 8 d8f638ac69e9: r8 name2
445 8 d8f638ac69e9: r8 name2
446 $ hg outgoing $remote
446 $ hg outgoing $remote
447 comparing with http://localhost:$HGPORT/
447 comparing with http://localhost:$HGPORT/
448 searching for changes
448 searching for changes
449 4 e71dbbc70e03: r4 name1
449 4 e71dbbc70e03: r4 name1
450 $ hg push $remote --new-branch
450 $ hg push $remote --new-branch
451 pushing to http://localhost:$HGPORT/
451 pushing to http://localhost:$HGPORT/
452 searching for changes
452 searching for changes
453 remote: adding changesets
453 remote: adding changesets
454 remote: adding manifests
454 remote: adding manifests
455 remote: adding file changes
455 remote: adding file changes
456 remote: added 1 changesets with 2 changes to 2 files
456 remote: added 1 changesets with 2 changes to 2 files
457 $ hg pull $remote
457 $ hg pull $remote
458 pulling from http://localhost:$HGPORT/
458 pulling from http://localhost:$HGPORT/
459 searching for changes
459 searching for changes
460 adding changesets
460 adding changesets
461 adding manifests
461 adding manifests
462 adding file changes
462 adding file changes
463 added 1 changesets with 2 changes to 2 files
463 added 1 changesets with 2 changes to 2 files
464 new changesets d8f638ac69e9
464 new changesets d8f638ac69e9
465 (run 'hg update' to get a working copy)
465 (run 'hg update' to get a working copy)
466 $ hg incoming $remote
466 $ hg incoming $remote
467 comparing with http://localhost:$HGPORT/
467 comparing with http://localhost:$HGPORT/
468 searching for changes
468 searching for changes
469 no changes found
469 no changes found
470 [1]
470 [1]
471 $ hg outgoing $remote
471 $ hg outgoing $remote
472 comparing with http://localhost:$HGPORT/
472 comparing with http://localhost:$HGPORT/
473 searching for changes
473 searching for changes
474 no changes found
474 no changes found
475 [1]
475 [1]
476 $ cd ..
476 $ cd ..
477 $ tstop
477 $ tstop
478
478
479 $ tstart repo1b
479 $ tstart repo1b
480 $ cd repo2b
480 $ cd repo2b
481 $ hg incoming $remote
481 $ hg incoming $remote
482 comparing with http://localhost:$HGPORT/
482 comparing with http://localhost:$HGPORT/
483 searching for changes
483 searching for changes
484 8 d8f638ac69e9: r8 name2
484 8 d8f638ac69e9: r8 name2
485 $ hg outgoing $remote
485 $ hg outgoing $remote
486 comparing with http://localhost:$HGPORT/
486 comparing with http://localhost:$HGPORT/
487 searching for changes
487 searching for changes
488 4 e71dbbc70e03: r4 name1
488 4 e71dbbc70e03: r4 name1
489 $ hg pull $remote
489 $ hg pull $remote
490 pulling from http://localhost:$HGPORT/
490 pulling from http://localhost:$HGPORT/
491 searching for changes
491 searching for changes
492 adding changesets
492 adding changesets
493 adding manifests
493 adding manifests
494 adding file changes
494 adding file changes
495 added 1 changesets with 2 changes to 2 files
495 added 1 changesets with 2 changes to 2 files
496 new changesets d8f638ac69e9
496 new changesets d8f638ac69e9
497 (run 'hg update' to get a working copy)
497 (run 'hg update' to get a working copy)
498 $ hg push $remote --new-branch
498 $ hg push $remote --new-branch
499 pushing to http://localhost:$HGPORT/
499 pushing to http://localhost:$HGPORT/
500 searching for changes
500 searching for changes
501 remote: adding changesets
501 remote: adding changesets
502 remote: adding manifests
502 remote: adding manifests
503 remote: adding file changes
503 remote: adding file changes
504 remote: added 1 changesets with 2 changes to 2 files
504 remote: added 1 changesets with 2 changes to 2 files
505 $ hg incoming $remote
505 $ hg incoming $remote
506 comparing with http://localhost:$HGPORT/
506 comparing with http://localhost:$HGPORT/
507 searching for changes
507 searching for changes
508 no changes found
508 no changes found
509 [1]
509 [1]
510 $ hg outgoing $remote
510 $ hg outgoing $remote
511 comparing with http://localhost:$HGPORT/
511 comparing with http://localhost:$HGPORT/
512 searching for changes
512 searching for changes
513 no changes found
513 no changes found
514 [1]
514 [1]
515 $ cd ..
515 $ cd ..
516 #if zstd
516 #if zstd
517 $ tstop show
517 $ tstop show
518 "GET /?cmd=capabilities HTTP/1.1" 200 -
518 "GET /?cmd=capabilities HTTP/1.1" 200 -
519 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
519 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
520 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
520 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
521 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
521 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
522 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
522 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
523 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
523 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
524 "GET /?cmd=capabilities HTTP/1.1" 200 -
524 "GET /?cmd=capabilities HTTP/1.1" 200 -
525 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
525 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
526 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
526 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
527 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
527 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
528 "GET /?cmd=capabilities HTTP/1.1" 200 -
528 "GET /?cmd=capabilities HTTP/1.1" 200 -
529 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
529 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
530 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
530 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
531 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
531 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
532 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
532 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
533 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961+2c8d5d5ec612be65cdfdeac78b7662ab1696324a x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
533 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961+2c8d5d5ec612be65cdfdeac78b7662ab1696324a x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
534 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
534 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
535 "GET /?cmd=capabilities HTTP/1.1" 200 -
535 "GET /?cmd=capabilities HTTP/1.1" 200 -
536 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
536 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
537 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
537 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
538 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
538 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
539 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
539 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
540 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
541 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
540 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
542 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91* (glob)
541 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91* (glob)
543 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
542 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
544 "GET /?cmd=capabilities HTTP/1.1" 200 -
543 "GET /?cmd=capabilities HTTP/1.1" 200 -
545 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
544 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
546 "GET /?cmd=capabilities HTTP/1.1" 200 -
545 "GET /?cmd=capabilities HTTP/1.1" 200 -
547 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
546 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
548 #else
547 #else
549 $ tstop show
548 $ tstop show
550 "GET /?cmd=capabilities HTTP/1.1" 200 -
549 "GET /?cmd=capabilities HTTP/1.1" 200 -
551 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
550 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
552 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
551 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
553 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
552 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
554 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
553 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
555 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
554 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
556 "GET /?cmd=capabilities HTTP/1.1" 200 -
555 "GET /?cmd=capabilities HTTP/1.1" 200 -
557 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
556 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
558 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
557 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
559 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
558 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
560 "GET /?cmd=capabilities HTTP/1.1" 200 -
559 "GET /?cmd=capabilities HTTP/1.1" 200 -
561 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
560 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
562 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
561 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
563 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
562 "GET /?cmd=branches HTTP/1.1" 200 - x-hgarg-1:nodes=d8f638ac69e9ae8dea4f09f11d696546a912d961 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
564 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
563 "GET /?cmd=between HTTP/1.1" 200 - x-hgarg-1:pairs=d8f638ac69e9ae8dea4f09f11d696546a912d961-d57206cc072a18317c1e381fb60aa31bd3401785 x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
565 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961+2c8d5d5ec612be65cdfdeac78b7662ab1696324a x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
564 "GET /?cmd=changegroupsubset HTTP/1.1" 200 - x-hgarg-1:bases=d8f638ac69e9ae8dea4f09f11d696546a912d961&heads=d8f638ac69e9ae8dea4f09f11d696546a912d961+2c8d5d5ec612be65cdfdeac78b7662ab1696324a x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
566 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
565 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
567 "GET /?cmd=capabilities HTTP/1.1" 200 -
566 "GET /?cmd=capabilities HTTP/1.1" 200 -
568 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
567 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
569 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
568 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
570 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
569 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
571 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
570 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
572 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
571 "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
573 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
572 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
574 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91* (glob)
573 "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91* (glob)
575 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
574 "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
576 "GET /?cmd=capabilities HTTP/1.1" 200 -
575 "GET /?cmd=capabilities HTTP/1.1" 200 -
577 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
576 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
578 "GET /?cmd=capabilities HTTP/1.1" 200 -
577 "GET /?cmd=capabilities HTTP/1.1" 200 -
579 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
578 "GET /?cmd=heads HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
580 #endif
579 #endif
General Comments 0
You need to be logged in to leave comments. Login now