##// END OF EJS Templates
spelling: transferred
timeless@mozdev.org -
r17525:e327fd6e default
parent child Browse files
Show More
@@ -1,619 +1,619 b''
1 # wireproto.py - generic wire protocol support functions
1 # wireproto.py - generic wire protocol support functions
2 #
2 #
3 # Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-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 import urllib, tempfile, os, sys
8 import urllib, tempfile, os, sys
9 from i18n import _
9 from i18n import _
10 from node import bin, hex
10 from node import bin, hex
11 import changegroup as changegroupmod
11 import changegroup as changegroupmod
12 import peer, error, encoding, util, store
12 import peer, error, encoding, util, store
13 import discovery, phases
13 import discovery, phases
14
14
15 # abstract batching support
15 # abstract batching support
16
16
17 class future(object):
17 class future(object):
18 '''placeholder for a value to be set later'''
18 '''placeholder for a value to be set later'''
19 def set(self, value):
19 def set(self, value):
20 if util.safehasattr(self, 'value'):
20 if util.safehasattr(self, 'value'):
21 raise error.RepoError("future is already set")
21 raise error.RepoError("future is already set")
22 self.value = value
22 self.value = value
23
23
24 class batcher(object):
24 class batcher(object):
25 '''base class for batches of commands submittable in a single request
25 '''base class for batches of commands submittable in a single request
26
26
27 All methods invoked on instances of this class are simply queued and
27 All methods invoked on instances of this class are simply queued and
28 return a a future for the result. Once you call submit(), all the queued
28 return a a future for the result. Once you call submit(), all the queued
29 calls are performed and the results set in their respective futures.
29 calls are performed and the results set in their respective futures.
30 '''
30 '''
31 def __init__(self):
31 def __init__(self):
32 self.calls = []
32 self.calls = []
33 def __getattr__(self, name):
33 def __getattr__(self, name):
34 def call(*args, **opts):
34 def call(*args, **opts):
35 resref = future()
35 resref = future()
36 self.calls.append((name, args, opts, resref,))
36 self.calls.append((name, args, opts, resref,))
37 return resref
37 return resref
38 return call
38 return call
39 def submit(self):
39 def submit(self):
40 pass
40 pass
41
41
42 class localbatch(batcher):
42 class localbatch(batcher):
43 '''performs the queued calls directly'''
43 '''performs the queued calls directly'''
44 def __init__(self, local):
44 def __init__(self, local):
45 batcher.__init__(self)
45 batcher.__init__(self)
46 self.local = local
46 self.local = local
47 def submit(self):
47 def submit(self):
48 for name, args, opts, resref in self.calls:
48 for name, args, opts, resref in self.calls:
49 resref.set(getattr(self.local, name)(*args, **opts))
49 resref.set(getattr(self.local, name)(*args, **opts))
50
50
51 class remotebatch(batcher):
51 class remotebatch(batcher):
52 '''batches the queued calls; uses as few roundtrips as possible'''
52 '''batches the queued calls; uses as few roundtrips as possible'''
53 def __init__(self, remote):
53 def __init__(self, remote):
54 '''remote must support _submitbatch(encbatch) and
54 '''remote must support _submitbatch(encbatch) and
55 _submitone(op, encargs)'''
55 _submitone(op, encargs)'''
56 batcher.__init__(self)
56 batcher.__init__(self)
57 self.remote = remote
57 self.remote = remote
58 def submit(self):
58 def submit(self):
59 req, rsp = [], []
59 req, rsp = [], []
60 for name, args, opts, resref in self.calls:
60 for name, args, opts, resref in self.calls:
61 mtd = getattr(self.remote, name)
61 mtd = getattr(self.remote, name)
62 batchablefn = getattr(mtd, 'batchable', None)
62 batchablefn = getattr(mtd, 'batchable', None)
63 if batchablefn is not None:
63 if batchablefn is not None:
64 batchable = batchablefn(mtd.im_self, *args, **opts)
64 batchable = batchablefn(mtd.im_self, *args, **opts)
65 encargsorres, encresref = batchable.next()
65 encargsorres, encresref = batchable.next()
66 if encresref:
66 if encresref:
67 req.append((name, encargsorres,))
67 req.append((name, encargsorres,))
68 rsp.append((batchable, encresref, resref,))
68 rsp.append((batchable, encresref, resref,))
69 else:
69 else:
70 resref.set(encargsorres)
70 resref.set(encargsorres)
71 else:
71 else:
72 if req:
72 if req:
73 self._submitreq(req, rsp)
73 self._submitreq(req, rsp)
74 req, rsp = [], []
74 req, rsp = [], []
75 resref.set(mtd(*args, **opts))
75 resref.set(mtd(*args, **opts))
76 if req:
76 if req:
77 self._submitreq(req, rsp)
77 self._submitreq(req, rsp)
78 def _submitreq(self, req, rsp):
78 def _submitreq(self, req, rsp):
79 encresults = self.remote._submitbatch(req)
79 encresults = self.remote._submitbatch(req)
80 for encres, r in zip(encresults, rsp):
80 for encres, r in zip(encresults, rsp):
81 batchable, encresref, resref = r
81 batchable, encresref, resref = r
82 encresref.set(encres)
82 encresref.set(encres)
83 resref.set(batchable.next())
83 resref.set(batchable.next())
84
84
85 def batchable(f):
85 def batchable(f):
86 '''annotation for batchable methods
86 '''annotation for batchable methods
87
87
88 Such methods must implement a coroutine as follows:
88 Such methods must implement a coroutine as follows:
89
89
90 @batchable
90 @batchable
91 def sample(self, one, two=None):
91 def sample(self, one, two=None):
92 # Handle locally computable results first:
92 # Handle locally computable results first:
93 if not one:
93 if not one:
94 yield "a local result", None
94 yield "a local result", None
95 # Build list of encoded arguments suitable for your wire protocol:
95 # Build list of encoded arguments suitable for your wire protocol:
96 encargs = [('one', encode(one),), ('two', encode(two),)]
96 encargs = [('one', encode(one),), ('two', encode(two),)]
97 # Create future for injection of encoded result:
97 # Create future for injection of encoded result:
98 encresref = future()
98 encresref = future()
99 # Return encoded arguments and future:
99 # Return encoded arguments and future:
100 yield encargs, encresref
100 yield encargs, encresref
101 # Assuming the future to be filled with the result from the batched
101 # Assuming the future to be filled with the result from the batched
102 # request now. Decode it:
102 # request now. Decode it:
103 yield decode(encresref.value)
103 yield decode(encresref.value)
104
104
105 The decorator returns a function which wraps this coroutine as a plain
105 The decorator returns a function which wraps this coroutine as a plain
106 method, but adds the original method as an attribute called "batchable",
106 method, but adds the original method as an attribute called "batchable",
107 which is used by remotebatch to split the call into separate encoding and
107 which is used by remotebatch to split the call into separate encoding and
108 decoding phases.
108 decoding phases.
109 '''
109 '''
110 def plain(*args, **opts):
110 def plain(*args, **opts):
111 batchable = f(*args, **opts)
111 batchable = f(*args, **opts)
112 encargsorres, encresref = batchable.next()
112 encargsorres, encresref = batchable.next()
113 if not encresref:
113 if not encresref:
114 return encargsorres # a local result in this case
114 return encargsorres # a local result in this case
115 self = args[0]
115 self = args[0]
116 encresref.set(self._submitone(f.func_name, encargsorres))
116 encresref.set(self._submitone(f.func_name, encargsorres))
117 return batchable.next()
117 return batchable.next()
118 setattr(plain, 'batchable', f)
118 setattr(plain, 'batchable', f)
119 return plain
119 return plain
120
120
121 # list of nodes encoding / decoding
121 # list of nodes encoding / decoding
122
122
123 def decodelist(l, sep=' '):
123 def decodelist(l, sep=' '):
124 if l:
124 if l:
125 return map(bin, l.split(sep))
125 return map(bin, l.split(sep))
126 return []
126 return []
127
127
128 def encodelist(l, sep=' '):
128 def encodelist(l, sep=' '):
129 return sep.join(map(hex, l))
129 return sep.join(map(hex, l))
130
130
131 # batched call argument encoding
131 # batched call argument encoding
132
132
133 def escapearg(plain):
133 def escapearg(plain):
134 return (plain
134 return (plain
135 .replace(':', '::')
135 .replace(':', '::')
136 .replace(',', ':,')
136 .replace(',', ':,')
137 .replace(';', ':;')
137 .replace(';', ':;')
138 .replace('=', ':='))
138 .replace('=', ':='))
139
139
140 def unescapearg(escaped):
140 def unescapearg(escaped):
141 return (escaped
141 return (escaped
142 .replace(':=', '=')
142 .replace(':=', '=')
143 .replace(':;', ';')
143 .replace(':;', ';')
144 .replace(':,', ',')
144 .replace(':,', ',')
145 .replace('::', ':'))
145 .replace('::', ':'))
146
146
147 # client side
147 # client side
148
148
149 def todict(**args):
149 def todict(**args):
150 return args
150 return args
151
151
152 class wirepeer(peer.peerrepository):
152 class wirepeer(peer.peerrepository):
153
153
154 def batch(self):
154 def batch(self):
155 return remotebatch(self)
155 return remotebatch(self)
156 def _submitbatch(self, req):
156 def _submitbatch(self, req):
157 cmds = []
157 cmds = []
158 for op, argsdict in req:
158 for op, argsdict in req:
159 args = ','.join('%s=%s' % p for p in argsdict.iteritems())
159 args = ','.join('%s=%s' % p for p in argsdict.iteritems())
160 cmds.append('%s %s' % (op, args))
160 cmds.append('%s %s' % (op, args))
161 rsp = self._call("batch", cmds=';'.join(cmds))
161 rsp = self._call("batch", cmds=';'.join(cmds))
162 return rsp.split(';')
162 return rsp.split(';')
163 def _submitone(self, op, args):
163 def _submitone(self, op, args):
164 return self._call(op, **args)
164 return self._call(op, **args)
165
165
166 @batchable
166 @batchable
167 def lookup(self, key):
167 def lookup(self, key):
168 self.requirecap('lookup', _('look up remote revision'))
168 self.requirecap('lookup', _('look up remote revision'))
169 f = future()
169 f = future()
170 yield todict(key=encoding.fromlocal(key)), f
170 yield todict(key=encoding.fromlocal(key)), f
171 d = f.value
171 d = f.value
172 success, data = d[:-1].split(" ", 1)
172 success, data = d[:-1].split(" ", 1)
173 if int(success):
173 if int(success):
174 yield bin(data)
174 yield bin(data)
175 self._abort(error.RepoError(data))
175 self._abort(error.RepoError(data))
176
176
177 @batchable
177 @batchable
178 def heads(self):
178 def heads(self):
179 f = future()
179 f = future()
180 yield {}, f
180 yield {}, f
181 d = f.value
181 d = f.value
182 try:
182 try:
183 yield decodelist(d[:-1])
183 yield decodelist(d[:-1])
184 except ValueError:
184 except ValueError:
185 self._abort(error.ResponseError(_("unexpected response:"), d))
185 self._abort(error.ResponseError(_("unexpected response:"), d))
186
186
187 @batchable
187 @batchable
188 def known(self, nodes):
188 def known(self, nodes):
189 f = future()
189 f = future()
190 yield todict(nodes=encodelist(nodes)), f
190 yield todict(nodes=encodelist(nodes)), f
191 d = f.value
191 d = f.value
192 try:
192 try:
193 yield [bool(int(f)) for f in d]
193 yield [bool(int(f)) for f in d]
194 except ValueError:
194 except ValueError:
195 self._abort(error.ResponseError(_("unexpected response:"), d))
195 self._abort(error.ResponseError(_("unexpected response:"), d))
196
196
197 @batchable
197 @batchable
198 def branchmap(self):
198 def branchmap(self):
199 f = future()
199 f = future()
200 yield {}, f
200 yield {}, f
201 d = f.value
201 d = f.value
202 try:
202 try:
203 branchmap = {}
203 branchmap = {}
204 for branchpart in d.splitlines():
204 for branchpart in d.splitlines():
205 branchname, branchheads = branchpart.split(' ', 1)
205 branchname, branchheads = branchpart.split(' ', 1)
206 branchname = encoding.tolocal(urllib.unquote(branchname))
206 branchname = encoding.tolocal(urllib.unquote(branchname))
207 branchheads = decodelist(branchheads)
207 branchheads = decodelist(branchheads)
208 branchmap[branchname] = branchheads
208 branchmap[branchname] = branchheads
209 yield branchmap
209 yield branchmap
210 except TypeError:
210 except TypeError:
211 self._abort(error.ResponseError(_("unexpected response:"), d))
211 self._abort(error.ResponseError(_("unexpected response:"), d))
212
212
213 def branches(self, nodes):
213 def branches(self, nodes):
214 n = encodelist(nodes)
214 n = encodelist(nodes)
215 d = self._call("branches", nodes=n)
215 d = self._call("branches", nodes=n)
216 try:
216 try:
217 br = [tuple(decodelist(b)) for b in d.splitlines()]
217 br = [tuple(decodelist(b)) for b in d.splitlines()]
218 return br
218 return br
219 except ValueError:
219 except ValueError:
220 self._abort(error.ResponseError(_("unexpected response:"), d))
220 self._abort(error.ResponseError(_("unexpected response:"), d))
221
221
222 def between(self, pairs):
222 def between(self, pairs):
223 batch = 8 # avoid giant requests
223 batch = 8 # avoid giant requests
224 r = []
224 r = []
225 for i in xrange(0, len(pairs), batch):
225 for i in xrange(0, len(pairs), batch):
226 n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]])
226 n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]])
227 d = self._call("between", pairs=n)
227 d = self._call("between", pairs=n)
228 try:
228 try:
229 r.extend(l and decodelist(l) or [] for l in d.splitlines())
229 r.extend(l and decodelist(l) or [] for l in d.splitlines())
230 except ValueError:
230 except ValueError:
231 self._abort(error.ResponseError(_("unexpected response:"), d))
231 self._abort(error.ResponseError(_("unexpected response:"), d))
232 return r
232 return r
233
233
234 @batchable
234 @batchable
235 def pushkey(self, namespace, key, old, new):
235 def pushkey(self, namespace, key, old, new):
236 if not self.capable('pushkey'):
236 if not self.capable('pushkey'):
237 yield False, None
237 yield False, None
238 f = future()
238 f = future()
239 self.ui.debug('preparing pushkey for "%s:%s"\n' % (namespace, key))
239 self.ui.debug('preparing pushkey for "%s:%s"\n' % (namespace, key))
240 yield todict(namespace=encoding.fromlocal(namespace),
240 yield todict(namespace=encoding.fromlocal(namespace),
241 key=encoding.fromlocal(key),
241 key=encoding.fromlocal(key),
242 old=encoding.fromlocal(old),
242 old=encoding.fromlocal(old),
243 new=encoding.fromlocal(new)), f
243 new=encoding.fromlocal(new)), f
244 d = f.value
244 d = f.value
245 d, output = d.split('\n', 1)
245 d, output = d.split('\n', 1)
246 try:
246 try:
247 d = bool(int(d))
247 d = bool(int(d))
248 except ValueError:
248 except ValueError:
249 raise error.ResponseError(
249 raise error.ResponseError(
250 _('push failed (unexpected response):'), d)
250 _('push failed (unexpected response):'), d)
251 for l in output.splitlines(True):
251 for l in output.splitlines(True):
252 self.ui.status(_('remote: '), l)
252 self.ui.status(_('remote: '), l)
253 yield d
253 yield d
254
254
255 @batchable
255 @batchable
256 def listkeys(self, namespace):
256 def listkeys(self, namespace):
257 if not self.capable('pushkey'):
257 if not self.capable('pushkey'):
258 yield {}, None
258 yield {}, None
259 f = future()
259 f = future()
260 self.ui.debug('preparing listkeys for "%s"\n' % namespace)
260 self.ui.debug('preparing listkeys for "%s"\n' % namespace)
261 yield todict(namespace=encoding.fromlocal(namespace)), f
261 yield todict(namespace=encoding.fromlocal(namespace)), f
262 d = f.value
262 d = f.value
263 r = {}
263 r = {}
264 for l in d.splitlines():
264 for l in d.splitlines():
265 k, v = l.split('\t')
265 k, v = l.split('\t')
266 r[encoding.tolocal(k)] = encoding.tolocal(v)
266 r[encoding.tolocal(k)] = encoding.tolocal(v)
267 yield r
267 yield r
268
268
269 def stream_out(self):
269 def stream_out(self):
270 return self._callstream('stream_out')
270 return self._callstream('stream_out')
271
271
272 def changegroup(self, nodes, kind):
272 def changegroup(self, nodes, kind):
273 n = encodelist(nodes)
273 n = encodelist(nodes)
274 f = self._callstream("changegroup", roots=n)
274 f = self._callstream("changegroup", roots=n)
275 return changegroupmod.unbundle10(self._decompress(f), 'UN')
275 return changegroupmod.unbundle10(self._decompress(f), 'UN')
276
276
277 def changegroupsubset(self, bases, heads, kind):
277 def changegroupsubset(self, bases, heads, kind):
278 self.requirecap('changegroupsubset', _('look up remote changes'))
278 self.requirecap('changegroupsubset', _('look up remote changes'))
279 bases = encodelist(bases)
279 bases = encodelist(bases)
280 heads = encodelist(heads)
280 heads = encodelist(heads)
281 f = self._callstream("changegroupsubset",
281 f = self._callstream("changegroupsubset",
282 bases=bases, heads=heads)
282 bases=bases, heads=heads)
283 return changegroupmod.unbundle10(self._decompress(f), 'UN')
283 return changegroupmod.unbundle10(self._decompress(f), 'UN')
284
284
285 def getbundle(self, source, heads=None, common=None):
285 def getbundle(self, source, heads=None, common=None):
286 self.requirecap('getbundle', _('look up remote changes'))
286 self.requirecap('getbundle', _('look up remote changes'))
287 opts = {}
287 opts = {}
288 if heads is not None:
288 if heads is not None:
289 opts['heads'] = encodelist(heads)
289 opts['heads'] = encodelist(heads)
290 if common is not None:
290 if common is not None:
291 opts['common'] = encodelist(common)
291 opts['common'] = encodelist(common)
292 f = self._callstream("getbundle", **opts)
292 f = self._callstream("getbundle", **opts)
293 return changegroupmod.unbundle10(self._decompress(f), 'UN')
293 return changegroupmod.unbundle10(self._decompress(f), 'UN')
294
294
295 def unbundle(self, cg, heads, source):
295 def unbundle(self, cg, heads, source):
296 '''Send cg (a readable file-like object representing the
296 '''Send cg (a readable file-like object representing the
297 changegroup to push, typically a chunkbuffer object) to the
297 changegroup to push, typically a chunkbuffer object) to the
298 remote server as a bundle. Return an integer indicating the
298 remote server as a bundle. Return an integer indicating the
299 result of the push (see localrepository.addchangegroup()).'''
299 result of the push (see localrepository.addchangegroup()).'''
300
300
301 if heads != ['force'] and self.capable('unbundlehash'):
301 if heads != ['force'] and self.capable('unbundlehash'):
302 heads = encodelist(['hashed',
302 heads = encodelist(['hashed',
303 util.sha1(''.join(sorted(heads))).digest()])
303 util.sha1(''.join(sorted(heads))).digest()])
304 else:
304 else:
305 heads = encodelist(heads)
305 heads = encodelist(heads)
306
306
307 ret, output = self._callpush("unbundle", cg, heads=heads)
307 ret, output = self._callpush("unbundle", cg, heads=heads)
308 if ret == "":
308 if ret == "":
309 raise error.ResponseError(
309 raise error.ResponseError(
310 _('push failed:'), output)
310 _('push failed:'), output)
311 try:
311 try:
312 ret = int(ret)
312 ret = int(ret)
313 except ValueError:
313 except ValueError:
314 raise error.ResponseError(
314 raise error.ResponseError(
315 _('push failed (unexpected response):'), ret)
315 _('push failed (unexpected response):'), ret)
316
316
317 for l in output.splitlines(True):
317 for l in output.splitlines(True):
318 self.ui.status(_('remote: '), l)
318 self.ui.status(_('remote: '), l)
319 return ret
319 return ret
320
320
321 def debugwireargs(self, one, two, three=None, four=None, five=None):
321 def debugwireargs(self, one, two, three=None, four=None, five=None):
322 # don't pass optional arguments left at their default value
322 # don't pass optional arguments left at their default value
323 opts = {}
323 opts = {}
324 if three is not None:
324 if three is not None:
325 opts['three'] = three
325 opts['three'] = three
326 if four is not None:
326 if four is not None:
327 opts['four'] = four
327 opts['four'] = four
328 return self._call('debugwireargs', one=one, two=two, **opts)
328 return self._call('debugwireargs', one=one, two=two, **opts)
329
329
330 # server side
330 # server side
331
331
332 class streamres(object):
332 class streamres(object):
333 def __init__(self, gen):
333 def __init__(self, gen):
334 self.gen = gen
334 self.gen = gen
335
335
336 class pushres(object):
336 class pushres(object):
337 def __init__(self, res):
337 def __init__(self, res):
338 self.res = res
338 self.res = res
339
339
340 class pusherr(object):
340 class pusherr(object):
341 def __init__(self, res):
341 def __init__(self, res):
342 self.res = res
342 self.res = res
343
343
344 class ooberror(object):
344 class ooberror(object):
345 def __init__(self, message):
345 def __init__(self, message):
346 self.message = message
346 self.message = message
347
347
348 def dispatch(repo, proto, command):
348 def dispatch(repo, proto, command):
349 func, spec = commands[command]
349 func, spec = commands[command]
350 args = proto.getargs(spec)
350 args = proto.getargs(spec)
351 return func(repo, proto, *args)
351 return func(repo, proto, *args)
352
352
353 def options(cmd, keys, others):
353 def options(cmd, keys, others):
354 opts = {}
354 opts = {}
355 for k in keys:
355 for k in keys:
356 if k in others:
356 if k in others:
357 opts[k] = others[k]
357 opts[k] = others[k]
358 del others[k]
358 del others[k]
359 if others:
359 if others:
360 sys.stderr.write("abort: %s got unexpected arguments %s\n"
360 sys.stderr.write("abort: %s got unexpected arguments %s\n"
361 % (cmd, ",".join(others)))
361 % (cmd, ",".join(others)))
362 return opts
362 return opts
363
363
364 def batch(repo, proto, cmds, others):
364 def batch(repo, proto, cmds, others):
365 res = []
365 res = []
366 for pair in cmds.split(';'):
366 for pair in cmds.split(';'):
367 op, args = pair.split(' ', 1)
367 op, args = pair.split(' ', 1)
368 vals = {}
368 vals = {}
369 for a in args.split(','):
369 for a in args.split(','):
370 if a:
370 if a:
371 n, v = a.split('=')
371 n, v = a.split('=')
372 vals[n] = unescapearg(v)
372 vals[n] = unescapearg(v)
373 func, spec = commands[op]
373 func, spec = commands[op]
374 if spec:
374 if spec:
375 keys = spec.split()
375 keys = spec.split()
376 data = {}
376 data = {}
377 for k in keys:
377 for k in keys:
378 if k == '*':
378 if k == '*':
379 star = {}
379 star = {}
380 for key in vals.keys():
380 for key in vals.keys():
381 if key not in keys:
381 if key not in keys:
382 star[key] = vals[key]
382 star[key] = vals[key]
383 data['*'] = star
383 data['*'] = star
384 else:
384 else:
385 data[k] = vals[k]
385 data[k] = vals[k]
386 result = func(repo, proto, *[data[k] for k in keys])
386 result = func(repo, proto, *[data[k] for k in keys])
387 else:
387 else:
388 result = func(repo, proto)
388 result = func(repo, proto)
389 if isinstance(result, ooberror):
389 if isinstance(result, ooberror):
390 return result
390 return result
391 res.append(escapearg(result))
391 res.append(escapearg(result))
392 return ';'.join(res)
392 return ';'.join(res)
393
393
394 def between(repo, proto, pairs):
394 def between(repo, proto, pairs):
395 pairs = [decodelist(p, '-') for p in pairs.split(" ")]
395 pairs = [decodelist(p, '-') for p in pairs.split(" ")]
396 r = []
396 r = []
397 for b in repo.between(pairs):
397 for b in repo.between(pairs):
398 r.append(encodelist(b) + "\n")
398 r.append(encodelist(b) + "\n")
399 return "".join(r)
399 return "".join(r)
400
400
401 def branchmap(repo, proto):
401 def branchmap(repo, proto):
402 branchmap = discovery.visiblebranchmap(repo)
402 branchmap = discovery.visiblebranchmap(repo)
403 heads = []
403 heads = []
404 for branch, nodes in branchmap.iteritems():
404 for branch, nodes in branchmap.iteritems():
405 branchname = urllib.quote(encoding.fromlocal(branch))
405 branchname = urllib.quote(encoding.fromlocal(branch))
406 branchnodes = encodelist(nodes)
406 branchnodes = encodelist(nodes)
407 heads.append('%s %s' % (branchname, branchnodes))
407 heads.append('%s %s' % (branchname, branchnodes))
408 return '\n'.join(heads)
408 return '\n'.join(heads)
409
409
410 def branches(repo, proto, nodes):
410 def branches(repo, proto, nodes):
411 nodes = decodelist(nodes)
411 nodes = decodelist(nodes)
412 r = []
412 r = []
413 for b in repo.branches(nodes):
413 for b in repo.branches(nodes):
414 r.append(encodelist(b) + "\n")
414 r.append(encodelist(b) + "\n")
415 return "".join(r)
415 return "".join(r)
416
416
417 def capabilities(repo, proto):
417 def capabilities(repo, proto):
418 caps = ('lookup changegroupsubset branchmap pushkey known getbundle '
418 caps = ('lookup changegroupsubset branchmap pushkey known getbundle '
419 'unbundlehash batch').split()
419 'unbundlehash batch').split()
420 if _allowstream(repo.ui):
420 if _allowstream(repo.ui):
421 if repo.ui.configbool('server', 'preferuncompressed', False):
421 if repo.ui.configbool('server', 'preferuncompressed', False):
422 caps.append('stream-preferred')
422 caps.append('stream-preferred')
423 requiredformats = repo.requirements & repo.supportedformats
423 requiredformats = repo.requirements & repo.supportedformats
424 # if our local revlogs are just revlogv1, add 'stream' cap
424 # if our local revlogs are just revlogv1, add 'stream' cap
425 if not requiredformats - set(('revlogv1',)):
425 if not requiredformats - set(('revlogv1',)):
426 caps.append('stream')
426 caps.append('stream')
427 # otherwise, add 'streamreqs' detailing our local revlog format
427 # otherwise, add 'streamreqs' detailing our local revlog format
428 else:
428 else:
429 caps.append('streamreqs=%s' % ','.join(requiredformats))
429 caps.append('streamreqs=%s' % ','.join(requiredformats))
430 caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority))
430 caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority))
431 caps.append('httpheader=1024')
431 caps.append('httpheader=1024')
432 return ' '.join(caps)
432 return ' '.join(caps)
433
433
434 def changegroup(repo, proto, roots):
434 def changegroup(repo, proto, roots):
435 nodes = decodelist(roots)
435 nodes = decodelist(roots)
436 cg = repo.changegroup(nodes, 'serve')
436 cg = repo.changegroup(nodes, 'serve')
437 return streamres(proto.groupchunks(cg))
437 return streamres(proto.groupchunks(cg))
438
438
439 def changegroupsubset(repo, proto, bases, heads):
439 def changegroupsubset(repo, proto, bases, heads):
440 bases = decodelist(bases)
440 bases = decodelist(bases)
441 heads = decodelist(heads)
441 heads = decodelist(heads)
442 cg = repo.changegroupsubset(bases, heads, 'serve')
442 cg = repo.changegroupsubset(bases, heads, 'serve')
443 return streamres(proto.groupchunks(cg))
443 return streamres(proto.groupchunks(cg))
444
444
445 def debugwireargs(repo, proto, one, two, others):
445 def debugwireargs(repo, proto, one, two, others):
446 # only accept optional args from the known set
446 # only accept optional args from the known set
447 opts = options('debugwireargs', ['three', 'four'], others)
447 opts = options('debugwireargs', ['three', 'four'], others)
448 return repo.debugwireargs(one, two, **opts)
448 return repo.debugwireargs(one, two, **opts)
449
449
450 def getbundle(repo, proto, others):
450 def getbundle(repo, proto, others):
451 opts = options('getbundle', ['heads', 'common'], others)
451 opts = options('getbundle', ['heads', 'common'], others)
452 for k, v in opts.iteritems():
452 for k, v in opts.iteritems():
453 opts[k] = decodelist(v)
453 opts[k] = decodelist(v)
454 cg = repo.getbundle('serve', **opts)
454 cg = repo.getbundle('serve', **opts)
455 return streamres(proto.groupchunks(cg))
455 return streamres(proto.groupchunks(cg))
456
456
457 def heads(repo, proto):
457 def heads(repo, proto):
458 h = discovery.visibleheads(repo)
458 h = discovery.visibleheads(repo)
459 return encodelist(h) + "\n"
459 return encodelist(h) + "\n"
460
460
461 def hello(repo, proto):
461 def hello(repo, proto):
462 '''the hello command returns a set of lines describing various
462 '''the hello command returns a set of lines describing various
463 interesting things about the server, in an RFC822-like format.
463 interesting things about the server, in an RFC822-like format.
464 Currently the only one defined is "capabilities", which
464 Currently the only one defined is "capabilities", which
465 consists of a line in the form:
465 consists of a line in the form:
466
466
467 capabilities: space separated list of tokens
467 capabilities: space separated list of tokens
468 '''
468 '''
469 return "capabilities: %s\n" % (capabilities(repo, proto))
469 return "capabilities: %s\n" % (capabilities(repo, proto))
470
470
471 def listkeys(repo, proto, namespace):
471 def listkeys(repo, proto, namespace):
472 d = repo.listkeys(encoding.tolocal(namespace)).items()
472 d = repo.listkeys(encoding.tolocal(namespace)).items()
473 t = '\n'.join(['%s\t%s' % (encoding.fromlocal(k), encoding.fromlocal(v))
473 t = '\n'.join(['%s\t%s' % (encoding.fromlocal(k), encoding.fromlocal(v))
474 for k, v in d])
474 for k, v in d])
475 return t
475 return t
476
476
477 def lookup(repo, proto, key):
477 def lookup(repo, proto, key):
478 try:
478 try:
479 k = encoding.tolocal(key)
479 k = encoding.tolocal(key)
480 c = repo[k]
480 c = repo[k]
481 if c.phase() == phases.secret:
481 if c.phase() == phases.secret:
482 raise error.RepoLookupError(_("unknown revision '%s'") % k)
482 raise error.RepoLookupError(_("unknown revision '%s'") % k)
483 r = c.hex()
483 r = c.hex()
484 success = 1
484 success = 1
485 except Exception, inst:
485 except Exception, inst:
486 r = str(inst)
486 r = str(inst)
487 success = 0
487 success = 0
488 return "%s %s\n" % (success, r)
488 return "%s %s\n" % (success, r)
489
489
490 def known(repo, proto, nodes, others):
490 def known(repo, proto, nodes, others):
491 return ''.join(b and "1" or "0" for b in repo.known(decodelist(nodes)))
491 return ''.join(b and "1" or "0" for b in repo.known(decodelist(nodes)))
492
492
493 def pushkey(repo, proto, namespace, key, old, new):
493 def pushkey(repo, proto, namespace, key, old, new):
494 # compatibility with pre-1.8 clients which were accidentally
494 # compatibility with pre-1.8 clients which were accidentally
495 # sending raw binary nodes rather than utf-8-encoded hex
495 # sending raw binary nodes rather than utf-8-encoded hex
496 if len(new) == 20 and new.encode('string-escape') != new:
496 if len(new) == 20 and new.encode('string-escape') != new:
497 # looks like it could be a binary node
497 # looks like it could be a binary node
498 try:
498 try:
499 new.decode('utf-8')
499 new.decode('utf-8')
500 new = encoding.tolocal(new) # but cleanly decodes as UTF-8
500 new = encoding.tolocal(new) # but cleanly decodes as UTF-8
501 except UnicodeDecodeError:
501 except UnicodeDecodeError:
502 pass # binary, leave unmodified
502 pass # binary, leave unmodified
503 else:
503 else:
504 new = encoding.tolocal(new) # normal path
504 new = encoding.tolocal(new) # normal path
505
505
506 r = repo.pushkey(encoding.tolocal(namespace), encoding.tolocal(key),
506 r = repo.pushkey(encoding.tolocal(namespace), encoding.tolocal(key),
507 encoding.tolocal(old), new)
507 encoding.tolocal(old), new)
508 return '%s\n' % int(r)
508 return '%s\n' % int(r)
509
509
510 def _allowstream(ui):
510 def _allowstream(ui):
511 return ui.configbool('server', 'uncompressed', True, untrusted=True)
511 return ui.configbool('server', 'uncompressed', True, untrusted=True)
512
512
513 def stream(repo, proto):
513 def stream(repo, proto):
514 '''If the server supports streaming clone, it advertises the "stream"
514 '''If the server supports streaming clone, it advertises the "stream"
515 capability with a value representing the version and flags of the repo
515 capability with a value representing the version and flags of the repo
516 it is serving. Client checks to see if it understands the format.
516 it is serving. Client checks to see if it understands the format.
517
517
518 The format is simple: the server writes out a line with the amount
518 The format is simple: the server writes out a line with the amount
519 of files, then the total amount of bytes to be transfered (separated
519 of files, then the total amount of bytes to be transferred (separated
520 by a space). Then, for each file, the server first writes the filename
520 by a space). Then, for each file, the server first writes the filename
521 and filesize (separated by the null character), then the file contents.
521 and filesize (separated by the null character), then the file contents.
522 '''
522 '''
523
523
524 if not _allowstream(repo.ui):
524 if not _allowstream(repo.ui):
525 return '1\n'
525 return '1\n'
526
526
527 entries = []
527 entries = []
528 total_bytes = 0
528 total_bytes = 0
529 try:
529 try:
530 # get consistent snapshot of repo, lock during scan
530 # get consistent snapshot of repo, lock during scan
531 lock = repo.lock()
531 lock = repo.lock()
532 try:
532 try:
533 repo.ui.debug('scanning\n')
533 repo.ui.debug('scanning\n')
534 for name, ename, size in repo.store.walk():
534 for name, ename, size in repo.store.walk():
535 entries.append((name, size))
535 entries.append((name, size))
536 total_bytes += size
536 total_bytes += size
537 finally:
537 finally:
538 lock.release()
538 lock.release()
539 except error.LockError:
539 except error.LockError:
540 return '2\n' # error: 2
540 return '2\n' # error: 2
541
541
542 def streamer(repo, entries, total):
542 def streamer(repo, entries, total):
543 '''stream out all metadata files in repository.'''
543 '''stream out all metadata files in repository.'''
544 yield '0\n' # success
544 yield '0\n' # success
545 repo.ui.debug('%d files, %d bytes to transfer\n' %
545 repo.ui.debug('%d files, %d bytes to transfer\n' %
546 (len(entries), total_bytes))
546 (len(entries), total_bytes))
547 yield '%d %d\n' % (len(entries), total_bytes)
547 yield '%d %d\n' % (len(entries), total_bytes)
548 for name, size in entries:
548 for name, size in entries:
549 repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
549 repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
550 # partially encode name over the wire for backwards compat
550 # partially encode name over the wire for backwards compat
551 yield '%s\0%d\n' % (store.encodedir(name), size)
551 yield '%s\0%d\n' % (store.encodedir(name), size)
552 for chunk in util.filechunkiter(repo.sopener(name), limit=size):
552 for chunk in util.filechunkiter(repo.sopener(name), limit=size):
553 yield chunk
553 yield chunk
554
554
555 return streamres(streamer(repo, entries, total_bytes))
555 return streamres(streamer(repo, entries, total_bytes))
556
556
557 def unbundle(repo, proto, heads):
557 def unbundle(repo, proto, heads):
558 their_heads = decodelist(heads)
558 their_heads = decodelist(heads)
559
559
560 def check_heads():
560 def check_heads():
561 heads = discovery.visibleheads(repo)
561 heads = discovery.visibleheads(repo)
562 heads_hash = util.sha1(''.join(sorted(heads))).digest()
562 heads_hash = util.sha1(''.join(sorted(heads))).digest()
563 return (their_heads == ['force'] or their_heads == heads or
563 return (their_heads == ['force'] or their_heads == heads or
564 their_heads == ['hashed', heads_hash])
564 their_heads == ['hashed', heads_hash])
565
565
566 proto.redirect()
566 proto.redirect()
567
567
568 # fail early if possible
568 # fail early if possible
569 if not check_heads():
569 if not check_heads():
570 return pusherr('unsynced changes')
570 return pusherr('unsynced changes')
571
571
572 # write bundle data to temporary file because it can be big
572 # write bundle data to temporary file because it can be big
573 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
573 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
574 fp = os.fdopen(fd, 'wb+')
574 fp = os.fdopen(fd, 'wb+')
575 r = 0
575 r = 0
576 try:
576 try:
577 proto.getfile(fp)
577 proto.getfile(fp)
578 lock = repo.lock()
578 lock = repo.lock()
579 try:
579 try:
580 if not check_heads():
580 if not check_heads():
581 # someone else committed/pushed/unbundled while we
581 # someone else committed/pushed/unbundled while we
582 # were transferring data
582 # were transferring data
583 return pusherr('unsynced changes')
583 return pusherr('unsynced changes')
584
584
585 # push can proceed
585 # push can proceed
586 fp.seek(0)
586 fp.seek(0)
587 gen = changegroupmod.readbundle(fp, None)
587 gen = changegroupmod.readbundle(fp, None)
588
588
589 try:
589 try:
590 r = repo.addchangegroup(gen, 'serve', proto._client())
590 r = repo.addchangegroup(gen, 'serve', proto._client())
591 except util.Abort, inst:
591 except util.Abort, inst:
592 sys.stderr.write("abort: %s\n" % inst)
592 sys.stderr.write("abort: %s\n" % inst)
593 finally:
593 finally:
594 lock.release()
594 lock.release()
595 return pushres(r)
595 return pushres(r)
596
596
597 finally:
597 finally:
598 fp.close()
598 fp.close()
599 os.unlink(tempname)
599 os.unlink(tempname)
600
600
601 commands = {
601 commands = {
602 'batch': (batch, 'cmds *'),
602 'batch': (batch, 'cmds *'),
603 'between': (between, 'pairs'),
603 'between': (between, 'pairs'),
604 'branchmap': (branchmap, ''),
604 'branchmap': (branchmap, ''),
605 'branches': (branches, 'nodes'),
605 'branches': (branches, 'nodes'),
606 'capabilities': (capabilities, ''),
606 'capabilities': (capabilities, ''),
607 'changegroup': (changegroup, 'roots'),
607 'changegroup': (changegroup, 'roots'),
608 'changegroupsubset': (changegroupsubset, 'bases heads'),
608 'changegroupsubset': (changegroupsubset, 'bases heads'),
609 'debugwireargs': (debugwireargs, 'one two *'),
609 'debugwireargs': (debugwireargs, 'one two *'),
610 'getbundle': (getbundle, '*'),
610 'getbundle': (getbundle, '*'),
611 'heads': (heads, ''),
611 'heads': (heads, ''),
612 'hello': (hello, ''),
612 'hello': (hello, ''),
613 'known': (known, 'nodes *'),
613 'known': (known, 'nodes *'),
614 'listkeys': (listkeys, 'namespace'),
614 'listkeys': (listkeys, 'namespace'),
615 'lookup': (lookup, 'key'),
615 'lookup': (lookup, 'key'),
616 'pushkey': (pushkey, 'namespace key old new'),
616 'pushkey': (pushkey, 'namespace key old new'),
617 'stream_out': (stream, ''),
617 'stream_out': (stream, ''),
618 'unbundle': (unbundle, 'heads'),
618 'unbundle': (unbundle, 'heads'),
619 }
619 }
@@ -1,1065 +1,1065 b''
1 $ "$TESTDIR/hghave" serve || exit 80
1 $ "$TESTDIR/hghave" serve || exit 80
2
2
3 $ cat >> $HGRCPATH <<EOF
3 $ cat >> $HGRCPATH <<EOF
4 > [extensions]
4 > [extensions]
5 > graphlog=
5 > graphlog=
6 > EOF
6 > EOF
7 $ hgph() { hg log -G --template "{rev} {phase} {desc} - {node|short}\n" $*; }
7 $ hgph() { hg log -G --template "{rev} {phase} {desc} - {node|short}\n" $*; }
8
8
9 $ mkcommit() {
9 $ mkcommit() {
10 > echo "$1" > "$1"
10 > echo "$1" > "$1"
11 > hg add "$1"
11 > hg add "$1"
12 > message="$1"
12 > message="$1"
13 > shift
13 > shift
14 > hg ci -m "$message" $*
14 > hg ci -m "$message" $*
15 > }
15 > }
16
16
17 $ hg init alpha
17 $ hg init alpha
18 $ cd alpha
18 $ cd alpha
19 $ mkcommit a-A
19 $ mkcommit a-A
20 $ mkcommit a-B
20 $ mkcommit a-B
21 $ mkcommit a-C
21 $ mkcommit a-C
22 $ mkcommit a-D
22 $ mkcommit a-D
23 $ hgph
23 $ hgph
24 @ 3 draft a-D - b555f63b6063
24 @ 3 draft a-D - b555f63b6063
25 |
25 |
26 o 2 draft a-C - 54acac6f23ab
26 o 2 draft a-C - 54acac6f23ab
27 |
27 |
28 o 1 draft a-B - 548a3d25dbf0
28 o 1 draft a-B - 548a3d25dbf0
29 |
29 |
30 o 0 draft a-A - 054250a37db4
30 o 0 draft a-A - 054250a37db4
31
31
32
32
33 $ hg init ../beta
33 $ hg init ../beta
34 $ hg push -r 1 ../beta
34 $ hg push -r 1 ../beta
35 pushing to ../beta
35 pushing to ../beta
36 searching for changes
36 searching for changes
37 adding changesets
37 adding changesets
38 adding manifests
38 adding manifests
39 adding file changes
39 adding file changes
40 added 2 changesets with 2 changes to 2 files
40 added 2 changesets with 2 changes to 2 files
41 $ hgph
41 $ hgph
42 @ 3 draft a-D - b555f63b6063
42 @ 3 draft a-D - b555f63b6063
43 |
43 |
44 o 2 draft a-C - 54acac6f23ab
44 o 2 draft a-C - 54acac6f23ab
45 |
45 |
46 o 1 public a-B - 548a3d25dbf0
46 o 1 public a-B - 548a3d25dbf0
47 |
47 |
48 o 0 public a-A - 054250a37db4
48 o 0 public a-A - 054250a37db4
49
49
50
50
51 $ cd ../beta
51 $ cd ../beta
52 $ hgph
52 $ hgph
53 o 1 public a-B - 548a3d25dbf0
53 o 1 public a-B - 548a3d25dbf0
54 |
54 |
55 o 0 public a-A - 054250a37db4
55 o 0 public a-A - 054250a37db4
56
56
57 $ hg up -q
57 $ hg up -q
58 $ mkcommit b-A
58 $ mkcommit b-A
59 $ hgph
59 $ hgph
60 @ 2 draft b-A - f54f1bb90ff3
60 @ 2 draft b-A - f54f1bb90ff3
61 |
61 |
62 o 1 public a-B - 548a3d25dbf0
62 o 1 public a-B - 548a3d25dbf0
63 |
63 |
64 o 0 public a-A - 054250a37db4
64 o 0 public a-A - 054250a37db4
65
65
66 $ hg pull ../alpha
66 $ hg pull ../alpha
67 pulling from ../alpha
67 pulling from ../alpha
68 searching for changes
68 searching for changes
69 adding changesets
69 adding changesets
70 adding manifests
70 adding manifests
71 adding file changes
71 adding file changes
72 added 2 changesets with 2 changes to 2 files (+1 heads)
72 added 2 changesets with 2 changes to 2 files (+1 heads)
73 (run 'hg heads' to see heads, 'hg merge' to merge)
73 (run 'hg heads' to see heads, 'hg merge' to merge)
74 $ hgph
74 $ hgph
75 o 4 public a-D - b555f63b6063
75 o 4 public a-D - b555f63b6063
76 |
76 |
77 o 3 public a-C - 54acac6f23ab
77 o 3 public a-C - 54acac6f23ab
78 |
78 |
79 | @ 2 draft b-A - f54f1bb90ff3
79 | @ 2 draft b-A - f54f1bb90ff3
80 |/
80 |/
81 o 1 public a-B - 548a3d25dbf0
81 o 1 public a-B - 548a3d25dbf0
82 |
82 |
83 o 0 public a-A - 054250a37db4
83 o 0 public a-A - 054250a37db4
84
84
85
85
86 pull did not updated ../alpha state.
86 pull did not updated ../alpha state.
87 push from alpha to beta should update phase even if nothing is transfered
87 push from alpha to beta should update phase even if nothing is transferred
88
88
89 $ cd ../alpha
89 $ cd ../alpha
90 $ hgph # not updated by remote pull
90 $ hgph # not updated by remote pull
91 @ 3 draft a-D - b555f63b6063
91 @ 3 draft a-D - b555f63b6063
92 |
92 |
93 o 2 draft a-C - 54acac6f23ab
93 o 2 draft a-C - 54acac6f23ab
94 |
94 |
95 o 1 public a-B - 548a3d25dbf0
95 o 1 public a-B - 548a3d25dbf0
96 |
96 |
97 o 0 public a-A - 054250a37db4
97 o 0 public a-A - 054250a37db4
98
98
99 $ hg push ../beta
99 $ hg push ../beta
100 pushing to ../beta
100 pushing to ../beta
101 searching for changes
101 searching for changes
102 no changes found
102 no changes found
103 [1]
103 [1]
104 $ hgph
104 $ hgph
105 @ 3 public a-D - b555f63b6063
105 @ 3 public a-D - b555f63b6063
106 |
106 |
107 o 2 public a-C - 54acac6f23ab
107 o 2 public a-C - 54acac6f23ab
108 |
108 |
109 o 1 public a-B - 548a3d25dbf0
109 o 1 public a-B - 548a3d25dbf0
110 |
110 |
111 o 0 public a-A - 054250a37db4
111 o 0 public a-A - 054250a37db4
112
112
113
113
114 update must update phase of common changeset too
114 update must update phase of common changeset too
115
115
116 $ hg pull ../beta # getting b-A
116 $ hg pull ../beta # getting b-A
117 pulling from ../beta
117 pulling from ../beta
118 searching for changes
118 searching for changes
119 adding changesets
119 adding changesets
120 adding manifests
120 adding manifests
121 adding file changes
121 adding file changes
122 added 1 changesets with 1 changes to 1 files (+1 heads)
122 added 1 changesets with 1 changes to 1 files (+1 heads)
123 (run 'hg heads' to see heads, 'hg merge' to merge)
123 (run 'hg heads' to see heads, 'hg merge' to merge)
124
124
125 $ cd ../beta
125 $ cd ../beta
126 $ hgph # not updated by remote pull
126 $ hgph # not updated by remote pull
127 o 4 public a-D - b555f63b6063
127 o 4 public a-D - b555f63b6063
128 |
128 |
129 o 3 public a-C - 54acac6f23ab
129 o 3 public a-C - 54acac6f23ab
130 |
130 |
131 | @ 2 draft b-A - f54f1bb90ff3
131 | @ 2 draft b-A - f54f1bb90ff3
132 |/
132 |/
133 o 1 public a-B - 548a3d25dbf0
133 o 1 public a-B - 548a3d25dbf0
134 |
134 |
135 o 0 public a-A - 054250a37db4
135 o 0 public a-A - 054250a37db4
136
136
137 $ hg pull ../alpha
137 $ hg pull ../alpha
138 pulling from ../alpha
138 pulling from ../alpha
139 searching for changes
139 searching for changes
140 no changes found
140 no changes found
141 $ hgph
141 $ hgph
142 o 4 public a-D - b555f63b6063
142 o 4 public a-D - b555f63b6063
143 |
143 |
144 o 3 public a-C - 54acac6f23ab
144 o 3 public a-C - 54acac6f23ab
145 |
145 |
146 | @ 2 public b-A - f54f1bb90ff3
146 | @ 2 public b-A - f54f1bb90ff3
147 |/
147 |/
148 o 1 public a-B - 548a3d25dbf0
148 o 1 public a-B - 548a3d25dbf0
149 |
149 |
150 o 0 public a-A - 054250a37db4
150 o 0 public a-A - 054250a37db4
151
151
152
152
153 Publish configuration option
153 Publish configuration option
154 ----------------------------
154 ----------------------------
155
155
156 Pull
156 Pull
157 ````
157 ````
158
158
159 changegroup are added without phase movement
159 changegroup are added without phase movement
160
160
161 $ hg bundle -a ../base.bundle
161 $ hg bundle -a ../base.bundle
162 5 changesets found
162 5 changesets found
163 $ cd ..
163 $ cd ..
164 $ hg init mu
164 $ hg init mu
165 $ cd mu
165 $ cd mu
166 $ cat > .hg/hgrc << EOF
166 $ cat > .hg/hgrc << EOF
167 > [phases]
167 > [phases]
168 > publish=0
168 > publish=0
169 > EOF
169 > EOF
170 $ hg unbundle ../base.bundle
170 $ hg unbundle ../base.bundle
171 adding changesets
171 adding changesets
172 adding manifests
172 adding manifests
173 adding file changes
173 adding file changes
174 added 5 changesets with 5 changes to 5 files (+1 heads)
174 added 5 changesets with 5 changes to 5 files (+1 heads)
175 (run 'hg heads' to see heads, 'hg merge' to merge)
175 (run 'hg heads' to see heads, 'hg merge' to merge)
176 $ hgph
176 $ hgph
177 o 4 draft a-D - b555f63b6063
177 o 4 draft a-D - b555f63b6063
178 |
178 |
179 o 3 draft a-C - 54acac6f23ab
179 o 3 draft a-C - 54acac6f23ab
180 |
180 |
181 | o 2 draft b-A - f54f1bb90ff3
181 | o 2 draft b-A - f54f1bb90ff3
182 |/
182 |/
183 o 1 draft a-B - 548a3d25dbf0
183 o 1 draft a-B - 548a3d25dbf0
184 |
184 |
185 o 0 draft a-A - 054250a37db4
185 o 0 draft a-A - 054250a37db4
186
186
187 $ cd ..
187 $ cd ..
188
188
189 Pulling from publish=False to publish=False does not move boundary.
189 Pulling from publish=False to publish=False does not move boundary.
190
190
191 $ hg init nu
191 $ hg init nu
192 $ cd nu
192 $ cd nu
193 $ cat > .hg/hgrc << EOF
193 $ cat > .hg/hgrc << EOF
194 > [phases]
194 > [phases]
195 > publish=0
195 > publish=0
196 > EOF
196 > EOF
197 $ hg pull ../mu -r 54acac6f23ab
197 $ hg pull ../mu -r 54acac6f23ab
198 pulling from ../mu
198 pulling from ../mu
199 adding changesets
199 adding changesets
200 adding manifests
200 adding manifests
201 adding file changes
201 adding file changes
202 added 3 changesets with 3 changes to 3 files
202 added 3 changesets with 3 changes to 3 files
203 (run 'hg update' to get a working copy)
203 (run 'hg update' to get a working copy)
204 $ hgph
204 $ hgph
205 o 2 draft a-C - 54acac6f23ab
205 o 2 draft a-C - 54acac6f23ab
206 |
206 |
207 o 1 draft a-B - 548a3d25dbf0
207 o 1 draft a-B - 548a3d25dbf0
208 |
208 |
209 o 0 draft a-A - 054250a37db4
209 o 0 draft a-A - 054250a37db4
210
210
211
211
212 Even for common
212 Even for common
213
213
214 $ hg pull ../mu -r f54f1bb90ff3
214 $ hg pull ../mu -r f54f1bb90ff3
215 pulling from ../mu
215 pulling from ../mu
216 searching for changes
216 searching for changes
217 adding changesets
217 adding changesets
218 adding manifests
218 adding manifests
219 adding file changes
219 adding file changes
220 added 1 changesets with 1 changes to 1 files (+1 heads)
220 added 1 changesets with 1 changes to 1 files (+1 heads)
221 (run 'hg heads' to see heads, 'hg merge' to merge)
221 (run 'hg heads' to see heads, 'hg merge' to merge)
222 $ hgph
222 $ hgph
223 o 3 draft b-A - f54f1bb90ff3
223 o 3 draft b-A - f54f1bb90ff3
224 |
224 |
225 | o 2 draft a-C - 54acac6f23ab
225 | o 2 draft a-C - 54acac6f23ab
226 |/
226 |/
227 o 1 draft a-B - 548a3d25dbf0
227 o 1 draft a-B - 548a3d25dbf0
228 |
228 |
229 o 0 draft a-A - 054250a37db4
229 o 0 draft a-A - 054250a37db4
230
230
231
231
232
232
233 Pulling from Publish=True to Publish=False move boundary in common set.
233 Pulling from Publish=True to Publish=False move boundary in common set.
234 we are in nu
234 we are in nu
235
235
236 $ hg pull ../alpha -r b555f63b6063
236 $ hg pull ../alpha -r b555f63b6063
237 pulling from ../alpha
237 pulling from ../alpha
238 searching for changes
238 searching for changes
239 adding changesets
239 adding changesets
240 adding manifests
240 adding manifests
241 adding file changes
241 adding file changes
242 added 1 changesets with 1 changes to 1 files
242 added 1 changesets with 1 changes to 1 files
243 (run 'hg update' to get a working copy)
243 (run 'hg update' to get a working copy)
244 $ hgph # f54f1bb90ff3 stay draft, not ancestor of -r
244 $ hgph # f54f1bb90ff3 stay draft, not ancestor of -r
245 o 4 public a-D - b555f63b6063
245 o 4 public a-D - b555f63b6063
246 |
246 |
247 | o 3 draft b-A - f54f1bb90ff3
247 | o 3 draft b-A - f54f1bb90ff3
248 | |
248 | |
249 o | 2 public a-C - 54acac6f23ab
249 o | 2 public a-C - 54acac6f23ab
250 |/
250 |/
251 o 1 public a-B - 548a3d25dbf0
251 o 1 public a-B - 548a3d25dbf0
252 |
252 |
253 o 0 public a-A - 054250a37db4
253 o 0 public a-A - 054250a37db4
254
254
255
255
256 pulling from Publish=False to publish=False with some public
256 pulling from Publish=False to publish=False with some public
257
257
258 $ hg up -q f54f1bb90ff3
258 $ hg up -q f54f1bb90ff3
259 $ mkcommit n-A
259 $ mkcommit n-A
260 $ mkcommit n-B
260 $ mkcommit n-B
261 $ hgph
261 $ hgph
262 @ 6 draft n-B - 145e75495359
262 @ 6 draft n-B - 145e75495359
263 |
263 |
264 o 5 draft n-A - d6bcb4f74035
264 o 5 draft n-A - d6bcb4f74035
265 |
265 |
266 | o 4 public a-D - b555f63b6063
266 | o 4 public a-D - b555f63b6063
267 | |
267 | |
268 o | 3 draft b-A - f54f1bb90ff3
268 o | 3 draft b-A - f54f1bb90ff3
269 | |
269 | |
270 | o 2 public a-C - 54acac6f23ab
270 | o 2 public a-C - 54acac6f23ab
271 |/
271 |/
272 o 1 public a-B - 548a3d25dbf0
272 o 1 public a-B - 548a3d25dbf0
273 |
273 |
274 o 0 public a-A - 054250a37db4
274 o 0 public a-A - 054250a37db4
275
275
276 $ cd ../mu
276 $ cd ../mu
277 $ hg pull ../nu
277 $ hg pull ../nu
278 pulling from ../nu
278 pulling from ../nu
279 searching for changes
279 searching for changes
280 adding changesets
280 adding changesets
281 adding manifests
281 adding manifests
282 adding file changes
282 adding file changes
283 added 2 changesets with 2 changes to 2 files
283 added 2 changesets with 2 changes to 2 files
284 (run 'hg update' to get a working copy)
284 (run 'hg update' to get a working copy)
285 $ hgph
285 $ hgph
286 o 6 draft n-B - 145e75495359
286 o 6 draft n-B - 145e75495359
287 |
287 |
288 o 5 draft n-A - d6bcb4f74035
288 o 5 draft n-A - d6bcb4f74035
289 |
289 |
290 | o 4 public a-D - b555f63b6063
290 | o 4 public a-D - b555f63b6063
291 | |
291 | |
292 | o 3 public a-C - 54acac6f23ab
292 | o 3 public a-C - 54acac6f23ab
293 | |
293 | |
294 o | 2 draft b-A - f54f1bb90ff3
294 o | 2 draft b-A - f54f1bb90ff3
295 |/
295 |/
296 o 1 public a-B - 548a3d25dbf0
296 o 1 public a-B - 548a3d25dbf0
297 |
297 |
298 o 0 public a-A - 054250a37db4
298 o 0 public a-A - 054250a37db4
299
299
300 $ cd ..
300 $ cd ..
301
301
302 pulling into publish=True
302 pulling into publish=True
303
303
304 $ cd alpha
304 $ cd alpha
305 $ hgph
305 $ hgph
306 o 4 public b-A - f54f1bb90ff3
306 o 4 public b-A - f54f1bb90ff3
307 |
307 |
308 | @ 3 public a-D - b555f63b6063
308 | @ 3 public a-D - b555f63b6063
309 | |
309 | |
310 | o 2 public a-C - 54acac6f23ab
310 | o 2 public a-C - 54acac6f23ab
311 |/
311 |/
312 o 1 public a-B - 548a3d25dbf0
312 o 1 public a-B - 548a3d25dbf0
313 |
313 |
314 o 0 public a-A - 054250a37db4
314 o 0 public a-A - 054250a37db4
315
315
316 $ hg pull ../mu
316 $ hg pull ../mu
317 pulling from ../mu
317 pulling from ../mu
318 searching for changes
318 searching for changes
319 adding changesets
319 adding changesets
320 adding manifests
320 adding manifests
321 adding file changes
321 adding file changes
322 added 2 changesets with 2 changes to 2 files
322 added 2 changesets with 2 changes to 2 files
323 (run 'hg update' to get a working copy)
323 (run 'hg update' to get a working copy)
324 $ hgph
324 $ hgph
325 o 6 draft n-B - 145e75495359
325 o 6 draft n-B - 145e75495359
326 |
326 |
327 o 5 draft n-A - d6bcb4f74035
327 o 5 draft n-A - d6bcb4f74035
328 |
328 |
329 o 4 public b-A - f54f1bb90ff3
329 o 4 public b-A - f54f1bb90ff3
330 |
330 |
331 | @ 3 public a-D - b555f63b6063
331 | @ 3 public a-D - b555f63b6063
332 | |
332 | |
333 | o 2 public a-C - 54acac6f23ab
333 | o 2 public a-C - 54acac6f23ab
334 |/
334 |/
335 o 1 public a-B - 548a3d25dbf0
335 o 1 public a-B - 548a3d25dbf0
336 |
336 |
337 o 0 public a-A - 054250a37db4
337 o 0 public a-A - 054250a37db4
338
338
339 $ cd ..
339 $ cd ..
340
340
341 pulling back into original repo
341 pulling back into original repo
342
342
343 $ cd nu
343 $ cd nu
344 $ hg pull ../alpha
344 $ hg pull ../alpha
345 pulling from ../alpha
345 pulling from ../alpha
346 searching for changes
346 searching for changes
347 no changes found
347 no changes found
348 $ hgph
348 $ hgph
349 @ 6 public n-B - 145e75495359
349 @ 6 public n-B - 145e75495359
350 |
350 |
351 o 5 public n-A - d6bcb4f74035
351 o 5 public n-A - d6bcb4f74035
352 |
352 |
353 | o 4 public a-D - b555f63b6063
353 | o 4 public a-D - b555f63b6063
354 | |
354 | |
355 o | 3 public b-A - f54f1bb90ff3
355 o | 3 public b-A - f54f1bb90ff3
356 | |
356 | |
357 | o 2 public a-C - 54acac6f23ab
357 | o 2 public a-C - 54acac6f23ab
358 |/
358 |/
359 o 1 public a-B - 548a3d25dbf0
359 o 1 public a-B - 548a3d25dbf0
360 |
360 |
361 o 0 public a-A - 054250a37db4
361 o 0 public a-A - 054250a37db4
362
362
363
363
364 Push
364 Push
365 ````
365 ````
366
366
367 (inserted)
367 (inserted)
368
368
369 Test that phase are pushed even when they are nothing to pus
369 Test that phase are pushed even when they are nothing to pus
370 (this might be tested later bu are very convenient to not alter too much test)
370 (this might be tested later bu are very convenient to not alter too much test)
371
371
372 Push back to alpha
372 Push back to alpha
373
373
374 $ hg push ../alpha # from nu
374 $ hg push ../alpha # from nu
375 pushing to ../alpha
375 pushing to ../alpha
376 searching for changes
376 searching for changes
377 no changes found
377 no changes found
378 [1]
378 [1]
379 $ cd ..
379 $ cd ..
380 $ cd alpha
380 $ cd alpha
381 $ hgph
381 $ hgph
382 o 6 public n-B - 145e75495359
382 o 6 public n-B - 145e75495359
383 |
383 |
384 o 5 public n-A - d6bcb4f74035
384 o 5 public n-A - d6bcb4f74035
385 |
385 |
386 o 4 public b-A - f54f1bb90ff3
386 o 4 public b-A - f54f1bb90ff3
387 |
387 |
388 | @ 3 public a-D - b555f63b6063
388 | @ 3 public a-D - b555f63b6063
389 | |
389 | |
390 | o 2 public a-C - 54acac6f23ab
390 | o 2 public a-C - 54acac6f23ab
391 |/
391 |/
392 o 1 public a-B - 548a3d25dbf0
392 o 1 public a-B - 548a3d25dbf0
393 |
393 |
394 o 0 public a-A - 054250a37db4
394 o 0 public a-A - 054250a37db4
395
395
396
396
397 (end insertion)
397 (end insertion)
398
398
399
399
400 initial setup
400 initial setup
401
401
402 $ hg glog # of alpha
402 $ hg glog # of alpha
403 o changeset: 6:145e75495359
403 o changeset: 6:145e75495359
404 | tag: tip
404 | tag: tip
405 | user: test
405 | user: test
406 | date: Thu Jan 01 00:00:00 1970 +0000
406 | date: Thu Jan 01 00:00:00 1970 +0000
407 | summary: n-B
407 | summary: n-B
408 |
408 |
409 o changeset: 5:d6bcb4f74035
409 o changeset: 5:d6bcb4f74035
410 | user: test
410 | user: test
411 | date: Thu Jan 01 00:00:00 1970 +0000
411 | date: Thu Jan 01 00:00:00 1970 +0000
412 | summary: n-A
412 | summary: n-A
413 |
413 |
414 o changeset: 4:f54f1bb90ff3
414 o changeset: 4:f54f1bb90ff3
415 | parent: 1:548a3d25dbf0
415 | parent: 1:548a3d25dbf0
416 | user: test
416 | user: test
417 | date: Thu Jan 01 00:00:00 1970 +0000
417 | date: Thu Jan 01 00:00:00 1970 +0000
418 | summary: b-A
418 | summary: b-A
419 |
419 |
420 | @ changeset: 3:b555f63b6063
420 | @ changeset: 3:b555f63b6063
421 | | user: test
421 | | user: test
422 | | date: Thu Jan 01 00:00:00 1970 +0000
422 | | date: Thu Jan 01 00:00:00 1970 +0000
423 | | summary: a-D
423 | | summary: a-D
424 | |
424 | |
425 | o changeset: 2:54acac6f23ab
425 | o changeset: 2:54acac6f23ab
426 |/ user: test
426 |/ user: test
427 | date: Thu Jan 01 00:00:00 1970 +0000
427 | date: Thu Jan 01 00:00:00 1970 +0000
428 | summary: a-C
428 | summary: a-C
429 |
429 |
430 o changeset: 1:548a3d25dbf0
430 o changeset: 1:548a3d25dbf0
431 | user: test
431 | user: test
432 | date: Thu Jan 01 00:00:00 1970 +0000
432 | date: Thu Jan 01 00:00:00 1970 +0000
433 | summary: a-B
433 | summary: a-B
434 |
434 |
435 o changeset: 0:054250a37db4
435 o changeset: 0:054250a37db4
436 user: test
436 user: test
437 date: Thu Jan 01 00:00:00 1970 +0000
437 date: Thu Jan 01 00:00:00 1970 +0000
438 summary: a-A
438 summary: a-A
439
439
440 $ mkcommit a-E
440 $ mkcommit a-E
441 $ mkcommit a-F
441 $ mkcommit a-F
442 $ mkcommit a-G
442 $ mkcommit a-G
443 $ hg up d6bcb4f74035 -q
443 $ hg up d6bcb4f74035 -q
444 $ mkcommit a-H
444 $ mkcommit a-H
445 created new head
445 created new head
446 $ hgph
446 $ hgph
447 @ 10 draft a-H - 967b449fbc94
447 @ 10 draft a-H - 967b449fbc94
448 |
448 |
449 | o 9 draft a-G - 3e27b6f1eee1
449 | o 9 draft a-G - 3e27b6f1eee1
450 | |
450 | |
451 | o 8 draft a-F - b740e3e5c05d
451 | o 8 draft a-F - b740e3e5c05d
452 | |
452 | |
453 | o 7 draft a-E - e9f537e46dea
453 | o 7 draft a-E - e9f537e46dea
454 | |
454 | |
455 +---o 6 public n-B - 145e75495359
455 +---o 6 public n-B - 145e75495359
456 | |
456 | |
457 o | 5 public n-A - d6bcb4f74035
457 o | 5 public n-A - d6bcb4f74035
458 | |
458 | |
459 o | 4 public b-A - f54f1bb90ff3
459 o | 4 public b-A - f54f1bb90ff3
460 | |
460 | |
461 | o 3 public a-D - b555f63b6063
461 | o 3 public a-D - b555f63b6063
462 | |
462 | |
463 | o 2 public a-C - 54acac6f23ab
463 | o 2 public a-C - 54acac6f23ab
464 |/
464 |/
465 o 1 public a-B - 548a3d25dbf0
465 o 1 public a-B - 548a3d25dbf0
466 |
466 |
467 o 0 public a-A - 054250a37db4
467 o 0 public a-A - 054250a37db4
468
468
469
469
470 Pulling from bundle does not alter phases of changeset not present in the bundle
470 Pulling from bundle does not alter phases of changeset not present in the bundle
471
471
472 $ hg bundle --base 1 -r 6 -r 3 ../partial-bundle.hg
472 $ hg bundle --base 1 -r 6 -r 3 ../partial-bundle.hg
473 5 changesets found
473 5 changesets found
474 $ hg pull ../partial-bundle.hg
474 $ hg pull ../partial-bundle.hg
475 pulling from ../partial-bundle.hg
475 pulling from ../partial-bundle.hg
476 searching for changes
476 searching for changes
477 no changes found
477 no changes found
478 $ hgph
478 $ hgph
479 @ 10 draft a-H - 967b449fbc94
479 @ 10 draft a-H - 967b449fbc94
480 |
480 |
481 | o 9 draft a-G - 3e27b6f1eee1
481 | o 9 draft a-G - 3e27b6f1eee1
482 | |
482 | |
483 | o 8 draft a-F - b740e3e5c05d
483 | o 8 draft a-F - b740e3e5c05d
484 | |
484 | |
485 | o 7 draft a-E - e9f537e46dea
485 | o 7 draft a-E - e9f537e46dea
486 | |
486 | |
487 +---o 6 public n-B - 145e75495359
487 +---o 6 public n-B - 145e75495359
488 | |
488 | |
489 o | 5 public n-A - d6bcb4f74035
489 o | 5 public n-A - d6bcb4f74035
490 | |
490 | |
491 o | 4 public b-A - f54f1bb90ff3
491 o | 4 public b-A - f54f1bb90ff3
492 | |
492 | |
493 | o 3 public a-D - b555f63b6063
493 | o 3 public a-D - b555f63b6063
494 | |
494 | |
495 | o 2 public a-C - 54acac6f23ab
495 | o 2 public a-C - 54acac6f23ab
496 |/
496 |/
497 o 1 public a-B - 548a3d25dbf0
497 o 1 public a-B - 548a3d25dbf0
498 |
498 |
499 o 0 public a-A - 054250a37db4
499 o 0 public a-A - 054250a37db4
500
500
501
501
502 Pushing to Publish=False (unknown changeset)
502 Pushing to Publish=False (unknown changeset)
503
503
504 $ hg push ../mu -r b740e3e5c05d # a-F
504 $ hg push ../mu -r b740e3e5c05d # a-F
505 pushing to ../mu
505 pushing to ../mu
506 searching for changes
506 searching for changes
507 adding changesets
507 adding changesets
508 adding manifests
508 adding manifests
509 adding file changes
509 adding file changes
510 added 2 changesets with 2 changes to 2 files
510 added 2 changesets with 2 changes to 2 files
511 $ hgph
511 $ hgph
512 @ 10 draft a-H - 967b449fbc94
512 @ 10 draft a-H - 967b449fbc94
513 |
513 |
514 | o 9 draft a-G - 3e27b6f1eee1
514 | o 9 draft a-G - 3e27b6f1eee1
515 | |
515 | |
516 | o 8 draft a-F - b740e3e5c05d
516 | o 8 draft a-F - b740e3e5c05d
517 | |
517 | |
518 | o 7 draft a-E - e9f537e46dea
518 | o 7 draft a-E - e9f537e46dea
519 | |
519 | |
520 +---o 6 public n-B - 145e75495359
520 +---o 6 public n-B - 145e75495359
521 | |
521 | |
522 o | 5 public n-A - d6bcb4f74035
522 o | 5 public n-A - d6bcb4f74035
523 | |
523 | |
524 o | 4 public b-A - f54f1bb90ff3
524 o | 4 public b-A - f54f1bb90ff3
525 | |
525 | |
526 | o 3 public a-D - b555f63b6063
526 | o 3 public a-D - b555f63b6063
527 | |
527 | |
528 | o 2 public a-C - 54acac6f23ab
528 | o 2 public a-C - 54acac6f23ab
529 |/
529 |/
530 o 1 public a-B - 548a3d25dbf0
530 o 1 public a-B - 548a3d25dbf0
531 |
531 |
532 o 0 public a-A - 054250a37db4
532 o 0 public a-A - 054250a37db4
533
533
534
534
535 $ cd ../mu
535 $ cd ../mu
536 $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
536 $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
537 > # not ancestor of -r
537 > # not ancestor of -r
538 o 8 draft a-F - b740e3e5c05d
538 o 8 draft a-F - b740e3e5c05d
539 |
539 |
540 o 7 draft a-E - e9f537e46dea
540 o 7 draft a-E - e9f537e46dea
541 |
541 |
542 | o 6 draft n-B - 145e75495359
542 | o 6 draft n-B - 145e75495359
543 | |
543 | |
544 | o 5 draft n-A - d6bcb4f74035
544 | o 5 draft n-A - d6bcb4f74035
545 | |
545 | |
546 o | 4 public a-D - b555f63b6063
546 o | 4 public a-D - b555f63b6063
547 | |
547 | |
548 o | 3 public a-C - 54acac6f23ab
548 o | 3 public a-C - 54acac6f23ab
549 | |
549 | |
550 | o 2 draft b-A - f54f1bb90ff3
550 | o 2 draft b-A - f54f1bb90ff3
551 |/
551 |/
552 o 1 public a-B - 548a3d25dbf0
552 o 1 public a-B - 548a3d25dbf0
553 |
553 |
554 o 0 public a-A - 054250a37db4
554 o 0 public a-A - 054250a37db4
555
555
556
556
557 Pushing to Publish=True (unknown changeset)
557 Pushing to Publish=True (unknown changeset)
558
558
559 $ hg push ../beta -r b740e3e5c05d
559 $ hg push ../beta -r b740e3e5c05d
560 pushing to ../beta
560 pushing to ../beta
561 searching for changes
561 searching for changes
562 adding changesets
562 adding changesets
563 adding manifests
563 adding manifests
564 adding file changes
564 adding file changes
565 added 2 changesets with 2 changes to 2 files
565 added 2 changesets with 2 changes to 2 files
566 $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
566 $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
567 > # not ancestor of -r
567 > # not ancestor of -r
568 o 8 public a-F - b740e3e5c05d
568 o 8 public a-F - b740e3e5c05d
569 |
569 |
570 o 7 public a-E - e9f537e46dea
570 o 7 public a-E - e9f537e46dea
571 |
571 |
572 | o 6 draft n-B - 145e75495359
572 | o 6 draft n-B - 145e75495359
573 | |
573 | |
574 | o 5 draft n-A - d6bcb4f74035
574 | o 5 draft n-A - d6bcb4f74035
575 | |
575 | |
576 o | 4 public a-D - b555f63b6063
576 o | 4 public a-D - b555f63b6063
577 | |
577 | |
578 o | 3 public a-C - 54acac6f23ab
578 o | 3 public a-C - 54acac6f23ab
579 | |
579 | |
580 | o 2 draft b-A - f54f1bb90ff3
580 | o 2 draft b-A - f54f1bb90ff3
581 |/
581 |/
582 o 1 public a-B - 548a3d25dbf0
582 o 1 public a-B - 548a3d25dbf0
583 |
583 |
584 o 0 public a-A - 054250a37db4
584 o 0 public a-A - 054250a37db4
585
585
586
586
587 Pushing to Publish=True (common changeset)
587 Pushing to Publish=True (common changeset)
588
588
589 $ cd ../beta
589 $ cd ../beta
590 $ hg push ../alpha
590 $ hg push ../alpha
591 pushing to ../alpha
591 pushing to ../alpha
592 searching for changes
592 searching for changes
593 no changes found
593 no changes found
594 [1]
594 [1]
595 $ hgph
595 $ hgph
596 o 6 public a-F - b740e3e5c05d
596 o 6 public a-F - b740e3e5c05d
597 |
597 |
598 o 5 public a-E - e9f537e46dea
598 o 5 public a-E - e9f537e46dea
599 |
599 |
600 o 4 public a-D - b555f63b6063
600 o 4 public a-D - b555f63b6063
601 |
601 |
602 o 3 public a-C - 54acac6f23ab
602 o 3 public a-C - 54acac6f23ab
603 |
603 |
604 | @ 2 public b-A - f54f1bb90ff3
604 | @ 2 public b-A - f54f1bb90ff3
605 |/
605 |/
606 o 1 public a-B - 548a3d25dbf0
606 o 1 public a-B - 548a3d25dbf0
607 |
607 |
608 o 0 public a-A - 054250a37db4
608 o 0 public a-A - 054250a37db4
609
609
610 $ cd ../alpha
610 $ cd ../alpha
611 $ hgph
611 $ hgph
612 @ 10 draft a-H - 967b449fbc94
612 @ 10 draft a-H - 967b449fbc94
613 |
613 |
614 | o 9 draft a-G - 3e27b6f1eee1
614 | o 9 draft a-G - 3e27b6f1eee1
615 | |
615 | |
616 | o 8 public a-F - b740e3e5c05d
616 | o 8 public a-F - b740e3e5c05d
617 | |
617 | |
618 | o 7 public a-E - e9f537e46dea
618 | o 7 public a-E - e9f537e46dea
619 | |
619 | |
620 +---o 6 public n-B - 145e75495359
620 +---o 6 public n-B - 145e75495359
621 | |
621 | |
622 o | 5 public n-A - d6bcb4f74035
622 o | 5 public n-A - d6bcb4f74035
623 | |
623 | |
624 o | 4 public b-A - f54f1bb90ff3
624 o | 4 public b-A - f54f1bb90ff3
625 | |
625 | |
626 | o 3 public a-D - b555f63b6063
626 | o 3 public a-D - b555f63b6063
627 | |
627 | |
628 | o 2 public a-C - 54acac6f23ab
628 | o 2 public a-C - 54acac6f23ab
629 |/
629 |/
630 o 1 public a-B - 548a3d25dbf0
630 o 1 public a-B - 548a3d25dbf0
631 |
631 |
632 o 0 public a-A - 054250a37db4
632 o 0 public a-A - 054250a37db4
633
633
634
634
635 Pushing to Publish=False (common changeset that change phase + unknown one)
635 Pushing to Publish=False (common changeset that change phase + unknown one)
636
636
637 $ hg push ../mu -r 967b449fbc94 -f
637 $ hg push ../mu -r 967b449fbc94 -f
638 pushing to ../mu
638 pushing to ../mu
639 searching for changes
639 searching for changes
640 adding changesets
640 adding changesets
641 adding manifests
641 adding manifests
642 adding file changes
642 adding file changes
643 added 1 changesets with 1 changes to 1 files (+1 heads)
643 added 1 changesets with 1 changes to 1 files (+1 heads)
644 $ hgph
644 $ hgph
645 @ 10 draft a-H - 967b449fbc94
645 @ 10 draft a-H - 967b449fbc94
646 |
646 |
647 | o 9 draft a-G - 3e27b6f1eee1
647 | o 9 draft a-G - 3e27b6f1eee1
648 | |
648 | |
649 | o 8 public a-F - b740e3e5c05d
649 | o 8 public a-F - b740e3e5c05d
650 | |
650 | |
651 | o 7 public a-E - e9f537e46dea
651 | o 7 public a-E - e9f537e46dea
652 | |
652 | |
653 +---o 6 public n-B - 145e75495359
653 +---o 6 public n-B - 145e75495359
654 | |
654 | |
655 o | 5 public n-A - d6bcb4f74035
655 o | 5 public n-A - d6bcb4f74035
656 | |
656 | |
657 o | 4 public b-A - f54f1bb90ff3
657 o | 4 public b-A - f54f1bb90ff3
658 | |
658 | |
659 | o 3 public a-D - b555f63b6063
659 | o 3 public a-D - b555f63b6063
660 | |
660 | |
661 | o 2 public a-C - 54acac6f23ab
661 | o 2 public a-C - 54acac6f23ab
662 |/
662 |/
663 o 1 public a-B - 548a3d25dbf0
663 o 1 public a-B - 548a3d25dbf0
664 |
664 |
665 o 0 public a-A - 054250a37db4
665 o 0 public a-A - 054250a37db4
666
666
667 $ cd ../mu
667 $ cd ../mu
668 $ hgph # d6bcb4f74035 should have changed phase
668 $ hgph # d6bcb4f74035 should have changed phase
669 > # 145e75495359 is still draft. not ancestor of -r
669 > # 145e75495359 is still draft. not ancestor of -r
670 o 9 draft a-H - 967b449fbc94
670 o 9 draft a-H - 967b449fbc94
671 |
671 |
672 | o 8 public a-F - b740e3e5c05d
672 | o 8 public a-F - b740e3e5c05d
673 | |
673 | |
674 | o 7 public a-E - e9f537e46dea
674 | o 7 public a-E - e9f537e46dea
675 | |
675 | |
676 +---o 6 draft n-B - 145e75495359
676 +---o 6 draft n-B - 145e75495359
677 | |
677 | |
678 o | 5 public n-A - d6bcb4f74035
678 o | 5 public n-A - d6bcb4f74035
679 | |
679 | |
680 | o 4 public a-D - b555f63b6063
680 | o 4 public a-D - b555f63b6063
681 | |
681 | |
682 | o 3 public a-C - 54acac6f23ab
682 | o 3 public a-C - 54acac6f23ab
683 | |
683 | |
684 o | 2 public b-A - f54f1bb90ff3
684 o | 2 public b-A - f54f1bb90ff3
685 |/
685 |/
686 o 1 public a-B - 548a3d25dbf0
686 o 1 public a-B - 548a3d25dbf0
687 |
687 |
688 o 0 public a-A - 054250a37db4
688 o 0 public a-A - 054250a37db4
689
689
690
690
691
691
692 Pushing to Publish=True (common changeset from publish=False)
692 Pushing to Publish=True (common changeset from publish=False)
693
693
694 (in mu)
694 (in mu)
695 $ hg push ../alpha
695 $ hg push ../alpha
696 pushing to ../alpha
696 pushing to ../alpha
697 searching for changes
697 searching for changes
698 no changes found
698 no changes found
699 [1]
699 [1]
700 $ hgph
700 $ hgph
701 o 9 public a-H - 967b449fbc94
701 o 9 public a-H - 967b449fbc94
702 |
702 |
703 | o 8 public a-F - b740e3e5c05d
703 | o 8 public a-F - b740e3e5c05d
704 | |
704 | |
705 | o 7 public a-E - e9f537e46dea
705 | o 7 public a-E - e9f537e46dea
706 | |
706 | |
707 +---o 6 public n-B - 145e75495359
707 +---o 6 public n-B - 145e75495359
708 | |
708 | |
709 o | 5 public n-A - d6bcb4f74035
709 o | 5 public n-A - d6bcb4f74035
710 | |
710 | |
711 | o 4 public a-D - b555f63b6063
711 | o 4 public a-D - b555f63b6063
712 | |
712 | |
713 | o 3 public a-C - 54acac6f23ab
713 | o 3 public a-C - 54acac6f23ab
714 | |
714 | |
715 o | 2 public b-A - f54f1bb90ff3
715 o | 2 public b-A - f54f1bb90ff3
716 |/
716 |/
717 o 1 public a-B - 548a3d25dbf0
717 o 1 public a-B - 548a3d25dbf0
718 |
718 |
719 o 0 public a-A - 054250a37db4
719 o 0 public a-A - 054250a37db4
720
720
721 $ hgph -R ../alpha # a-H should have been synced to 0
721 $ hgph -R ../alpha # a-H should have been synced to 0
722 @ 10 public a-H - 967b449fbc94
722 @ 10 public a-H - 967b449fbc94
723 |
723 |
724 | o 9 draft a-G - 3e27b6f1eee1
724 | o 9 draft a-G - 3e27b6f1eee1
725 | |
725 | |
726 | o 8 public a-F - b740e3e5c05d
726 | o 8 public a-F - b740e3e5c05d
727 | |
727 | |
728 | o 7 public a-E - e9f537e46dea
728 | o 7 public a-E - e9f537e46dea
729 | |
729 | |
730 +---o 6 public n-B - 145e75495359
730 +---o 6 public n-B - 145e75495359
731 | |
731 | |
732 o | 5 public n-A - d6bcb4f74035
732 o | 5 public n-A - d6bcb4f74035
733 | |
733 | |
734 o | 4 public b-A - f54f1bb90ff3
734 o | 4 public b-A - f54f1bb90ff3
735 | |
735 | |
736 | o 3 public a-D - b555f63b6063
736 | o 3 public a-D - b555f63b6063
737 | |
737 | |
738 | o 2 public a-C - 54acac6f23ab
738 | o 2 public a-C - 54acac6f23ab
739 |/
739 |/
740 o 1 public a-B - 548a3d25dbf0
740 o 1 public a-B - 548a3d25dbf0
741 |
741 |
742 o 0 public a-A - 054250a37db4
742 o 0 public a-A - 054250a37db4
743
743
744
744
745
745
746 Discovery locally secret changeset on a remote repository:
746 Discovery locally secret changeset on a remote repository:
747
747
748 - should make it non-secret
748 - should make it non-secret
749
749
750 $ cd ../alpha
750 $ cd ../alpha
751 $ mkcommit A-secret --config phases.new-commit=2
751 $ mkcommit A-secret --config phases.new-commit=2
752 $ hgph
752 $ hgph
753 @ 11 secret A-secret - 435b5d83910c
753 @ 11 secret A-secret - 435b5d83910c
754 |
754 |
755 o 10 public a-H - 967b449fbc94
755 o 10 public a-H - 967b449fbc94
756 |
756 |
757 | o 9 draft a-G - 3e27b6f1eee1
757 | o 9 draft a-G - 3e27b6f1eee1
758 | |
758 | |
759 | o 8 public a-F - b740e3e5c05d
759 | o 8 public a-F - b740e3e5c05d
760 | |
760 | |
761 | o 7 public a-E - e9f537e46dea
761 | o 7 public a-E - e9f537e46dea
762 | |
762 | |
763 +---o 6 public n-B - 145e75495359
763 +---o 6 public n-B - 145e75495359
764 | |
764 | |
765 o | 5 public n-A - d6bcb4f74035
765 o | 5 public n-A - d6bcb4f74035
766 | |
766 | |
767 o | 4 public b-A - f54f1bb90ff3
767 o | 4 public b-A - f54f1bb90ff3
768 | |
768 | |
769 | o 3 public a-D - b555f63b6063
769 | o 3 public a-D - b555f63b6063
770 | |
770 | |
771 | o 2 public a-C - 54acac6f23ab
771 | o 2 public a-C - 54acac6f23ab
772 |/
772 |/
773 o 1 public a-B - 548a3d25dbf0
773 o 1 public a-B - 548a3d25dbf0
774 |
774 |
775 o 0 public a-A - 054250a37db4
775 o 0 public a-A - 054250a37db4
776
776
777 $ hg bundle --base 'parents(.)' -r . ../secret-bundle.hg
777 $ hg bundle --base 'parents(.)' -r . ../secret-bundle.hg
778 1 changesets found
778 1 changesets found
779 $ hg -R ../mu unbundle ../secret-bundle.hg
779 $ hg -R ../mu unbundle ../secret-bundle.hg
780 adding changesets
780 adding changesets
781 adding manifests
781 adding manifests
782 adding file changes
782 adding file changes
783 added 1 changesets with 1 changes to 1 files
783 added 1 changesets with 1 changes to 1 files
784 (run 'hg update' to get a working copy)
784 (run 'hg update' to get a working copy)
785 $ hgph -R ../mu
785 $ hgph -R ../mu
786 o 10 draft A-secret - 435b5d83910c
786 o 10 draft A-secret - 435b5d83910c
787 |
787 |
788 o 9 public a-H - 967b449fbc94
788 o 9 public a-H - 967b449fbc94
789 |
789 |
790 | o 8 public a-F - b740e3e5c05d
790 | o 8 public a-F - b740e3e5c05d
791 | |
791 | |
792 | o 7 public a-E - e9f537e46dea
792 | o 7 public a-E - e9f537e46dea
793 | |
793 | |
794 +---o 6 public n-B - 145e75495359
794 +---o 6 public n-B - 145e75495359
795 | |
795 | |
796 o | 5 public n-A - d6bcb4f74035
796 o | 5 public n-A - d6bcb4f74035
797 | |
797 | |
798 | o 4 public a-D - b555f63b6063
798 | o 4 public a-D - b555f63b6063
799 | |
799 | |
800 | o 3 public a-C - 54acac6f23ab
800 | o 3 public a-C - 54acac6f23ab
801 | |
801 | |
802 o | 2 public b-A - f54f1bb90ff3
802 o | 2 public b-A - f54f1bb90ff3
803 |/
803 |/
804 o 1 public a-B - 548a3d25dbf0
804 o 1 public a-B - 548a3d25dbf0
805 |
805 |
806 o 0 public a-A - 054250a37db4
806 o 0 public a-A - 054250a37db4
807
807
808 $ hg pull ../mu
808 $ hg pull ../mu
809 pulling from ../mu
809 pulling from ../mu
810 searching for changes
810 searching for changes
811 no changes found
811 no changes found
812 $ hgph
812 $ hgph
813 @ 11 draft A-secret - 435b5d83910c
813 @ 11 draft A-secret - 435b5d83910c
814 |
814 |
815 o 10 public a-H - 967b449fbc94
815 o 10 public a-H - 967b449fbc94
816 |
816 |
817 | o 9 draft a-G - 3e27b6f1eee1
817 | o 9 draft a-G - 3e27b6f1eee1
818 | |
818 | |
819 | o 8 public a-F - b740e3e5c05d
819 | o 8 public a-F - b740e3e5c05d
820 | |
820 | |
821 | o 7 public a-E - e9f537e46dea
821 | o 7 public a-E - e9f537e46dea
822 | |
822 | |
823 +---o 6 public n-B - 145e75495359
823 +---o 6 public n-B - 145e75495359
824 | |
824 | |
825 o | 5 public n-A - d6bcb4f74035
825 o | 5 public n-A - d6bcb4f74035
826 | |
826 | |
827 o | 4 public b-A - f54f1bb90ff3
827 o | 4 public b-A - f54f1bb90ff3
828 | |
828 | |
829 | o 3 public a-D - b555f63b6063
829 | o 3 public a-D - b555f63b6063
830 | |
830 | |
831 | o 2 public a-C - 54acac6f23ab
831 | o 2 public a-C - 54acac6f23ab
832 |/
832 |/
833 o 1 public a-B - 548a3d25dbf0
833 o 1 public a-B - 548a3d25dbf0
834 |
834 |
835 o 0 public a-A - 054250a37db4
835 o 0 public a-A - 054250a37db4
836
836
837
837
838 pushing a locally public and draft changesets remotly secret should make them
838 pushing a locally public and draft changesets remotly secret should make them
839 appear on the remote side.
839 appear on the remote side.
840
840
841
841
842 $ hg -R ../mu phase --secret --force 967b449fbc94
842 $ hg -R ../mu phase --secret --force 967b449fbc94
843 $ hg push -r 435b5d83910c ../mu
843 $ hg push -r 435b5d83910c ../mu
844 pushing to ../mu
844 pushing to ../mu
845 searching for changes
845 searching for changes
846 abort: push creates new remote head 435b5d83910c!
846 abort: push creates new remote head 435b5d83910c!
847 (did you forget to merge? use push -f to force)
847 (did you forget to merge? use push -f to force)
848 [255]
848 [255]
849 $ hg push -fr 435b5d83910c ../mu # because the push will create new visible head
849 $ hg push -fr 435b5d83910c ../mu # because the push will create new visible head
850 pushing to ../mu
850 pushing to ../mu
851 searching for changes
851 searching for changes
852 adding changesets
852 adding changesets
853 adding manifests
853 adding manifests
854 adding file changes
854 adding file changes
855 added 0 changesets with 0 changes to 2 files
855 added 0 changesets with 0 changes to 2 files
856 $ hgph -R ../mu
856 $ hgph -R ../mu
857 o 10 draft A-secret - 435b5d83910c
857 o 10 draft A-secret - 435b5d83910c
858 |
858 |
859 o 9 public a-H - 967b449fbc94
859 o 9 public a-H - 967b449fbc94
860 |
860 |
861 | o 8 public a-F - b740e3e5c05d
861 | o 8 public a-F - b740e3e5c05d
862 | |
862 | |
863 | o 7 public a-E - e9f537e46dea
863 | o 7 public a-E - e9f537e46dea
864 | |
864 | |
865 +---o 6 public n-B - 145e75495359
865 +---o 6 public n-B - 145e75495359
866 | |
866 | |
867 o | 5 public n-A - d6bcb4f74035
867 o | 5 public n-A - d6bcb4f74035
868 | |
868 | |
869 | o 4 public a-D - b555f63b6063
869 | o 4 public a-D - b555f63b6063
870 | |
870 | |
871 | o 3 public a-C - 54acac6f23ab
871 | o 3 public a-C - 54acac6f23ab
872 | |
872 | |
873 o | 2 public b-A - f54f1bb90ff3
873 o | 2 public b-A - f54f1bb90ff3
874 |/
874 |/
875 o 1 public a-B - 548a3d25dbf0
875 o 1 public a-B - 548a3d25dbf0
876 |
876 |
877 o 0 public a-A - 054250a37db4
877 o 0 public a-A - 054250a37db4
878
878
879
879
880 pull new changeset with common draft locally
880 pull new changeset with common draft locally
881
881
882 $ hg up -q 967b449fbc94 # create a new root for draft
882 $ hg up -q 967b449fbc94 # create a new root for draft
883 $ mkcommit 'alpha-more'
883 $ mkcommit 'alpha-more'
884 created new head
884 created new head
885 $ hg push -fr . ../mu
885 $ hg push -fr . ../mu
886 pushing to ../mu
886 pushing to ../mu
887 searching for changes
887 searching for changes
888 adding changesets
888 adding changesets
889 adding manifests
889 adding manifests
890 adding file changes
890 adding file changes
891 added 1 changesets with 1 changes to 1 files (+1 heads)
891 added 1 changesets with 1 changes to 1 files (+1 heads)
892 $ cd ../mu
892 $ cd ../mu
893 $ hg phase --secret --force 1c5cfd894796
893 $ hg phase --secret --force 1c5cfd894796
894 $ hg up -q 435b5d83910c
894 $ hg up -q 435b5d83910c
895 $ mkcommit 'mu-more'
895 $ mkcommit 'mu-more'
896 $ cd ../alpha
896 $ cd ../alpha
897 $ hg pull ../mu
897 $ hg pull ../mu
898 pulling from ../mu
898 pulling from ../mu
899 searching for changes
899 searching for changes
900 adding changesets
900 adding changesets
901 adding manifests
901 adding manifests
902 adding file changes
902 adding file changes
903 added 1 changesets with 1 changes to 1 files
903 added 1 changesets with 1 changes to 1 files
904 (run 'hg update' to get a working copy)
904 (run 'hg update' to get a working copy)
905 $ hgph
905 $ hgph
906 o 13 draft mu-more - 5237fb433fc8
906 o 13 draft mu-more - 5237fb433fc8
907 |
907 |
908 | @ 12 draft alpha-more - 1c5cfd894796
908 | @ 12 draft alpha-more - 1c5cfd894796
909 | |
909 | |
910 o | 11 draft A-secret - 435b5d83910c
910 o | 11 draft A-secret - 435b5d83910c
911 |/
911 |/
912 o 10 public a-H - 967b449fbc94
912 o 10 public a-H - 967b449fbc94
913 |
913 |
914 | o 9 draft a-G - 3e27b6f1eee1
914 | o 9 draft a-G - 3e27b6f1eee1
915 | |
915 | |
916 | o 8 public a-F - b740e3e5c05d
916 | o 8 public a-F - b740e3e5c05d
917 | |
917 | |
918 | o 7 public a-E - e9f537e46dea
918 | o 7 public a-E - e9f537e46dea
919 | |
919 | |
920 +---o 6 public n-B - 145e75495359
920 +---o 6 public n-B - 145e75495359
921 | |
921 | |
922 o | 5 public n-A - d6bcb4f74035
922 o | 5 public n-A - d6bcb4f74035
923 | |
923 | |
924 o | 4 public b-A - f54f1bb90ff3
924 o | 4 public b-A - f54f1bb90ff3
925 | |
925 | |
926 | o 3 public a-D - b555f63b6063
926 | o 3 public a-D - b555f63b6063
927 | |
927 | |
928 | o 2 public a-C - 54acac6f23ab
928 | o 2 public a-C - 54acac6f23ab
929 |/
929 |/
930 o 1 public a-B - 548a3d25dbf0
930 o 1 public a-B - 548a3d25dbf0
931 |
931 |
932 o 0 public a-A - 054250a37db4
932 o 0 public a-A - 054250a37db4
933
933
934
934
935 Test that test are properly ignored on remote event when existing locally
935 Test that test are properly ignored on remote event when existing locally
936
936
937 $ cd ..
937 $ cd ..
938 $ hg clone -qU -r b555f63b6063 -r f54f1bb90ff3 beta gamma
938 $ hg clone -qU -r b555f63b6063 -r f54f1bb90ff3 beta gamma
939
939
940 # pathological case are
940 # pathological case are
941 #
941 #
942 # * secret remotely
942 # * secret remotely
943 # * known locally
943 # * known locally
944 # * repo have uncommon changeset
944 # * repo have uncommon changeset
945
945
946 $ hg -R beta phase --secret --force f54f1bb90ff3
946 $ hg -R beta phase --secret --force f54f1bb90ff3
947 $ hg -R gamma phase --draft --force f54f1bb90ff3
947 $ hg -R gamma phase --draft --force f54f1bb90ff3
948
948
949 $ cd gamma
949 $ cd gamma
950 $ hg pull ../beta
950 $ hg pull ../beta
951 pulling from ../beta
951 pulling from ../beta
952 searching for changes
952 searching for changes
953 adding changesets
953 adding changesets
954 adding manifests
954 adding manifests
955 adding file changes
955 adding file changes
956 added 2 changesets with 2 changes to 2 files
956 added 2 changesets with 2 changes to 2 files
957 (run 'hg update' to get a working copy)
957 (run 'hg update' to get a working copy)
958 $ hg phase f54f1bb90ff3
958 $ hg phase f54f1bb90ff3
959 2: draft
959 2: draft
960
960
961 same over the wire
961 same over the wire
962
962
963 $ cd ../beta
963 $ cd ../beta
964 $ hg serve -p $HGPORT -d --pid-file=../beta.pid -E ../beta-error.log
964 $ hg serve -p $HGPORT -d --pid-file=../beta.pid -E ../beta-error.log
965 $ cat ../beta.pid >> $DAEMON_PIDS
965 $ cat ../beta.pid >> $DAEMON_PIDS
966 $ cd ../gamma
966 $ cd ../gamma
967
967
968 $ hg pull http://localhost:$HGPORT/
968 $ hg pull http://localhost:$HGPORT/
969 pulling from http://localhost:$HGPORT/
969 pulling from http://localhost:$HGPORT/
970 searching for changes
970 searching for changes
971 no changes found
971 no changes found
972 $ hg phase f54f1bb90ff3
972 $ hg phase f54f1bb90ff3
973 2: draft
973 2: draft
974
974
975 check that secret local on both side are not synced to public
975 check that secret local on both side are not synced to public
976
976
977 $ hg push -r b555f63b6063 http://localhost:$HGPORT/
977 $ hg push -r b555f63b6063 http://localhost:$HGPORT/
978 pushing to http://localhost:$HGPORT/
978 pushing to http://localhost:$HGPORT/
979 searching for changes
979 searching for changes
980 no changes found
980 no changes found
981 [1]
981 [1]
982 $ hg phase f54f1bb90ff3
982 $ hg phase f54f1bb90ff3
983 2: draft
983 2: draft
984
984
985 put the changeset in the draft state again
985 put the changeset in the draft state again
986 (first test after this one expect to be able to copy)
986 (first test after this one expect to be able to copy)
987
987
988 $ cd ..
988 $ cd ..
989
989
990
990
991 Test Clone behavior
991 Test Clone behavior
992
992
993 A. Clone without secret changeset
993 A. Clone without secret changeset
994
994
995 1. cloning non-publishing repository
995 1. cloning non-publishing repository
996 (Phase should be preserved)
996 (Phase should be preserved)
997
997
998 # make sure there is no secret so we can use a copy clone
998 # make sure there is no secret so we can use a copy clone
999
999
1000 $ hg -R mu phase --draft 'secret()'
1000 $ hg -R mu phase --draft 'secret()'
1001
1001
1002 $ hg clone -U mu Tau
1002 $ hg clone -U mu Tau
1003 $ hgph -R Tau
1003 $ hgph -R Tau
1004 o 12 draft mu-more - 5237fb433fc8
1004 o 12 draft mu-more - 5237fb433fc8
1005 |
1005 |
1006 | o 11 draft alpha-more - 1c5cfd894796
1006 | o 11 draft alpha-more - 1c5cfd894796
1007 | |
1007 | |
1008 o | 10 draft A-secret - 435b5d83910c
1008 o | 10 draft A-secret - 435b5d83910c
1009 |/
1009 |/
1010 o 9 public a-H - 967b449fbc94
1010 o 9 public a-H - 967b449fbc94
1011 |
1011 |
1012 | o 8 public a-F - b740e3e5c05d
1012 | o 8 public a-F - b740e3e5c05d
1013 | |
1013 | |
1014 | o 7 public a-E - e9f537e46dea
1014 | o 7 public a-E - e9f537e46dea
1015 | |
1015 | |
1016 +---o 6 public n-B - 145e75495359
1016 +---o 6 public n-B - 145e75495359
1017 | |
1017 | |
1018 o | 5 public n-A - d6bcb4f74035
1018 o | 5 public n-A - d6bcb4f74035
1019 | |
1019 | |
1020 | o 4 public a-D - b555f63b6063
1020 | o 4 public a-D - b555f63b6063
1021 | |
1021 | |
1022 | o 3 public a-C - 54acac6f23ab
1022 | o 3 public a-C - 54acac6f23ab
1023 | |
1023 | |
1024 o | 2 public b-A - f54f1bb90ff3
1024 o | 2 public b-A - f54f1bb90ff3
1025 |/
1025 |/
1026 o 1 public a-B - 548a3d25dbf0
1026 o 1 public a-B - 548a3d25dbf0
1027 |
1027 |
1028 o 0 public a-A - 054250a37db4
1028 o 0 public a-A - 054250a37db4
1029
1029
1030
1030
1031 2. cloning publishing repository
1031 2. cloning publishing repository
1032
1032
1033 (everything should be public)
1033 (everything should be public)
1034
1034
1035 $ hg clone -U alpha Upsilon
1035 $ hg clone -U alpha Upsilon
1036 $ hgph -R Upsilon
1036 $ hgph -R Upsilon
1037 o 13 public mu-more - 5237fb433fc8
1037 o 13 public mu-more - 5237fb433fc8
1038 |
1038 |
1039 | o 12 public alpha-more - 1c5cfd894796
1039 | o 12 public alpha-more - 1c5cfd894796
1040 | |
1040 | |
1041 o | 11 public A-secret - 435b5d83910c
1041 o | 11 public A-secret - 435b5d83910c
1042 |/
1042 |/
1043 o 10 public a-H - 967b449fbc94
1043 o 10 public a-H - 967b449fbc94
1044 |
1044 |
1045 | o 9 public a-G - 3e27b6f1eee1
1045 | o 9 public a-G - 3e27b6f1eee1
1046 | |
1046 | |
1047 | o 8 public a-F - b740e3e5c05d
1047 | o 8 public a-F - b740e3e5c05d
1048 | |
1048 | |
1049 | o 7 public a-E - e9f537e46dea
1049 | o 7 public a-E - e9f537e46dea
1050 | |
1050 | |
1051 +---o 6 public n-B - 145e75495359
1051 +---o 6 public n-B - 145e75495359
1052 | |
1052 | |
1053 o | 5 public n-A - d6bcb4f74035
1053 o | 5 public n-A - d6bcb4f74035
1054 | |
1054 | |
1055 o | 4 public b-A - f54f1bb90ff3
1055 o | 4 public b-A - f54f1bb90ff3
1056 | |
1056 | |
1057 | o 3 public a-D - b555f63b6063
1057 | o 3 public a-D - b555f63b6063
1058 | |
1058 | |
1059 | o 2 public a-C - 54acac6f23ab
1059 | o 2 public a-C - 54acac6f23ab
1060 |/
1060 |/
1061 o 1 public a-B - 548a3d25dbf0
1061 o 1 public a-B - 548a3d25dbf0
1062 |
1062 |
1063 o 0 public a-A - 054250a37db4
1063 o 0 public a-A - 054250a37db4
1064
1064
1065
1065
General Comments 0
You need to be logged in to leave comments. Login now