##// END OF EJS Templates
subrepo: change default path in hgrc of subrepo after cloning...
Saint Germain -
r10378:e1401c74 default
parent child Browse files
Show More
@@ -1,360 +1,361
1 1 # subrepo.py - sub-repository handling for Mercurial
2 2 #
3 3 # Copyright 2009-2010 Matt Mackall <mpm@selenic.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 import errno, os, re, xml.dom.minidom, shutil
9 9 from i18n import _
10 10 import config, util, node, error
11 11 hg = None
12 12
13 13 nullstate = ('', '', 'empty')
14 14
15 15 def state(ctx):
16 16 p = config.config()
17 17 def read(f, sections=None, remap=None):
18 18 if f in ctx:
19 19 p.parse(f, ctx[f].data(), sections, remap, read)
20 20 else:
21 21 raise util.Abort(_("subrepo spec file %s not found") % f)
22 22
23 23 if '.hgsub' in ctx:
24 24 read('.hgsub')
25 25
26 26 rev = {}
27 27 if '.hgsubstate' in ctx:
28 28 try:
29 29 for l in ctx['.hgsubstate'].data().splitlines():
30 30 revision, path = l.split(" ", 1)
31 31 rev[path] = revision
32 32 except IOError, err:
33 33 if err.errno != errno.ENOENT:
34 34 raise
35 35
36 36 state = {}
37 37 for path, src in p[''].items():
38 38 kind = 'hg'
39 39 if src.startswith('['):
40 40 if ']' not in src:
41 41 raise util.Abort(_('missing ] in subrepo source'))
42 42 kind, src = src.split(']', 1)
43 43 kind = kind[1:]
44 44 state[path] = (src, rev.get(path, ''), kind)
45 45
46 46 return state
47 47
48 48 def writestate(repo, state):
49 49 repo.wwrite('.hgsubstate',
50 50 ''.join(['%s %s\n' % (state[s][1], s)
51 51 for s in sorted(state)]), '')
52 52
53 53 def submerge(repo, wctx, mctx, actx):
54 54 # working context, merging context, ancestor context
55 55 if mctx == actx: # backwards?
56 56 actx = wctx.p1()
57 57 s1 = wctx.substate
58 58 s2 = mctx.substate
59 59 sa = actx.substate
60 60 sm = {}
61 61
62 62 repo.ui.debug("subrepo merge %s %s %s\n" % (wctx, mctx, actx))
63 63
64 64 def debug(s, msg, r=""):
65 65 if r:
66 66 r = "%s:%s:%s" % r
67 67 repo.ui.debug(" subrepo %s: %s %s\n" % (s, msg, r))
68 68
69 69 for s, l in s1.items():
70 70 if wctx != actx and wctx.sub(s).dirty():
71 71 l = (l[0], l[1] + "+")
72 72 a = sa.get(s, nullstate)
73 73 if s in s2:
74 74 r = s2[s]
75 75 if l == r or r == a: # no change or local is newer
76 76 sm[s] = l
77 77 continue
78 78 elif l == a: # other side changed
79 79 debug(s, "other changed, get", r)
80 80 wctx.sub(s).get(r)
81 81 sm[s] = r
82 82 elif l[0] != r[0]: # sources differ
83 83 if repo.ui.promptchoice(
84 84 _(' subrepository sources for %s differ\n'
85 85 'use (l)ocal source (%s) or (r)emote source (%s)?')
86 86 % (s, l[0], r[0]),
87 87 (_('&Local'), _('&Remote')), 0):
88 88 debug(s, "prompt changed, get", r)
89 89 wctx.sub(s).get(r)
90 90 sm[s] = r
91 91 elif l[1] == a[1]: # local side is unchanged
92 92 debug(s, "other side changed, get", r)
93 93 wctx.sub(s).get(r)
94 94 sm[s] = r
95 95 else:
96 96 debug(s, "both sides changed, merge with", r)
97 97 wctx.sub(s).merge(r)
98 98 sm[s] = l
99 99 elif l == a: # remote removed, local unchanged
100 100 debug(s, "remote removed, remove")
101 101 wctx.sub(s).remove()
102 102 else:
103 103 if repo.ui.promptchoice(
104 104 _(' local changed subrepository %s which remote removed\n'
105 105 'use (c)hanged version or (d)elete?') % s,
106 106 (_('&Changed'), _('&Delete')), 0):
107 107 debug(s, "prompt remove")
108 108 wctx.sub(s).remove()
109 109
110 110 for s, r in s2.items():
111 111 if s in s1:
112 112 continue
113 113 elif s not in sa:
114 114 debug(s, "remote added, get", r)
115 115 mctx.sub(s).get(r)
116 116 sm[s] = r
117 117 elif r != sa[s]:
118 118 if repo.ui.promptchoice(
119 119 _(' remote changed subrepository %s which local removed\n'
120 120 'use (c)hanged version or (d)elete?') % s,
121 121 (_('&Changed'), _('&Delete')), 0) == 0:
122 122 debug(s, "prompt recreate", r)
123 123 wctx.sub(s).get(r)
124 124 sm[s] = r
125 125
126 126 # record merged .hgsubstate
127 127 writestate(repo, sm)
128 128
129 129 def _abssource(repo, push=False):
130 130 if hasattr(repo, '_subparent'):
131 131 source = repo._subsource
132 132 if source.startswith('/') or '://' in source:
133 133 return source
134 134 parent = _abssource(repo._subparent)
135 135 if '://' in parent:
136 136 if parent[-1] == '/':
137 137 parent = parent[:-1]
138 138 return parent + '/' + source
139 139 return os.path.join(parent, repo._subsource)
140 140 if push and repo.ui.config('paths', 'default-push'):
141 141 return repo.ui.config('paths', 'default-push', repo.root)
142 142 return repo.ui.config('paths', 'default', repo.root)
143 143
144 144 def subrepo(ctx, path):
145 145 # subrepo inherently violates our import layering rules
146 146 # because it wants to make repo objects from deep inside the stack
147 147 # so we manually delay the circular imports to not break
148 148 # scripts that don't use our demand-loading
149 149 global hg
150 150 import hg as h
151 151 hg = h
152 152
153 153 util.path_auditor(ctx._repo.root)(path)
154 154 state = ctx.substate.get(path, nullstate)
155 155 if state[2] not in types:
156 156 raise util.Abort(_('unknown subrepo type %s') % state[2])
157 157 return types[state[2]](ctx, path, state[:2])
158 158
159 159 # subrepo classes need to implement the following methods:
160 160 # __init__(self, ctx, path, state)
161 161 # dirty(self): returns true if the dirstate of the subrepo
162 162 # does not match current stored state
163 163 # commit(self, text, user, date): commit the current changes
164 164 # to the subrepo with the given log message. Use given
165 165 # user and date if possible. Return the new state of the subrepo.
166 166 # remove(self): remove the subrepo (should verify the dirstate
167 167 # is not dirty first)
168 168 # get(self, state): run whatever commands are needed to put the
169 169 # subrepo into this state
170 170 # merge(self, state): merge currently-saved state with the new state.
171 171 # push(self, force): perform whatever action is analagous to 'hg push'
172 172 # This may be a no-op on some systems.
173 173
174 174 class hgsubrepo(object):
175 175 def __init__(self, ctx, path, state):
176 176 self._path = path
177 177 self._state = state
178 178 r = ctx._repo
179 179 root = r.wjoin(path)
180 180 if os.path.exists(os.path.join(root, '.hg')):
181 181 self._repo = hg.repository(r.ui, root)
182 182 else:
183 183 util.makedirs(root)
184 184 self._repo = hg.repository(r.ui, root, create=True)
185 185 f = file(os.path.join(root, '.hg', 'hgrc'), 'w')
186 f.write('[paths]\ndefault = %s\n' % state[0])
186 f.write('[paths]\ndefault = %s\n' % os.path.join(
187 _abssource(ctx._repo), path))
187 188 f.close()
188 189 self._repo._subparent = r
189 190 self._repo._subsource = state[0]
190 191
191 192 def dirty(self):
192 193 r = self._state[1]
193 194 if r == '':
194 195 return True
195 196 w = self._repo[None]
196 197 if w.p1() != self._repo[r]: # version checked out changed
197 198 return True
198 199 return w.dirty() # working directory changed
199 200
200 201 def commit(self, text, user, date):
201 202 self._repo.ui.debug("committing subrepo %s\n" % self._path)
202 203 n = self._repo.commit(text, user, date)
203 204 if not n:
204 205 return self._repo['.'].hex() # different version checked out
205 206 return node.hex(n)
206 207
207 208 def remove(self):
208 209 # we can't fully delete the repository as it may contain
209 210 # local-only history
210 211 self._repo.ui.note(_('removing subrepo %s\n') % self._path)
211 212 hg.clean(self._repo, node.nullid, False)
212 213
213 214 def _get(self, state):
214 215 source, revision, kind = state
215 216 try:
216 217 self._repo.lookup(revision)
217 218 except error.RepoError:
218 219 self._repo._subsource = source
219 220 self._repo.ui.status(_('pulling subrepo %s\n') % self._path)
220 221 srcurl = _abssource(self._repo)
221 222 other = hg.repository(self._repo.ui, srcurl)
222 223 self._repo.pull(other)
223 224
224 225 def get(self, state):
225 226 self._get(state)
226 227 source, revision, kind = state
227 228 self._repo.ui.debug("getting subrepo %s\n" % self._path)
228 229 hg.clean(self._repo, revision, False)
229 230
230 231 def merge(self, state):
231 232 self._get(state)
232 233 cur = self._repo['.']
233 234 dst = self._repo[state[1]]
234 235 anc = dst.ancestor(cur)
235 236 if anc == cur:
236 237 self._repo.ui.debug("updating subrepo %s\n" % self._path)
237 238 hg.update(self._repo, state[1])
238 239 elif anc == dst:
239 240 self._repo.ui.debug("skipping subrepo %s\n" % self._path)
240 241 else:
241 242 self._repo.ui.debug("merging subrepo %s\n" % self._path)
242 243 hg.merge(self._repo, state[1], remind=False)
243 244
244 245 def push(self, force):
245 246 # push subrepos depth-first for coherent ordering
246 247 c = self._repo['']
247 248 subs = c.substate # only repos that are committed
248 249 for s in sorted(subs):
249 250 c.sub(s).push(force)
250 251
251 252 self._repo.ui.status(_('pushing subrepo %s\n') % self._path)
252 253 dsturl = _abssource(self._repo, True)
253 254 other = hg.repository(self._repo.ui, dsturl)
254 255 self._repo.push(other, force)
255 256
256 257 class svnsubrepo(object):
257 258 def __init__(self, ctx, path, state):
258 259 self._path = path
259 260 self._state = state
260 261 self._ctx = ctx
261 262 self._ui = ctx._repo.ui
262 263
263 264 def _svncommand(self, commands):
264 265 cmd = ['svn'] + commands + [self._path]
265 266 cmd = [util.shellquote(arg) for arg in cmd]
266 267 cmd = util.quotecommand(' '.join(cmd))
267 268 env = dict(os.environ)
268 269 # Avoid localized output, preserve current locale for everything else.
269 270 env['LC_MESSAGES'] = 'C'
270 271 write, read, err = util.popen3(cmd, env=env, newlines=True)
271 272 retdata = read.read()
272 273 err = err.read().strip()
273 274 if err:
274 275 raise util.Abort(err)
275 276 return retdata
276 277
277 278 def _wcrev(self):
278 279 output = self._svncommand(['info', '--xml'])
279 280 doc = xml.dom.minidom.parseString(output)
280 281 entries = doc.getElementsByTagName('entry')
281 282 if not entries:
282 283 return 0
283 284 return int(entries[0].getAttribute('revision') or 0)
284 285
285 286 def _wcchanged(self):
286 287 """Return (changes, extchanges) where changes is True
287 288 if the working directory was changed, and extchanges is
288 289 True if any of these changes concern an external entry.
289 290 """
290 291 output = self._svncommand(['status', '--xml'])
291 292 externals, changes = [], []
292 293 doc = xml.dom.minidom.parseString(output)
293 294 for e in doc.getElementsByTagName('entry'):
294 295 s = e.getElementsByTagName('wc-status')
295 296 if not s:
296 297 continue
297 298 item = s[0].getAttribute('item')
298 299 props = s[0].getAttribute('props')
299 300 path = e.getAttribute('path')
300 301 if item == 'external':
301 302 externals.append(path)
302 303 if (item not in ('', 'normal', 'unversioned', 'external')
303 304 or props not in ('', 'none')):
304 305 changes.append(path)
305 306 for path in changes:
306 307 for ext in externals:
307 308 if path == ext or path.startswith(ext + os.sep):
308 309 return True, True
309 310 return bool(changes), False
310 311
311 312 def dirty(self):
312 313 if self._wcrev() == self._state[1] and not self._wcchanged()[0]:
313 314 return False
314 315 return True
315 316
316 317 def commit(self, text, user, date):
317 318 # user and date are out of our hands since svn is centralized
318 319 changed, extchanged = self._wcchanged()
319 320 if not changed:
320 321 return self._wcrev()
321 322 if extchanged:
322 323 # Do not try to commit externals
323 324 raise util.Abort(_('cannot commit svn externals'))
324 325 commitinfo = self._svncommand(['commit', '-m', text])
325 326 self._ui.status(commitinfo)
326 327 newrev = re.search('Committed revision ([\d]+).', commitinfo)
327 328 if not newrev:
328 329 raise util.Abort(commitinfo.splitlines()[-1])
329 330 newrev = newrev.groups()[0]
330 331 self._ui.status(self._svncommand(['update', '-r', newrev]))
331 332 return newrev
332 333
333 334 def remove(self):
334 335 if self.dirty():
335 336 self._ui.warn(_('not removing repo %s because '
336 337 'it has changes.\n' % self._path))
337 338 return
338 339 self._ui.note('removing subrepo %s\n' % self._path)
339 340 shutil.rmtree(self._ctx.repo.join(self._path))
340 341
341 342 def get(self, state):
342 343 status = self._svncommand(['checkout', state[0], '--revision', state[1]])
343 344 if not re.search('Checked out revision [\d]+.', status):
344 345 raise util.Abort(status.splitlines()[-1])
345 346 self._ui.status(status)
346 347
347 348 def merge(self, state):
348 349 old = int(self._state[1])
349 350 new = int(state[1])
350 351 if new > old:
351 352 self.get(state)
352 353
353 354 def push(self, force):
354 355 # nothing for svn
355 356 pass
356 357
357 358 types = {
358 359 'hg': hgsubrepo,
359 360 'svn': svnsubrepo,
360 361 }
@@ -1,164 +1,186
1 1 #!/bin/sh
2 2
3 3 rm -rf sub
4 4 mkdir sub
5 5 cd sub
6 6 hg init t
7 7 cd t
8 8
9 9 echo % first revision, no sub
10 10 echo a > a
11 11 hg ci -Am0
12 12
13 13 echo % add first sub
14 14 echo s = s > .hgsub
15 15 hg add .hgsub
16 16 hg init s
17 17 echo a > s/a
18 18 hg -R s ci -Ams0
19 19 hg ci -m1
20 20
21 21 echo % add sub sub
22 22 echo ss = ss > s/.hgsub
23 23 hg init s/ss
24 24 echo a > s/ss/a
25 25 hg -R s add s/.hgsub
26 26 hg -R s/ss add s/ss/a
27 27 hg ci -m2
28 28
29 29 echo % bump sub rev
30 30 echo b > s/a
31 31 hg -R s ci -ms1
32 32 hg ci -m3
33 33
34 34 echo % leave sub dirty
35 35 echo c > s/a
36 36 hg ci -m4
37 37 hg tip -R s
38 38
39 39 echo % check caching
40 40 hg co 0
41 41 hg debugsub
42 42 echo % restore
43 43 hg co
44 44 hg debugsub
45 45
46 46 echo % new branch for merge tests
47 47 hg co 1
48 48 echo t = t >> .hgsub
49 49 hg init t
50 50 echo t > t/t
51 51 hg -R t add t
52 52 echo % 5
53 53 hg ci -m5 # add sub
54 54 echo t2 > t/t
55 55 echo % 6
56 56 hg st -R s
57 57 hg ci -m6 # change sub
58 58 hg debugsub
59 59 echo t3 > t/t
60 60 echo % 7
61 61 hg ci -m7 # change sub again for conflict test
62 62 hg rm .hgsub
63 63 echo % 8
64 64 hg ci -m8 # remove sub
65 65
66 66 echo % merge tests
67 67 hg co -C 3
68 68 hg merge 5 # test adding
69 69 hg debugsub
70 70 hg ci -m9
71 71 hg merge 6 --debug # test change
72 72 hg debugsub
73 73 echo conflict > t/t
74 74 hg ci -m10
75 75 HGMERGE=internal:merge hg merge --debug 7 # test conflict
76 76 echo % should conflict
77 77 cat t/t
78 78
79 79 echo % clone
80 80 cd ..
81 81 hg clone t tc
82 82 cd tc
83 83 hg debugsub
84 84
85 85 echo % push
86 86 echo bah > t/t
87 87 hg ci -m11
88 88 hg push | sed 's/ .*sub/ ...sub/g'
89 89
90 90 echo % push -f
91 91 echo bah > s/a
92 92 hg ci -m12
93 93 hg push | sed 's/ .*sub/ ...sub/g'
94 94 hg push -f | sed 's/ .*sub/ ...sub/g'
95 95
96 96 echo % update
97 97 cd ../t
98 98 hg up -C # discard our earlier merge
99 99 echo blah > t/t
100 100 hg ci -m13
101 101
102 102 echo % pull
103 103 cd ../tc
104 104 hg pull | sed 's/ .*sub/ ...sub/g'
105 105 hg up # should pull t
106 106 cat t/t
107 107
108 108 echo % bogus subrepo path aborts
109 109 echo 'bogus=[boguspath' >> .hgsub
110 110 hg ci -m 'bogus subrepo path'
111 111
112 112 echo % issue 1986
113 113 cd ..
114 114 rm -rf sub
115 115 hg init main
116 116 cd main
117 117
118 118 hg init s # subrepo layout
119 119 cd s #
120 120 echo a > a # o 5 br
121 121 hg ci -Am1 # /|
122 122 hg branch br # o | 4 default
123 123 echo a >> a # | |
124 124 hg ci -m1 # | o 3 br
125 125 hg up default # |/|
126 126 echo b > b # o | 2 default
127 127 hg ci -Am1 # | |
128 128 hg up br # | o 1 br
129 129 hg merge tip # |/
130 130 hg ci -m1 # o 0 default
131 131 hg up 2
132 132 echo c > c
133 133 hg ci -Am1
134 134 hg up 3
135 135 hg merge 4
136 136 hg ci -m1
137 137
138 138 cd .. # main repo layout:
139 139 echo 's = s' > .hgsub #
140 140 hg -R s up 2 # * <-- try to merge default into br again
141 141 hg ci -Am1 # .`|
142 142 hg branch br # . o 5 br --> substate = 5
143 143 echo b > b # . |
144 144 hg -R s up 3 # o | 4 default --> substate = 4
145 145 hg ci -Am1 # | |
146 146 hg up default # | o 3 br --> substate = 2
147 147 echo c > c # |/|
148 148 hg ci -Am1 # o | 2 default --> substate = 2
149 149 hg up 1 # | |
150 150 hg merge 2 # | o 1 br --> substate = 3
151 151 hg ci -m1 # |/
152 152 hg up 2 # o 0 default --> substate = 2
153 153 hg -R s up 4
154 154 echo d > d
155 155 hg ci -Am1
156 156 hg up 3
157 157 hg -R s up 5
158 158 echo e > e
159 159 hg ci -Am1
160 160
161 161 hg up 5
162 162 hg merge 4 # try to merge default into br again
163 cd ..
164
165 echo % test repository cloning
166 mkdir mercurial mercurial2
167 hg init nested_absolute
168 echo test > nested_absolute/foo
169 hg -R nested_absolute add
170 hg -R nested_absolute ci -mtest
171 cd mercurial
172 hg init nested_relative
173 echo test2 > nested_relative/foo2
174 hg -R nested_relative add
175 hg -R nested_relative ci -mtest2
176 hg init main
177 echo nested_relative = ../nested_relative > main/.hgsub
178 echo nested_absolute = $PWD/nested_absolute >> main/.hgsub
179 hg -R main add
180 hg -R main ci -m "add subrepos"
181 cd ..
182 hg clone mercurial/main mercurial2/main
183 cat mercurial2/main/nested_absolute/.hg/hgrc mercurial2/main/nested_relative/.hg/hgrc | sed "s:${PWD}:/tmp:"
184 rm -rf mercurial mercurial2
163 185
164 186 exit 0
@@ -1,245 +1,257
1 1 % first revision, no sub
2 2 adding a
3 3 % add first sub
4 4 adding a
5 5 committing subrepository s
6 6 % add sub sub
7 7 committing subrepository s
8 8 committing subrepository ss
9 9 % bump sub rev
10 10 committing subrepository s
11 11 % leave sub dirty
12 12 committing subrepository s
13 13 changeset: 3:1c833a7a9e3a
14 14 tag: tip
15 15 user: test
16 16 date: Thu Jan 01 00:00:00 1970 +0000
17 17 summary: 4
18 18
19 19 % check caching
20 20 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
21 21 % restore
22 22 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
23 23 path s
24 24 source s
25 25 revision 1c833a7a9e3a4445c711aaf0f012379cd0d4034e
26 26 % new branch for merge tests
27 27 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
28 28 adding t/t
29 29 % 5
30 30 committing subrepository t
31 31 created new head
32 32 % 6
33 33 committing subrepository t
34 34 path s
35 35 source s
36 36 revision e4ece1bf43360ddc8f6a96432201a37b7cd27ae4
37 37 path t
38 38 source t
39 39 revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
40 40 % 7
41 41 committing subrepository t
42 42 % 8
43 43 % merge tests
44 44 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
45 45 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
46 46 (branch merge, don't forget to commit)
47 47 path s
48 48 source s
49 49 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
50 50 path t
51 51 source t
52 52 revision 60ca1237c19474e7a3978b0dc1ca4e6f36d51382
53 53 created new head
54 54 searching for copies back to rev 2
55 55 resolving manifests
56 56 overwrite None partial False
57 57 ancestor 1f14a2e2d3ec local f0d2028bf86d+ remote 1831e14459c4
58 58 .hgsubstate: versions differ -> m
59 59 subrepo merge f0d2028bf86d+ 1831e14459c4 1f14a2e2d3ec
60 60 subrepo t: other changed, get t:6747d179aa9a688023c4b0cad32e4c92bb7f34ad:hg
61 61 getting subrepo t
62 62 resolving manifests
63 63 overwrite True partial False
64 64 ancestor 60ca1237c194+ local 60ca1237c194+ remote 6747d179aa9a
65 65 t: remote is newer -> g
66 66 getting t
67 67 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
68 68 (branch merge, don't forget to commit)
69 69 path s
70 70 source s
71 71 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
72 72 path t
73 73 source t
74 74 revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
75 75 committing subrepository t
76 76 searching for copies back to rev 2
77 77 resolving manifests
78 78 overwrite None partial False
79 79 ancestor 1831e14459c4 local e45c8b14af55+ remote f94576341bcf
80 80 .hgsubstate: versions differ -> m
81 81 subrepo merge e45c8b14af55+ f94576341bcf 1831e14459c4
82 82 subrepo t: both sides changed, merge with t:7af322bc1198a32402fe903e0b7ebcfc5c9bf8f4:hg
83 83 merging subrepo t
84 84 searching for copies back to rev 2
85 85 resolving manifests
86 86 overwrite None partial False
87 87 ancestor 6747d179aa9a local 20a0db6fbf6c+ remote 7af322bc1198
88 88 t: versions differ -> m
89 89 preserving t for resolve of t
90 90 picked tool 'internal:merge' for t (binary False symlink False)
91 91 merging t
92 92 my t@20a0db6fbf6c+ other t@7af322bc1198 ancestor t@6747d179aa9a
93 93 warning: conflicts during merge.
94 94 merging t failed!
95 95 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
96 96 use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon
97 97 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
98 98 (branch merge, don't forget to commit)
99 99 % should conflict
100 100 <<<<<<< local
101 101 conflict
102 102 =======
103 103 t3
104 104 >>>>>>> other
105 105 % clone
106 106 updating to branch default
107 107 pulling subrepo s
108 108 requesting all changes
109 109 adding changesets
110 110 adding manifests
111 111 adding file changes
112 112 added 4 changesets with 5 changes to 3 files
113 113 pulling subrepo ss
114 114 requesting all changes
115 115 adding changesets
116 116 adding manifests
117 117 adding file changes
118 118 added 1 changesets with 1 changes to 1 files
119 119 pulling subrepo t
120 120 requesting all changes
121 121 adding changesets
122 122 adding manifests
123 123 adding file changes
124 124 added 4 changesets with 4 changes to 1 files (+1 heads)
125 125 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
126 126 path s
127 127 source s
128 128 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
129 129 path t
130 130 source t
131 131 revision 20a0db6fbf6c3d2836e6519a642ae929bfc67c0e
132 132 % push
133 133 committing subrepository t
134 134 pushing ...sub/t
135 135 pushing ...subrepo ss
136 136 searching for changes
137 137 no changes found
138 138 pushing ...subrepo s
139 139 searching for changes
140 140 no changes found
141 141 pushing ...subrepo t
142 142 searching for changes
143 143 adding changesets
144 144 adding manifests
145 145 adding file changes
146 146 added 1 changesets with 1 changes to 1 files
147 147 searching for changes
148 148 adding changesets
149 149 adding manifests
150 150 adding file changes
151 151 added 1 changesets with 1 changes to 1 files
152 152 % push -f
153 153 committing subrepository s
154 154 abort: push creates new remote heads!
155 155 pushing ...sub/t
156 156 pushing ...subrepo ss
157 157 searching for changes
158 158 no changes found
159 159 pushing ...subrepo s
160 160 searching for changes
161 161 (did you forget to merge? use push -f to force)
162 162 pushing ...subrepo t
163 163 searching for changes
164 164 no changes found
165 165 searching for changes
166 166 adding changesets
167 167 adding manifests
168 168 adding file changes
169 169 added 1 changesets with 1 changes to 1 files
170 170 pushing ...sub/t
171 171 pushing ...subrepo ss
172 172 searching for changes
173 173 no changes found
174 174 pushing ...subrepo s
175 175 searching for changes
176 176 adding changesets
177 177 adding manifests
178 178 adding file changes
179 179 added 1 changesets with 1 changes to 1 files (+1 heads)
180 180 pushing ...subrepo t
181 181 searching for changes
182 182 no changes found
183 183 searching for changes
184 184 no changes found
185 185 % update
186 186 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
187 187 committing subrepository t
188 188 % pull
189 189 pulling ...sub/t
190 190 searching for changes
191 191 adding changesets
192 192 adding manifests
193 193 adding file changes
194 194 added 1 changesets with 1 changes to 1 files
195 195 (run 'hg update' to get a working copy)
196 196 pulling subrepo t
197 197 searching for changes
198 198 adding changesets
199 199 adding manifests
200 200 adding file changes
201 201 added 1 changesets with 1 changes to 1 files
202 202 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
203 203 blah
204 204 % bogus subrepo path aborts
205 205 abort: missing ] in subrepo source
206 206 % issue 1986
207 207 adding a
208 208 marked working directory as branch br
209 209 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
210 210 adding b
211 211 created new head
212 212 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
213 213 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
214 214 (branch merge, don't forget to commit)
215 215 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
216 216 adding c
217 217 created new head
218 218 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
219 219 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
220 220 (branch merge, don't forget to commit)
221 221 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
222 222 adding .hgsub
223 223 committing subrepository s
224 224 marked working directory as branch br
225 225 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
226 226 adding b
227 227 committing subrepository s
228 228 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
229 229 adding c
230 230 created new head
231 231 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
232 232 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
233 233 (branch merge, don't forget to commit)
234 234 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
235 235 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
236 236 adding d
237 237 committing subrepository s
238 238 created new head
239 239 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
240 240 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
241 241 adding e
242 242 committing subrepository s
243 243 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
244 244 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
245 245 (branch merge, don't forget to commit)
246 % test repository cloning
247 adding nested_absolute/foo
248 adding nested_relative/foo2
249 adding main/.hgsub
250 committing subrepository nested_relative
251 committing subrepository nested_absolute
252 updating to branch default
253 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
254 [paths]
255 default = /tmp/mercurial/main/nested_absolute
256 [paths]
257 default = /tmp/mercurial/main/nested_relative
General Comments 0
You need to be logged in to leave comments. Login now