##// END OF EJS Templates
bundlerepo: bundle repos should be non-publishing (issue3266)...
Pierre-Yves David -
r16195:40cc2004 stable
parent child Browse files
Show More
@@ -1,368 +1,369
1 1 # bundlerepo.py - repository class for viewing uncompressed bundles
2 2 #
3 3 # Copyright 2006, 2007 Benoit Boissinot <bboissin@gmail.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 """Repository class for viewing uncompressed bundles.
9 9
10 10 This provides a read-only repository interface to bundles as if they
11 11 were part of the actual repository.
12 12 """
13 13
14 14 from node import nullid
15 15 from i18n import _
16 16 import os, tempfile, shutil
17 17 import changegroup, util, mdiff, discovery, cmdutil
18 18 import localrepo, changelog, manifest, filelog, revlog, error
19 19
20 20 class bundlerevlog(revlog.revlog):
21 21 def __init__(self, opener, indexfile, bundle, linkmapper):
22 22 # How it works:
23 23 # to retrieve a revision, we need to know the offset of
24 24 # the revision in the bundle (an unbundle object).
25 25 #
26 26 # We store this offset in the index (start), to differentiate a
27 27 # rev in the bundle and from a rev in the revlog, we check
28 28 # len(index[r]). If the tuple is bigger than 7, it is a bundle
29 29 # (it is bigger since we store the node to which the delta is)
30 30 #
31 31 revlog.revlog.__init__(self, opener, indexfile)
32 32 self.bundle = bundle
33 33 self.basemap = {}
34 34 n = len(self)
35 35 chain = None
36 36 while True:
37 37 chunkdata = bundle.deltachunk(chain)
38 38 if not chunkdata:
39 39 break
40 40 node = chunkdata['node']
41 41 p1 = chunkdata['p1']
42 42 p2 = chunkdata['p2']
43 43 cs = chunkdata['cs']
44 44 deltabase = chunkdata['deltabase']
45 45 delta = chunkdata['delta']
46 46
47 47 size = len(delta)
48 48 start = bundle.tell() - size
49 49
50 50 link = linkmapper(cs)
51 51 if node in self.nodemap:
52 52 # this can happen if two branches make the same change
53 53 chain = node
54 54 continue
55 55
56 56 for p in (p1, p2):
57 57 if not p in self.nodemap:
58 58 raise error.LookupError(p, self.indexfile,
59 59 _("unknown parent"))
60 60 # start, size, full unc. size, base (unused), link, p1, p2, node
61 61 e = (revlog.offset_type(start, 0), size, -1, -1, link,
62 62 self.rev(p1), self.rev(p2), node)
63 63 self.basemap[n] = deltabase
64 64 self.index.insert(-1, e)
65 65 self.nodemap[node] = n
66 66 chain = node
67 67 n += 1
68 68
69 69 def inbundle(self, rev):
70 70 """is rev from the bundle"""
71 71 if rev < 0:
72 72 return False
73 73 return rev in self.basemap
74 74 def bundlebase(self, rev):
75 75 return self.basemap[rev]
76 76 def _chunk(self, rev):
77 77 # Warning: in case of bundle, the diff is against bundlebase,
78 78 # not against rev - 1
79 79 # XXX: could use some caching
80 80 if not self.inbundle(rev):
81 81 return revlog.revlog._chunk(self, rev)
82 82 self.bundle.seek(self.start(rev))
83 83 return self.bundle.read(self.length(rev))
84 84
85 85 def revdiff(self, rev1, rev2):
86 86 """return or calculate a delta between two revisions"""
87 87 if self.inbundle(rev1) and self.inbundle(rev2):
88 88 # hot path for bundle
89 89 revb = self.rev(self.bundlebase(rev2))
90 90 if revb == rev1:
91 91 return self._chunk(rev2)
92 92 elif not self.inbundle(rev1) and not self.inbundle(rev2):
93 93 return revlog.revlog.revdiff(self, rev1, rev2)
94 94
95 95 return mdiff.textdiff(self.revision(self.node(rev1)),
96 96 self.revision(self.node(rev2)))
97 97
98 98 def revision(self, node):
99 99 """return an uncompressed revision of a given"""
100 100 if node == nullid:
101 101 return ""
102 102
103 103 text = None
104 104 chain = []
105 105 iter_node = node
106 106 rev = self.rev(iter_node)
107 107 # reconstruct the revision if it is from a changegroup
108 108 while self.inbundle(rev):
109 109 if self._cache and self._cache[0] == iter_node:
110 110 text = self._cache[2]
111 111 break
112 112 chain.append(rev)
113 113 iter_node = self.bundlebase(rev)
114 114 rev = self.rev(iter_node)
115 115 if text is None:
116 116 text = revlog.revlog.revision(self, iter_node)
117 117
118 118 while chain:
119 119 delta = self._chunk(chain.pop())
120 120 text = mdiff.patches(text, [delta])
121 121
122 122 p1, p2 = self.parents(node)
123 123 if node != revlog.hash(text, p1, p2):
124 124 raise error.RevlogError(_("integrity check failed on %s:%d")
125 125 % (self.datafile, self.rev(node)))
126 126
127 127 self._cache = (node, self.rev(node), text)
128 128 return text
129 129
130 130 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
131 131 raise NotImplementedError
132 132 def addgroup(self, revs, linkmapper, transaction):
133 133 raise NotImplementedError
134 134 def strip(self, rev, minlink):
135 135 raise NotImplementedError
136 136 def checksize(self):
137 137 raise NotImplementedError
138 138
139 139 class bundlechangelog(bundlerevlog, changelog.changelog):
140 140 def __init__(self, opener, bundle):
141 141 changelog.changelog.__init__(self, opener)
142 142 linkmapper = lambda x: x
143 143 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
144 144 linkmapper)
145 145
146 146 class bundlemanifest(bundlerevlog, manifest.manifest):
147 147 def __init__(self, opener, bundle, linkmapper):
148 148 manifest.manifest.__init__(self, opener)
149 149 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
150 150 linkmapper)
151 151
152 152 class bundlefilelog(bundlerevlog, filelog.filelog):
153 153 def __init__(self, opener, path, bundle, linkmapper, repo):
154 154 filelog.filelog.__init__(self, opener, path)
155 155 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
156 156 linkmapper)
157 157 self._repo = repo
158 158
159 159 def _file(self, f):
160 160 self._repo.file(f)
161 161
162 162 class bundlerepository(localrepo.localrepository):
163 163 def __init__(self, ui, path, bundlename):
164 164 self._tempparent = None
165 165 try:
166 166 localrepo.localrepository.__init__(self, ui, path)
167 167 except error.RepoError:
168 168 self._tempparent = tempfile.mkdtemp()
169 169 localrepo.instance(ui, self._tempparent, 1)
170 170 localrepo.localrepository.__init__(self, ui, self._tempparent)
171 self.ui.setconfig('phases', 'publish', False)
171 172
172 173 if path:
173 174 self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
174 175 else:
175 176 self._url = 'bundle:' + bundlename
176 177
177 178 self.tempfile = None
178 179 f = util.posixfile(bundlename, "rb")
179 180 self.bundle = changegroup.readbundle(f, bundlename)
180 181 if self.bundle.compressed():
181 182 fdtemp, temp = tempfile.mkstemp(prefix="hg-bundle-",
182 183 suffix=".hg10un", dir=self.path)
183 184 self.tempfile = temp
184 185 fptemp = os.fdopen(fdtemp, 'wb')
185 186
186 187 try:
187 188 fptemp.write("HG10UN")
188 189 while True:
189 190 chunk = self.bundle.read(2**18)
190 191 if not chunk:
191 192 break
192 193 fptemp.write(chunk)
193 194 finally:
194 195 fptemp.close()
195 196
196 197 f = util.posixfile(self.tempfile, "rb")
197 198 self.bundle = changegroup.readbundle(f, bundlename)
198 199
199 200 # dict with the mapping 'filename' -> position in the bundle
200 201 self.bundlefilespos = {}
201 202
202 203 @util.propertycache
203 204 def changelog(self):
204 205 # consume the header if it exists
205 206 self.bundle.changelogheader()
206 207 c = bundlechangelog(self.sopener, self.bundle)
207 208 self.manstart = self.bundle.tell()
208 209 return c
209 210
210 211 @util.propertycache
211 212 def manifest(self):
212 213 self.bundle.seek(self.manstart)
213 214 # consume the header if it exists
214 215 self.bundle.manifestheader()
215 216 m = bundlemanifest(self.sopener, self.bundle, self.changelog.rev)
216 217 self.filestart = self.bundle.tell()
217 218 return m
218 219
219 220 @util.propertycache
220 221 def manstart(self):
221 222 self.changelog
222 223 return self.manstart
223 224
224 225 @util.propertycache
225 226 def filestart(self):
226 227 self.manifest
227 228 return self.filestart
228 229
229 230 def url(self):
230 231 return self._url
231 232
232 233 def file(self, f):
233 234 if not self.bundlefilespos:
234 235 self.bundle.seek(self.filestart)
235 236 while True:
236 237 chunkdata = self.bundle.filelogheader()
237 238 if not chunkdata:
238 239 break
239 240 fname = chunkdata['filename']
240 241 self.bundlefilespos[fname] = self.bundle.tell()
241 242 while True:
242 243 c = self.bundle.deltachunk(None)
243 244 if not c:
244 245 break
245 246
246 247 if f[0] == '/':
247 248 f = f[1:]
248 249 if f in self.bundlefilespos:
249 250 self.bundle.seek(self.bundlefilespos[f])
250 251 return bundlefilelog(self.sopener, f, self.bundle,
251 252 self.changelog.rev, self)
252 253 else:
253 254 return filelog.filelog(self.sopener, f)
254 255
255 256 def close(self):
256 257 """Close assigned bundle file immediately."""
257 258 self.bundle.close()
258 259 if self.tempfile is not None:
259 260 os.unlink(self.tempfile)
260 261 if self._tempparent:
261 262 shutil.rmtree(self._tempparent, True)
262 263
263 264 def cancopy(self):
264 265 return False
265 266
266 267 def getcwd(self):
267 268 return os.getcwd() # always outside the repo
268 269
269 270 def _writebranchcache(self, branches, tip, tiprev):
270 271 # don't overwrite the disk cache with bundle-augmented data
271 272 pass
272 273
273 274 def instance(ui, path, create):
274 275 if create:
275 276 raise util.Abort(_('cannot create new bundle repository'))
276 277 parentpath = ui.config("bundle", "mainreporoot", "")
277 278 if not parentpath:
278 279 # try to find the correct path to the working directory repo
279 280 parentpath = cmdutil.findrepo(os.getcwd())
280 281 if parentpath is None:
281 282 parentpath = ''
282 283 if parentpath:
283 284 # Try to make the full path relative so we get a nice, short URL.
284 285 # In particular, we don't want temp dir names in test outputs.
285 286 cwd = os.getcwd()
286 287 if parentpath == cwd:
287 288 parentpath = ''
288 289 else:
289 290 cwd = os.path.join(cwd,'')
290 291 if parentpath.startswith(cwd):
291 292 parentpath = parentpath[len(cwd):]
292 293 u = util.url(path)
293 294 path = u.localpath()
294 295 if u.scheme == 'bundle':
295 296 s = path.split("+", 1)
296 297 if len(s) == 1:
297 298 repopath, bundlename = parentpath, s[0]
298 299 else:
299 300 repopath, bundlename = s
300 301 else:
301 302 repopath, bundlename = parentpath, path
302 303 return bundlerepository(ui, repopath, bundlename)
303 304
304 305 def getremotechanges(ui, repo, other, onlyheads=None, bundlename=None,
305 306 force=False):
306 307 '''obtains a bundle of changes incoming from other
307 308
308 309 "onlyheads" restricts the returned changes to those reachable from the
309 310 specified heads.
310 311 "bundlename", if given, stores the bundle to this file path permanently;
311 312 otherwise it's stored to a temp file and gets deleted again when you call
312 313 the returned "cleanupfn".
313 314 "force" indicates whether to proceed on unrelated repos.
314 315
315 316 Returns a tuple (local, csets, cleanupfn):
316 317
317 318 "local" is a local repo from which to obtain the actual incoming changesets; it
318 319 is a bundlerepo for the obtained bundle when the original "other" is remote.
319 320 "csets" lists the incoming changeset node ids.
320 321 "cleanupfn" must be called without arguments when you're done processing the
321 322 changes; it closes both the original "other" and the one returned here.
322 323 '''
323 324 tmp = discovery.findcommonincoming(repo, other, heads=onlyheads, force=force)
324 325 common, incoming, rheads = tmp
325 326 if not incoming:
326 327 try:
327 328 if bundlename:
328 329 os.unlink(bundlename)
329 330 except OSError:
330 331 pass
331 332 return other, [], other.close
332 333
333 334 bundle = None
334 335 bundlerepo = None
335 336 localrepo = other
336 337 if bundlename or not other.local():
337 338 # create a bundle (uncompressed if other repo is not local)
338 339
339 340 if other.capable('getbundle'):
340 341 cg = other.getbundle('incoming', common=common, heads=rheads)
341 342 elif onlyheads is None and not other.capable('changegroupsubset'):
342 343 # compat with older servers when pulling all remote heads
343 344 cg = other.changegroup(incoming, "incoming")
344 345 rheads = None
345 346 else:
346 347 cg = other.changegroupsubset(incoming, rheads, 'incoming')
347 348 bundletype = other.local() and "HG10BZ" or "HG10UN"
348 349 fname = bundle = changegroup.writebundle(cg, bundlename, bundletype)
349 350 # keep written bundle?
350 351 if bundlename:
351 352 bundle = None
352 353 if not other.local():
353 354 # use the created uncompressed bundlerepo
354 355 localrepo = bundlerepo = bundlerepository(ui, repo.root, fname)
355 356 # this repo contains local and other now, so filter out local again
356 357 common = repo.heads()
357 358
358 359 csets = localrepo.changelog.findmissing(common, rheads)
359 360
360 361 def cleanup():
361 362 if bundlerepo:
362 363 bundlerepo.close()
363 364 if bundle:
364 365 os.unlink(bundle)
365 366 other.close()
366 367
367 368 return (localrepo, csets, cleanup)
368 369
@@ -1,1023 +1,1055
1 1 $ cat >> $HGRCPATH <<EOF
2 2 > [extensions]
3 3 > graphlog=
4 4 > EOF
5 5 $ hgph() { hg log -G --template "{rev} {phase} {desc} - {node|short}\n" $*; }
6 6
7 7 $ mkcommit() {
8 8 > echo "$1" > "$1"
9 9 > hg add "$1"
10 10 > message="$1"
11 11 > shift
12 12 > hg ci -m "$message" $*
13 13 > }
14 14
15 15 $ hg init alpha
16 16 $ cd alpha
17 17 $ mkcommit a-A
18 18 $ mkcommit a-B
19 19 $ mkcommit a-C
20 20 $ mkcommit a-D
21 21 $ hgph
22 22 @ 3 draft a-D - b555f63b6063
23 23 |
24 24 o 2 draft a-C - 54acac6f23ab
25 25 |
26 26 o 1 draft a-B - 548a3d25dbf0
27 27 |
28 28 o 0 draft a-A - 054250a37db4
29 29
30 30
31 31 $ hg init ../beta
32 32 $ hg push -r 1 ../beta
33 33 pushing to ../beta
34 34 searching for changes
35 35 adding changesets
36 36 adding manifests
37 37 adding file changes
38 38 added 2 changesets with 2 changes to 2 files
39 39 $ hgph
40 40 @ 3 draft a-D - b555f63b6063
41 41 |
42 42 o 2 draft a-C - 54acac6f23ab
43 43 |
44 44 o 1 public a-B - 548a3d25dbf0
45 45 |
46 46 o 0 public a-A - 054250a37db4
47 47
48 48
49 49 $ cd ../beta
50 50 $ hgph
51 51 o 1 public a-B - 548a3d25dbf0
52 52 |
53 53 o 0 public a-A - 054250a37db4
54 54
55 55 $ hg up -q
56 56 $ mkcommit b-A
57 57 $ hgph
58 58 @ 2 draft b-A - f54f1bb90ff3
59 59 |
60 60 o 1 public a-B - 548a3d25dbf0
61 61 |
62 62 o 0 public a-A - 054250a37db4
63 63
64 64 $ hg pull ../alpha
65 65 pulling from ../alpha
66 66 searching for changes
67 67 adding changesets
68 68 adding manifests
69 69 adding file changes
70 70 added 2 changesets with 2 changes to 2 files (+1 heads)
71 71 (run 'hg heads' to see heads, 'hg merge' to merge)
72 72 $ hgph
73 73 o 4 public a-D - b555f63b6063
74 74 |
75 75 o 3 public a-C - 54acac6f23ab
76 76 |
77 77 | @ 2 draft b-A - f54f1bb90ff3
78 78 |/
79 79 o 1 public a-B - 548a3d25dbf0
80 80 |
81 81 o 0 public a-A - 054250a37db4
82 82
83 83
84 84 pull did not updated ../alpha state.
85 85 push from alpha to beta should update phase even if nothing is transfered
86 86
87 87 $ cd ../alpha
88 88 $ hgph # not updated by remote pull
89 89 @ 3 draft a-D - b555f63b6063
90 90 |
91 91 o 2 draft a-C - 54acac6f23ab
92 92 |
93 93 o 1 public a-B - 548a3d25dbf0
94 94 |
95 95 o 0 public a-A - 054250a37db4
96 96
97 97 $ hg push ../beta
98 98 pushing to ../beta
99 99 searching for changes
100 100 no changes found
101 101 [1]
102 102 $ hgph
103 103 @ 3 public a-D - b555f63b6063
104 104 |
105 105 o 2 public a-C - 54acac6f23ab
106 106 |
107 107 o 1 public a-B - 548a3d25dbf0
108 108 |
109 109 o 0 public a-A - 054250a37db4
110 110
111 111
112 112 update must update phase of common changeset too
113 113
114 114 $ hg pull ../beta # getting b-A
115 115 pulling from ../beta
116 116 searching for changes
117 117 adding changesets
118 118 adding manifests
119 119 adding file changes
120 120 added 1 changesets with 1 changes to 1 files (+1 heads)
121 121 (run 'hg heads' to see heads, 'hg merge' to merge)
122 122
123 123 $ cd ../beta
124 124 $ hgph # not updated by remote pull
125 125 o 4 public a-D - b555f63b6063
126 126 |
127 127 o 3 public a-C - 54acac6f23ab
128 128 |
129 129 | @ 2 draft b-A - f54f1bb90ff3
130 130 |/
131 131 o 1 public a-B - 548a3d25dbf0
132 132 |
133 133 o 0 public a-A - 054250a37db4
134 134
135 135 $ hg pull ../alpha
136 136 pulling from ../alpha
137 137 searching for changes
138 138 no changes found
139 139 $ hgph
140 140 o 4 public a-D - b555f63b6063
141 141 |
142 142 o 3 public a-C - 54acac6f23ab
143 143 |
144 144 | @ 2 public b-A - f54f1bb90ff3
145 145 |/
146 146 o 1 public a-B - 548a3d25dbf0
147 147 |
148 148 o 0 public a-A - 054250a37db4
149 149
150 150
151 151 Publish configuration option
152 152 ----------------------------
153 153
154 154 Pull
155 155 ````
156 156
157 157 changegroup are added without phase movement
158 158
159 159 $ hg bundle -a ../base.bundle
160 160 5 changesets found
161 161 $ cd ..
162 162 $ hg init mu
163 163 $ cd mu
164 164 $ cat > .hg/hgrc << EOF
165 165 > [phases]
166 166 > publish=0
167 167 > EOF
168 168 $ hg unbundle ../base.bundle
169 169 adding changesets
170 170 adding manifests
171 171 adding file changes
172 172 added 5 changesets with 5 changes to 5 files (+1 heads)
173 173 (run 'hg heads' to see heads, 'hg merge' to merge)
174 174 $ hgph
175 175 o 4 draft a-D - b555f63b6063
176 176 |
177 177 o 3 draft a-C - 54acac6f23ab
178 178 |
179 179 | o 2 draft b-A - f54f1bb90ff3
180 180 |/
181 181 o 1 draft a-B - 548a3d25dbf0
182 182 |
183 183 o 0 draft a-A - 054250a37db4
184 184
185 185 $ cd ..
186 186
187 187 Pulling from publish=False to publish=False does not move boundary.
188 188
189 189 $ hg init nu
190 190 $ cd nu
191 191 $ cat > .hg/hgrc << EOF
192 192 > [phases]
193 193 > publish=0
194 194 > EOF
195 195 $ hg pull ../mu -r 54acac6f23ab
196 196 pulling from ../mu
197 197 adding changesets
198 198 adding manifests
199 199 adding file changes
200 200 added 3 changesets with 3 changes to 3 files
201 201 (run 'hg update' to get a working copy)
202 202 $ hgph
203 203 o 2 draft a-C - 54acac6f23ab
204 204 |
205 205 o 1 draft a-B - 548a3d25dbf0
206 206 |
207 207 o 0 draft a-A - 054250a37db4
208 208
209 209
210 210 Even for common
211 211
212 212 $ hg pull ../mu -r f54f1bb90ff3
213 213 pulling from ../mu
214 214 searching for changes
215 215 adding changesets
216 216 adding manifests
217 217 adding file changes
218 218 added 1 changesets with 1 changes to 1 files (+1 heads)
219 219 (run 'hg heads' to see heads, 'hg merge' to merge)
220 220 $ hgph
221 221 o 3 draft b-A - f54f1bb90ff3
222 222 |
223 223 | o 2 draft a-C - 54acac6f23ab
224 224 |/
225 225 o 1 draft a-B - 548a3d25dbf0
226 226 |
227 227 o 0 draft a-A - 054250a37db4
228 228
229 229
230 230
231 231 Pulling from Publish=True to Publish=False move boundary in common set.
232 232 we are in nu
233 233
234 234 $ hg pull ../alpha -r b555f63b6063
235 235 pulling from ../alpha
236 236 searching for changes
237 237 adding changesets
238 238 adding manifests
239 239 adding file changes
240 240 added 1 changesets with 1 changes to 1 files
241 241 (run 'hg update' to get a working copy)
242 242 $ hgph # f54f1bb90ff3 stay draft, not ancestor of -r
243 243 o 4 public a-D - b555f63b6063
244 244 |
245 245 | o 3 draft b-A - f54f1bb90ff3
246 246 | |
247 247 o | 2 public a-C - 54acac6f23ab
248 248 |/
249 249 o 1 public a-B - 548a3d25dbf0
250 250 |
251 251 o 0 public a-A - 054250a37db4
252 252
253 253
254 254 pulling from Publish=False to publish=False with some public
255 255
256 256 $ hg up -q f54f1bb90ff3
257 257 $ mkcommit n-A
258 258 $ mkcommit n-B
259 259 $ hgph
260 260 @ 6 draft n-B - 145e75495359
261 261 |
262 262 o 5 draft n-A - d6bcb4f74035
263 263 |
264 264 | o 4 public a-D - b555f63b6063
265 265 | |
266 266 o | 3 draft b-A - f54f1bb90ff3
267 267 | |
268 268 | o 2 public a-C - 54acac6f23ab
269 269 |/
270 270 o 1 public a-B - 548a3d25dbf0
271 271 |
272 272 o 0 public a-A - 054250a37db4
273 273
274 274 $ cd ../mu
275 275 $ hg pull ../nu
276 276 pulling from ../nu
277 277 searching for changes
278 278 adding changesets
279 279 adding manifests
280 280 adding file changes
281 281 added 2 changesets with 2 changes to 2 files
282 282 (run 'hg update' to get a working copy)
283 283 $ hgph
284 284 o 6 draft n-B - 145e75495359
285 285 |
286 286 o 5 draft n-A - d6bcb4f74035
287 287 |
288 288 | o 4 public a-D - b555f63b6063
289 289 | |
290 290 | o 3 public a-C - 54acac6f23ab
291 291 | |
292 292 o | 2 draft b-A - f54f1bb90ff3
293 293 |/
294 294 o 1 public a-B - 548a3d25dbf0
295 295 |
296 296 o 0 public a-A - 054250a37db4
297 297
298 298 $ cd ..
299 299
300 300 pulling into publish=True
301 301
302 302 $ cd alpha
303 303 $ hgph
304 304 o 4 public b-A - f54f1bb90ff3
305 305 |
306 306 | @ 3 public a-D - b555f63b6063
307 307 | |
308 308 | o 2 public a-C - 54acac6f23ab
309 309 |/
310 310 o 1 public a-B - 548a3d25dbf0
311 311 |
312 312 o 0 public a-A - 054250a37db4
313 313
314 314 $ hg pull ../mu
315 315 pulling from ../mu
316 316 searching for changes
317 317 adding changesets
318 318 adding manifests
319 319 adding file changes
320 320 added 2 changesets with 2 changes to 2 files
321 321 (run 'hg update' to get a working copy)
322 322 $ hgph
323 323 o 6 draft n-B - 145e75495359
324 324 |
325 325 o 5 draft n-A - d6bcb4f74035
326 326 |
327 327 o 4 public b-A - f54f1bb90ff3
328 328 |
329 329 | @ 3 public a-D - b555f63b6063
330 330 | |
331 331 | o 2 public a-C - 54acac6f23ab
332 332 |/
333 333 o 1 public a-B - 548a3d25dbf0
334 334 |
335 335 o 0 public a-A - 054250a37db4
336 336
337 337 $ cd ..
338 338
339 339 pulling back into original repo
340 340
341 341 $ cd nu
342 342 $ hg pull ../alpha
343 343 pulling from ../alpha
344 344 searching for changes
345 345 no changes found
346 346 $ hgph
347 347 @ 6 public n-B - 145e75495359
348 348 |
349 349 o 5 public n-A - d6bcb4f74035
350 350 |
351 351 | o 4 public a-D - b555f63b6063
352 352 | |
353 353 o | 3 public b-A - f54f1bb90ff3
354 354 | |
355 355 | o 2 public a-C - 54acac6f23ab
356 356 |/
357 357 o 1 public a-B - 548a3d25dbf0
358 358 |
359 359 o 0 public a-A - 054250a37db4
360 360
361 361
362 362 Push
363 363 ````
364 364
365 365 (inserted)
366 366
367 367 Test that phase are pushed even when they are nothing to pus
368 368 (this might be tested later bu are very convenient to not alter too much test)
369 369
370 370 Push back to alpha
371 371
372 372 $ hg push ../alpha # from nu
373 373 pushing to ../alpha
374 374 searching for changes
375 375 no changes found
376 376 [1]
377 377 $ cd ..
378 378 $ cd alpha
379 379 $ hgph
380 380 o 6 public n-B - 145e75495359
381 381 |
382 382 o 5 public n-A - d6bcb4f74035
383 383 |
384 384 o 4 public b-A - f54f1bb90ff3
385 385 |
386 386 | @ 3 public a-D - b555f63b6063
387 387 | |
388 388 | o 2 public a-C - 54acac6f23ab
389 389 |/
390 390 o 1 public a-B - 548a3d25dbf0
391 391 |
392 392 o 0 public a-A - 054250a37db4
393 393
394 394
395 395 (end insertion)
396 396
397 397
398 398 initial setup
399 399
400 400 $ hg glog # of alpha
401 401 o changeset: 6:145e75495359
402 402 | tag: tip
403 403 | user: test
404 404 | date: Thu Jan 01 00:00:00 1970 +0000
405 405 | summary: n-B
406 406 |
407 407 o changeset: 5:d6bcb4f74035
408 408 | user: test
409 409 | date: Thu Jan 01 00:00:00 1970 +0000
410 410 | summary: n-A
411 411 |
412 412 o changeset: 4:f54f1bb90ff3
413 413 | parent: 1:548a3d25dbf0
414 414 | user: test
415 415 | date: Thu Jan 01 00:00:00 1970 +0000
416 416 | summary: b-A
417 417 |
418 418 | @ changeset: 3:b555f63b6063
419 419 | | user: test
420 420 | | date: Thu Jan 01 00:00:00 1970 +0000
421 421 | | summary: a-D
422 422 | |
423 423 | o changeset: 2:54acac6f23ab
424 424 |/ user: test
425 425 | date: Thu Jan 01 00:00:00 1970 +0000
426 426 | summary: a-C
427 427 |
428 428 o changeset: 1:548a3d25dbf0
429 429 | user: test
430 430 | date: Thu Jan 01 00:00:00 1970 +0000
431 431 | summary: a-B
432 432 |
433 433 o changeset: 0:054250a37db4
434 434 user: test
435 435 date: Thu Jan 01 00:00:00 1970 +0000
436 436 summary: a-A
437 437
438 438 $ mkcommit a-E
439 439 $ mkcommit a-F
440 440 $ mkcommit a-G
441 441 $ hg up d6bcb4f74035 -q
442 442 $ mkcommit a-H
443 443 created new head
444 444 $ hgph
445 445 @ 10 draft a-H - 967b449fbc94
446 446 |
447 447 | o 9 draft a-G - 3e27b6f1eee1
448 448 | |
449 449 | o 8 draft a-F - b740e3e5c05d
450 450 | |
451 451 | o 7 draft a-E - e9f537e46dea
452 452 | |
453 453 +---o 6 public n-B - 145e75495359
454 454 | |
455 455 o | 5 public n-A - d6bcb4f74035
456 456 | |
457 457 o | 4 public b-A - f54f1bb90ff3
458 458 | |
459 459 | o 3 public a-D - b555f63b6063
460 460 | |
461 461 | o 2 public a-C - 54acac6f23ab
462 462 |/
463 463 o 1 public a-B - 548a3d25dbf0
464 464 |
465 465 o 0 public a-A - 054250a37db4
466 466
467 467
468 Pulling from bundle does not alter phases of changeset not present in the bundle
469
470 $ hg bundle --base 1 -r 6 -r 3 ../partial-bundle.hg
471 5 changesets found
472 $ hg pull ../partial-bundle.hg
473 pulling from ../partial-bundle.hg
474 searching for changes
475 no changes found
476 $ hgph
477 @ 10 draft a-H - 967b449fbc94
478 |
479 | o 9 draft a-G - 3e27b6f1eee1
480 | |
481 | o 8 draft a-F - b740e3e5c05d
482 | |
483 | o 7 draft a-E - e9f537e46dea
484 | |
485 +---o 6 public n-B - 145e75495359
486 | |
487 o | 5 public n-A - d6bcb4f74035
488 | |
489 o | 4 public b-A - f54f1bb90ff3
490 | |
491 | o 3 public a-D - b555f63b6063
492 | |
493 | o 2 public a-C - 54acac6f23ab
494 |/
495 o 1 public a-B - 548a3d25dbf0
496 |
497 o 0 public a-A - 054250a37db4
498
499
468 500 Pushing to Publish=False (unknown changeset)
469 501
470 502 $ hg push ../mu -r b740e3e5c05d # a-F
471 503 pushing to ../mu
472 504 searching for changes
473 505 adding changesets
474 506 adding manifests
475 507 adding file changes
476 508 added 2 changesets with 2 changes to 2 files
477 509 $ hgph
478 510 @ 10 draft a-H - 967b449fbc94
479 511 |
480 512 | o 9 draft a-G - 3e27b6f1eee1
481 513 | |
482 514 | o 8 draft a-F - b740e3e5c05d
483 515 | |
484 516 | o 7 draft a-E - e9f537e46dea
485 517 | |
486 518 +---o 6 public n-B - 145e75495359
487 519 | |
488 520 o | 5 public n-A - d6bcb4f74035
489 521 | |
490 522 o | 4 public b-A - f54f1bb90ff3
491 523 | |
492 524 | o 3 public a-D - b555f63b6063
493 525 | |
494 526 | o 2 public a-C - 54acac6f23ab
495 527 |/
496 528 o 1 public a-B - 548a3d25dbf0
497 529 |
498 530 o 0 public a-A - 054250a37db4
499 531
500 532
501 533 $ cd ../mu
502 534 $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
503 535 > # not ancestor of -r
504 536 o 8 draft a-F - b740e3e5c05d
505 537 |
506 538 o 7 draft a-E - e9f537e46dea
507 539 |
508 540 | o 6 draft n-B - 145e75495359
509 541 | |
510 542 | o 5 draft n-A - d6bcb4f74035
511 543 | |
512 544 o | 4 public a-D - b555f63b6063
513 545 | |
514 546 o | 3 public a-C - 54acac6f23ab
515 547 | |
516 548 | o 2 draft b-A - f54f1bb90ff3
517 549 |/
518 550 o 1 public a-B - 548a3d25dbf0
519 551 |
520 552 o 0 public a-A - 054250a37db4
521 553
522 554
523 555 Pushing to Publish=True (unknown changeset)
524 556
525 557 $ hg push ../beta -r b740e3e5c05d
526 558 pushing to ../beta
527 559 searching for changes
528 560 adding changesets
529 561 adding manifests
530 562 adding file changes
531 563 added 2 changesets with 2 changes to 2 files
532 564 $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
533 565 > # not ancestor of -r
534 566 o 8 public a-F - b740e3e5c05d
535 567 |
536 568 o 7 public a-E - e9f537e46dea
537 569 |
538 570 | o 6 draft n-B - 145e75495359
539 571 | |
540 572 | o 5 draft n-A - d6bcb4f74035
541 573 | |
542 574 o | 4 public a-D - b555f63b6063
543 575 | |
544 576 o | 3 public a-C - 54acac6f23ab
545 577 | |
546 578 | o 2 draft b-A - f54f1bb90ff3
547 579 |/
548 580 o 1 public a-B - 548a3d25dbf0
549 581 |
550 582 o 0 public a-A - 054250a37db4
551 583
552 584
553 585 Pushing to Publish=True (common changeset)
554 586
555 587 $ cd ../beta
556 588 $ hg push ../alpha
557 589 pushing to ../alpha
558 590 searching for changes
559 591 no changes found
560 592 [1]
561 593 $ hgph
562 594 o 6 public a-F - b740e3e5c05d
563 595 |
564 596 o 5 public a-E - e9f537e46dea
565 597 |
566 598 o 4 public a-D - b555f63b6063
567 599 |
568 600 o 3 public a-C - 54acac6f23ab
569 601 |
570 602 | @ 2 public b-A - f54f1bb90ff3
571 603 |/
572 604 o 1 public a-B - 548a3d25dbf0
573 605 |
574 606 o 0 public a-A - 054250a37db4
575 607
576 608 $ cd ../alpha
577 609 $ hgph
578 610 @ 10 draft a-H - 967b449fbc94
579 611 |
580 612 | o 9 draft a-G - 3e27b6f1eee1
581 613 | |
582 614 | o 8 public a-F - b740e3e5c05d
583 615 | |
584 616 | o 7 public a-E - e9f537e46dea
585 617 | |
586 618 +---o 6 public n-B - 145e75495359
587 619 | |
588 620 o | 5 public n-A - d6bcb4f74035
589 621 | |
590 622 o | 4 public b-A - f54f1bb90ff3
591 623 | |
592 624 | o 3 public a-D - b555f63b6063
593 625 | |
594 626 | o 2 public a-C - 54acac6f23ab
595 627 |/
596 628 o 1 public a-B - 548a3d25dbf0
597 629 |
598 630 o 0 public a-A - 054250a37db4
599 631
600 632
601 633 Pushing to Publish=False (common changeset that change phase + unknown one)
602 634
603 635 $ hg push ../mu -r 967b449fbc94 -f
604 636 pushing to ../mu
605 637 searching for changes
606 638 adding changesets
607 639 adding manifests
608 640 adding file changes
609 641 added 1 changesets with 1 changes to 1 files (+1 heads)
610 642 $ hgph
611 643 @ 10 draft a-H - 967b449fbc94
612 644 |
613 645 | o 9 draft a-G - 3e27b6f1eee1
614 646 | |
615 647 | o 8 public a-F - b740e3e5c05d
616 648 | |
617 649 | o 7 public a-E - e9f537e46dea
618 650 | |
619 651 +---o 6 public n-B - 145e75495359
620 652 | |
621 653 o | 5 public n-A - d6bcb4f74035
622 654 | |
623 655 o | 4 public b-A - f54f1bb90ff3
624 656 | |
625 657 | o 3 public a-D - b555f63b6063
626 658 | |
627 659 | o 2 public a-C - 54acac6f23ab
628 660 |/
629 661 o 1 public a-B - 548a3d25dbf0
630 662 |
631 663 o 0 public a-A - 054250a37db4
632 664
633 665 $ cd ../mu
634 666 $ hgph # d6bcb4f74035 should have changed phase
635 667 > # 145e75495359 is still draft. not ancestor of -r
636 668 o 9 draft a-H - 967b449fbc94
637 669 |
638 670 | o 8 public a-F - b740e3e5c05d
639 671 | |
640 672 | o 7 public a-E - e9f537e46dea
641 673 | |
642 674 +---o 6 draft n-B - 145e75495359
643 675 | |
644 676 o | 5 public n-A - d6bcb4f74035
645 677 | |
646 678 | o 4 public a-D - b555f63b6063
647 679 | |
648 680 | o 3 public a-C - 54acac6f23ab
649 681 | |
650 682 o | 2 public b-A - f54f1bb90ff3
651 683 |/
652 684 o 1 public a-B - 548a3d25dbf0
653 685 |
654 686 o 0 public a-A - 054250a37db4
655 687
656 688
657 689
658 690 Pushing to Publish=True (common changeset from publish=False)
659 691
660 692 (in mu)
661 693 $ hg push ../alpha
662 694 pushing to ../alpha
663 695 searching for changes
664 696 no changes found
665 697 [1]
666 698 $ hgph
667 699 o 9 public a-H - 967b449fbc94
668 700 |
669 701 | o 8 public a-F - b740e3e5c05d
670 702 | |
671 703 | o 7 public a-E - e9f537e46dea
672 704 | |
673 705 +---o 6 public n-B - 145e75495359
674 706 | |
675 707 o | 5 public n-A - d6bcb4f74035
676 708 | |
677 709 | o 4 public a-D - b555f63b6063
678 710 | |
679 711 | o 3 public a-C - 54acac6f23ab
680 712 | |
681 713 o | 2 public b-A - f54f1bb90ff3
682 714 |/
683 715 o 1 public a-B - 548a3d25dbf0
684 716 |
685 717 o 0 public a-A - 054250a37db4
686 718
687 719 $ hgph -R ../alpha # a-H should have been synced to 0
688 720 @ 10 public a-H - 967b449fbc94
689 721 |
690 722 | o 9 draft a-G - 3e27b6f1eee1
691 723 | |
692 724 | o 8 public a-F - b740e3e5c05d
693 725 | |
694 726 | o 7 public a-E - e9f537e46dea
695 727 | |
696 728 +---o 6 public n-B - 145e75495359
697 729 | |
698 730 o | 5 public n-A - d6bcb4f74035
699 731 | |
700 732 o | 4 public b-A - f54f1bb90ff3
701 733 | |
702 734 | o 3 public a-D - b555f63b6063
703 735 | |
704 736 | o 2 public a-C - 54acac6f23ab
705 737 |/
706 738 o 1 public a-B - 548a3d25dbf0
707 739 |
708 740 o 0 public a-A - 054250a37db4
709 741
710 742
711 743
712 744 Discovery locally secret changeset on a remote repository:
713 745
714 746 - should make it non-secret
715 747
716 748 $ cd ../alpha
717 749 $ mkcommit A-secret --config phases.new-commit=2
718 750 $ hgph
719 751 @ 11 secret A-secret - 435b5d83910c
720 752 |
721 753 o 10 public a-H - 967b449fbc94
722 754 |
723 755 | o 9 draft a-G - 3e27b6f1eee1
724 756 | |
725 757 | o 8 public a-F - b740e3e5c05d
726 758 | |
727 759 | o 7 public a-E - e9f537e46dea
728 760 | |
729 761 +---o 6 public n-B - 145e75495359
730 762 | |
731 763 o | 5 public n-A - d6bcb4f74035
732 764 | |
733 765 o | 4 public b-A - f54f1bb90ff3
734 766 | |
735 767 | o 3 public a-D - b555f63b6063
736 768 | |
737 769 | o 2 public a-C - 54acac6f23ab
738 770 |/
739 771 o 1 public a-B - 548a3d25dbf0
740 772 |
741 773 o 0 public a-A - 054250a37db4
742 774
743 775 $ hg bundle --base 'parents(.)' -r . ../secret-bundle.hg
744 776 1 changesets found
745 777 $ hg -R ../mu unbundle ../secret-bundle.hg
746 778 adding changesets
747 779 adding manifests
748 780 adding file changes
749 781 added 1 changesets with 1 changes to 1 files
750 782 (run 'hg update' to get a working copy)
751 783 $ hgph -R ../mu
752 784 o 10 draft A-secret - 435b5d83910c
753 785 |
754 786 o 9 public a-H - 967b449fbc94
755 787 |
756 788 | o 8 public a-F - b740e3e5c05d
757 789 | |
758 790 | o 7 public a-E - e9f537e46dea
759 791 | |
760 792 +---o 6 public n-B - 145e75495359
761 793 | |
762 794 o | 5 public n-A - d6bcb4f74035
763 795 | |
764 796 | o 4 public a-D - b555f63b6063
765 797 | |
766 798 | o 3 public a-C - 54acac6f23ab
767 799 | |
768 800 o | 2 public b-A - f54f1bb90ff3
769 801 |/
770 802 o 1 public a-B - 548a3d25dbf0
771 803 |
772 804 o 0 public a-A - 054250a37db4
773 805
774 806 $ hg pull ../mu
775 807 pulling from ../mu
776 808 searching for changes
777 809 no changes found
778 810 $ hgph
779 811 @ 11 draft A-secret - 435b5d83910c
780 812 |
781 813 o 10 public a-H - 967b449fbc94
782 814 |
783 815 | o 9 draft a-G - 3e27b6f1eee1
784 816 | |
785 817 | o 8 public a-F - b740e3e5c05d
786 818 | |
787 819 | o 7 public a-E - e9f537e46dea
788 820 | |
789 821 +---o 6 public n-B - 145e75495359
790 822 | |
791 823 o | 5 public n-A - d6bcb4f74035
792 824 | |
793 825 o | 4 public b-A - f54f1bb90ff3
794 826 | |
795 827 | o 3 public a-D - b555f63b6063
796 828 | |
797 829 | o 2 public a-C - 54acac6f23ab
798 830 |/
799 831 o 1 public a-B - 548a3d25dbf0
800 832 |
801 833 o 0 public a-A - 054250a37db4
802 834
803 835
804 836 pushing a locally public and draft changesets remotly secret should make them appear on the remote side
805 837
806 838 $ hg -R ../mu phase --secret --force 967b449fbc94
807 839 $ hg push -r 435b5d83910c ../mu
808 840 pushing to ../mu
809 841 searching for changes
810 842 adding changesets
811 843 adding manifests
812 844 adding file changes
813 845 added 0 changesets with 0 changes to 2 files
814 846 $ hgph -R ../mu
815 847 o 10 draft A-secret - 435b5d83910c
816 848 |
817 849 o 9 public a-H - 967b449fbc94
818 850 |
819 851 | o 8 public a-F - b740e3e5c05d
820 852 | |
821 853 | o 7 public a-E - e9f537e46dea
822 854 | |
823 855 +---o 6 public n-B - 145e75495359
824 856 | |
825 857 o | 5 public n-A - d6bcb4f74035
826 858 | |
827 859 | o 4 public a-D - b555f63b6063
828 860 | |
829 861 | o 3 public a-C - 54acac6f23ab
830 862 | |
831 863 o | 2 public b-A - f54f1bb90ff3
832 864 |/
833 865 o 1 public a-B - 548a3d25dbf0
834 866 |
835 867 o 0 public a-A - 054250a37db4
836 868
837 869
838 870 pull new changeset with common draft locally
839 871
840 872 $ hg up -q 967b449fbc94 # create a new root for draft
841 873 $ mkcommit 'alpha-more'
842 874 created new head
843 875 $ hg push -fr . ../mu
844 876 pushing to ../mu
845 877 searching for changes
846 878 adding changesets
847 879 adding manifests
848 880 adding file changes
849 881 added 1 changesets with 1 changes to 1 files (+1 heads)
850 882 $ cd ../mu
851 883 $ hg phase --secret --force 1c5cfd894796
852 884 $ hg up -q 435b5d83910c
853 885 $ mkcommit 'mu-more'
854 886 $ cd ../alpha
855 887 $ hg pull ../mu
856 888 pulling from ../mu
857 889 searching for changes
858 890 adding changesets
859 891 adding manifests
860 892 adding file changes
861 893 added 1 changesets with 1 changes to 1 files
862 894 (run 'hg update' to get a working copy)
863 895 $ hgph
864 896 o 13 draft mu-more - 5237fb433fc8
865 897 |
866 898 | @ 12 draft alpha-more - 1c5cfd894796
867 899 | |
868 900 o | 11 draft A-secret - 435b5d83910c
869 901 |/
870 902 o 10 public a-H - 967b449fbc94
871 903 |
872 904 | o 9 draft a-G - 3e27b6f1eee1
873 905 | |
874 906 | o 8 public a-F - b740e3e5c05d
875 907 | |
876 908 | o 7 public a-E - e9f537e46dea
877 909 | |
878 910 +---o 6 public n-B - 145e75495359
879 911 | |
880 912 o | 5 public n-A - d6bcb4f74035
881 913 | |
882 914 o | 4 public b-A - f54f1bb90ff3
883 915 | |
884 916 | o 3 public a-D - b555f63b6063
885 917 | |
886 918 | o 2 public a-C - 54acac6f23ab
887 919 |/
888 920 o 1 public a-B - 548a3d25dbf0
889 921 |
890 922 o 0 public a-A - 054250a37db4
891 923
892 924
893 925 Test that test are properly ignored on remote event when existing locally
894 926
895 927 $ cd ..
896 928 $ hg clone -qU -r b555f63b6063 -r f54f1bb90ff3 beta gamma
897 929
898 930 # pathological case are
899 931 #
900 932 # * secret remotely
901 933 # * known locally
902 934 # * repo have uncommon changeset
903 935
904 936 $ hg -R beta phase --secret --force f54f1bb90ff3
905 937 $ hg -R gamma phase --draft --force f54f1bb90ff3
906 938
907 939 $ cd gamma
908 940 $ hg pull ../beta
909 941 pulling from ../beta
910 942 searching for changes
911 943 adding changesets
912 944 adding manifests
913 945 adding file changes
914 946 added 2 changesets with 2 changes to 2 files
915 947 (run 'hg update' to get a working copy)
916 948 $ hg phase f54f1bb90ff3
917 949 2: draft
918 950
919 951 same over the wire
920 952
921 953 $ cd ../beta
922 954 $ hg serve -p $HGPORT -d --pid-file=../beta.pid -E ../beta-error.log
923 955 $ cat ../beta.pid >> $DAEMON_PIDS
924 956 $ cd ../gamma
925 957
926 958 $ hg pull http://localhost:$HGPORT/
927 959 pulling from http://localhost:$HGPORT/
928 960 searching for changes
929 961 no changes found
930 962 $ hg phase f54f1bb90ff3
931 963 2: draft
932 964
933 965 check that secret local on both side are not synced to public
934 966
935 967 $ hg push -r b555f63b6063 http://localhost:$HGPORT/
936 968 pushing to http://localhost:$HGPORT/
937 969 searching for changes
938 970 no changes found
939 971 [1]
940 972 $ hg phase f54f1bb90ff3
941 973 2: draft
942 974
943 975 put the changeset in the draft state again
944 976 (first test after this one expect to be able to copy)
945 977
946 978 $ cd ..
947 979
948 980
949 981 Test Clone behavior
950 982
951 983 A. Clone without secret changeset
952 984
953 985 1. cloning non-publishing repository
954 986 (Phase should be preserved)
955 987
956 988 # make sure there is no secret so we can use a copy clone
957 989
958 990 $ hg -R mu phase --draft 'secret()'
959 991
960 992 $ hg clone -U mu Tau
961 993 $ hgph -R Tau
962 994 o 12 draft mu-more - 5237fb433fc8
963 995 |
964 996 | o 11 draft alpha-more - 1c5cfd894796
965 997 | |
966 998 o | 10 draft A-secret - 435b5d83910c
967 999 |/
968 1000 o 9 public a-H - 967b449fbc94
969 1001 |
970 1002 | o 8 public a-F - b740e3e5c05d
971 1003 | |
972 1004 | o 7 public a-E - e9f537e46dea
973 1005 | |
974 1006 +---o 6 public n-B - 145e75495359
975 1007 | |
976 1008 o | 5 public n-A - d6bcb4f74035
977 1009 | |
978 1010 | o 4 public a-D - b555f63b6063
979 1011 | |
980 1012 | o 3 public a-C - 54acac6f23ab
981 1013 | |
982 1014 o | 2 public b-A - f54f1bb90ff3
983 1015 |/
984 1016 o 1 public a-B - 548a3d25dbf0
985 1017 |
986 1018 o 0 public a-A - 054250a37db4
987 1019
988 1020
989 1021 2. cloning publishing repository
990 1022
991 1023 (everything should be public)
992 1024
993 1025 $ hg clone -U alpha Upsilon
994 1026 $ hgph -R Upsilon
995 1027 o 13 public mu-more - 5237fb433fc8
996 1028 |
997 1029 | o 12 public alpha-more - 1c5cfd894796
998 1030 | |
999 1031 o | 11 public A-secret - 435b5d83910c
1000 1032 |/
1001 1033 o 10 public a-H - 967b449fbc94
1002 1034 |
1003 1035 | o 9 public a-G - 3e27b6f1eee1
1004 1036 | |
1005 1037 | o 8 public a-F - b740e3e5c05d
1006 1038 | |
1007 1039 | o 7 public a-E - e9f537e46dea
1008 1040 | |
1009 1041 +---o 6 public n-B - 145e75495359
1010 1042 | |
1011 1043 o | 5 public n-A - d6bcb4f74035
1012 1044 | |
1013 1045 o | 4 public b-A - f54f1bb90ff3
1014 1046 | |
1015 1047 | o 3 public a-D - b555f63b6063
1016 1048 | |
1017 1049 | o 2 public a-C - 54acac6f23ab
1018 1050 |/
1019 1051 o 1 public a-B - 548a3d25dbf0
1020 1052 |
1021 1053 o 0 public a-A - 054250a37db4
1022 1054
1023 1055
General Comments 0
You need to be logged in to leave comments. Login now