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