##// END OF EJS Templates
merge: make 'diverging renames' diagnostic a more helpful note....
Dan Villiom Podlaski Christiansen -
r12757:62c8f769 default
parent child Browse files
Show More
@@ -1,543 +1,544 b''
1 # merge.py - directory-level update/merge handling for Mercurial
1 # merge.py - directory-level update/merge handling for Mercurial
2 #
2 #
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from node import nullid, nullrev, hex, bin
8 from node import nullid, nullrev, hex, bin
9 from i18n import _
9 from i18n import _
10 import util, filemerge, copies, subrepo
10 import util, filemerge, copies, subrepo
11 import errno, os, shutil
11 import errno, os, shutil
12
12
13 class mergestate(object):
13 class mergestate(object):
14 '''track 3-way merge state of individual files'''
14 '''track 3-way merge state of individual files'''
15 def __init__(self, repo):
15 def __init__(self, repo):
16 self._repo = repo
16 self._repo = repo
17 self._dirty = False
17 self._dirty = False
18 self._read()
18 self._read()
19 def reset(self, node=None):
19 def reset(self, node=None):
20 self._state = {}
20 self._state = {}
21 if node:
21 if node:
22 self._local = node
22 self._local = node
23 shutil.rmtree(self._repo.join("merge"), True)
23 shutil.rmtree(self._repo.join("merge"), True)
24 self._dirty = False
24 self._dirty = False
25 def _read(self):
25 def _read(self):
26 self._state = {}
26 self._state = {}
27 try:
27 try:
28 f = self._repo.opener("merge/state")
28 f = self._repo.opener("merge/state")
29 for i, l in enumerate(f):
29 for i, l in enumerate(f):
30 if i == 0:
30 if i == 0:
31 self._local = bin(l[:-1])
31 self._local = bin(l[:-1])
32 else:
32 else:
33 bits = l[:-1].split("\0")
33 bits = l[:-1].split("\0")
34 self._state[bits[0]] = bits[1:]
34 self._state[bits[0]] = bits[1:]
35 except IOError, err:
35 except IOError, err:
36 if err.errno != errno.ENOENT:
36 if err.errno != errno.ENOENT:
37 raise
37 raise
38 self._dirty = False
38 self._dirty = False
39 def commit(self):
39 def commit(self):
40 if self._dirty:
40 if self._dirty:
41 f = self._repo.opener("merge/state", "w")
41 f = self._repo.opener("merge/state", "w")
42 f.write(hex(self._local) + "\n")
42 f.write(hex(self._local) + "\n")
43 for d, v in self._state.iteritems():
43 for d, v in self._state.iteritems():
44 f.write("\0".join([d] + v) + "\n")
44 f.write("\0".join([d] + v) + "\n")
45 self._dirty = False
45 self._dirty = False
46 def add(self, fcl, fco, fca, fd, flags):
46 def add(self, fcl, fco, fca, fd, flags):
47 hash = util.sha1(fcl.path()).hexdigest()
47 hash = util.sha1(fcl.path()).hexdigest()
48 self._repo.opener("merge/" + hash, "w").write(fcl.data())
48 self._repo.opener("merge/" + hash, "w").write(fcl.data())
49 self._state[fd] = ['u', hash, fcl.path(), fca.path(),
49 self._state[fd] = ['u', hash, fcl.path(), fca.path(),
50 hex(fca.filenode()), fco.path(), flags]
50 hex(fca.filenode()), fco.path(), flags]
51 self._dirty = True
51 self._dirty = True
52 def __contains__(self, dfile):
52 def __contains__(self, dfile):
53 return dfile in self._state
53 return dfile in self._state
54 def __getitem__(self, dfile):
54 def __getitem__(self, dfile):
55 return self._state[dfile][0]
55 return self._state[dfile][0]
56 def __iter__(self):
56 def __iter__(self):
57 l = self._state.keys()
57 l = self._state.keys()
58 l.sort()
58 l.sort()
59 for f in l:
59 for f in l:
60 yield f
60 yield f
61 def mark(self, dfile, state):
61 def mark(self, dfile, state):
62 self._state[dfile][0] = state
62 self._state[dfile][0] = state
63 self._dirty = True
63 self._dirty = True
64 def resolve(self, dfile, wctx, octx):
64 def resolve(self, dfile, wctx, octx):
65 if self[dfile] == 'r':
65 if self[dfile] == 'r':
66 return 0
66 return 0
67 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
67 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
68 f = self._repo.opener("merge/" + hash)
68 f = self._repo.opener("merge/" + hash)
69 self._repo.wwrite(dfile, f.read(), flags)
69 self._repo.wwrite(dfile, f.read(), flags)
70 fcd = wctx[dfile]
70 fcd = wctx[dfile]
71 fco = octx[ofile]
71 fco = octx[ofile]
72 fca = self._repo.filectx(afile, fileid=anode)
72 fca = self._repo.filectx(afile, fileid=anode)
73 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
73 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
74 if not r:
74 if not r:
75 self.mark(dfile, 'r')
75 self.mark(dfile, 'r')
76 return r
76 return r
77
77
78 def _checkunknown(wctx, mctx):
78 def _checkunknown(wctx, mctx):
79 "check for collisions between unknown files and files in mctx"
79 "check for collisions between unknown files and files in mctx"
80 for f in wctx.unknown():
80 for f in wctx.unknown():
81 if f in mctx and mctx[f].cmp(wctx[f]):
81 if f in mctx and mctx[f].cmp(wctx[f]):
82 raise util.Abort(_("untracked file in working directory differs"
82 raise util.Abort(_("untracked file in working directory differs"
83 " from file in requested revision: '%s'") % f)
83 " from file in requested revision: '%s'") % f)
84
84
85 def _checkcollision(mctx):
85 def _checkcollision(mctx):
86 "check for case folding collisions in the destination context"
86 "check for case folding collisions in the destination context"
87 folded = {}
87 folded = {}
88 for fn in mctx:
88 for fn in mctx:
89 fold = fn.lower()
89 fold = fn.lower()
90 if fold in folded:
90 if fold in folded:
91 raise util.Abort(_("case-folding collision between %s and %s")
91 raise util.Abort(_("case-folding collision between %s and %s")
92 % (fn, folded[fold]))
92 % (fn, folded[fold]))
93 folded[fold] = fn
93 folded[fold] = fn
94
94
95 def _forgetremoved(wctx, mctx, branchmerge):
95 def _forgetremoved(wctx, mctx, branchmerge):
96 """
96 """
97 Forget removed files
97 Forget removed files
98
98
99 If we're jumping between revisions (as opposed to merging), and if
99 If we're jumping between revisions (as opposed to merging), and if
100 neither the working directory nor the target rev has the file,
100 neither the working directory nor the target rev has the file,
101 then we need to remove it from the dirstate, to prevent the
101 then we need to remove it from the dirstate, to prevent the
102 dirstate from listing the file when it is no longer in the
102 dirstate from listing the file when it is no longer in the
103 manifest.
103 manifest.
104
104
105 If we're merging, and the other revision has removed a file
105 If we're merging, and the other revision has removed a file
106 that is not present in the working directory, we need to mark it
106 that is not present in the working directory, we need to mark it
107 as removed.
107 as removed.
108 """
108 """
109
109
110 action = []
110 action = []
111 state = branchmerge and 'r' or 'f'
111 state = branchmerge and 'r' or 'f'
112 for f in wctx.deleted():
112 for f in wctx.deleted():
113 if f not in mctx:
113 if f not in mctx:
114 action.append((f, state))
114 action.append((f, state))
115
115
116 if not branchmerge:
116 if not branchmerge:
117 for f in wctx.removed():
117 for f in wctx.removed():
118 if f not in mctx:
118 if f not in mctx:
119 action.append((f, "f"))
119 action.append((f, "f"))
120
120
121 return action
121 return action
122
122
123 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
123 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
124 """
124 """
125 Merge p1 and p2 with ancestor pa and generate merge action list
125 Merge p1 and p2 with ancestor pa and generate merge action list
126
126
127 overwrite = whether we clobber working files
127 overwrite = whether we clobber working files
128 partial = function to filter file lists
128 partial = function to filter file lists
129 """
129 """
130
130
131 def fmerge(f, f2, fa):
131 def fmerge(f, f2, fa):
132 """merge flags"""
132 """merge flags"""
133 a, m, n = ma.flags(fa), m1.flags(f), m2.flags(f2)
133 a, m, n = ma.flags(fa), m1.flags(f), m2.flags(f2)
134 if m == n: # flags agree
134 if m == n: # flags agree
135 return m # unchanged
135 return m # unchanged
136 if m and n and not a: # flags set, don't agree, differ from parent
136 if m and n and not a: # flags set, don't agree, differ from parent
137 r = repo.ui.promptchoice(
137 r = repo.ui.promptchoice(
138 _(" conflicting flags for %s\n"
138 _(" conflicting flags for %s\n"
139 "(n)one, e(x)ec or sym(l)ink?") % f,
139 "(n)one, e(x)ec or sym(l)ink?") % f,
140 (_("&None"), _("E&xec"), _("Sym&link")), 0)
140 (_("&None"), _("E&xec"), _("Sym&link")), 0)
141 if r == 1:
141 if r == 1:
142 return "x" # Exec
142 return "x" # Exec
143 if r == 2:
143 if r == 2:
144 return "l" # Symlink
144 return "l" # Symlink
145 return ""
145 return ""
146 if m and m != a: # changed from a to m
146 if m and m != a: # changed from a to m
147 return m
147 return m
148 if n and n != a: # changed from a to n
148 if n and n != a: # changed from a to n
149 return n
149 return n
150 return '' # flag was cleared
150 return '' # flag was cleared
151
151
152 def act(msg, m, f, *args):
152 def act(msg, m, f, *args):
153 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
153 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
154 action.append((f, m) + args)
154 action.append((f, m) + args)
155
155
156 action, copy = [], {}
156 action, copy = [], {}
157
157
158 if overwrite:
158 if overwrite:
159 pa = p1
159 pa = p1
160 elif pa == p2: # backwards
160 elif pa == p2: # backwards
161 pa = p1.p1()
161 pa = p1.p1()
162 elif pa and repo.ui.configbool("merge", "followcopies", True):
162 elif pa and repo.ui.configbool("merge", "followcopies", True):
163 dirs = repo.ui.configbool("merge", "followdirs", True)
163 dirs = repo.ui.configbool("merge", "followdirs", True)
164 copy, diverge = copies.copies(repo, p1, p2, pa, dirs)
164 copy, diverge = copies.copies(repo, p1, p2, pa, dirs)
165 for of, fl in diverge.iteritems():
165 for of, fl in diverge.iteritems():
166 act("divergent renames", "dr", of, fl)
166 act("divergent renames", "dr", of, fl)
167
167
168 repo.ui.note(_("resolving manifests\n"))
168 repo.ui.note(_("resolving manifests\n"))
169 repo.ui.debug(" overwrite %s partial %s\n" % (overwrite, bool(partial)))
169 repo.ui.debug(" overwrite %s partial %s\n" % (overwrite, bool(partial)))
170 repo.ui.debug(" ancestor %s local %s remote %s\n" % (pa, p1, p2))
170 repo.ui.debug(" ancestor %s local %s remote %s\n" % (pa, p1, p2))
171
171
172 m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
172 m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
173 copied = set(copy.values())
173 copied = set(copy.values())
174
174
175 if '.hgsubstate' in m1:
175 if '.hgsubstate' in m1:
176 # check whether sub state is modified
176 # check whether sub state is modified
177 for s in p1.substate:
177 for s in p1.substate:
178 if p1.sub(s).dirty():
178 if p1.sub(s).dirty():
179 m1['.hgsubstate'] += "+"
179 m1['.hgsubstate'] += "+"
180 break
180 break
181
181
182 # Compare manifests
182 # Compare manifests
183 for f, n in m1.iteritems():
183 for f, n in m1.iteritems():
184 if partial and not partial(f):
184 if partial and not partial(f):
185 continue
185 continue
186 if f in m2:
186 if f in m2:
187 rflags = fmerge(f, f, f)
187 rflags = fmerge(f, f, f)
188 a = ma.get(f, nullid)
188 a = ma.get(f, nullid)
189 if n == m2[f] or m2[f] == a: # same or local newer
189 if n == m2[f] or m2[f] == a: # same or local newer
190 # is file locally modified or flags need changing?
190 # is file locally modified or flags need changing?
191 # dirstate flags may need to be made current
191 # dirstate flags may need to be made current
192 if m1.flags(f) != rflags or n[20:]:
192 if m1.flags(f) != rflags or n[20:]:
193 act("update permissions", "e", f, rflags)
193 act("update permissions", "e", f, rflags)
194 elif n == a: # remote newer
194 elif n == a: # remote newer
195 act("remote is newer", "g", f, rflags)
195 act("remote is newer", "g", f, rflags)
196 else: # both changed
196 else: # both changed
197 act("versions differ", "m", f, f, f, rflags, False)
197 act("versions differ", "m", f, f, f, rflags, False)
198 elif f in copied: # files we'll deal with on m2 side
198 elif f in copied: # files we'll deal with on m2 side
199 pass
199 pass
200 elif f in copy:
200 elif f in copy:
201 f2 = copy[f]
201 f2 = copy[f]
202 if f2 not in m2: # directory rename
202 if f2 not in m2: # directory rename
203 act("remote renamed directory to " + f2, "d",
203 act("remote renamed directory to " + f2, "d",
204 f, None, f2, m1.flags(f))
204 f, None, f2, m1.flags(f))
205 else: # case 2 A,B/B/B or case 4,21 A/B/B
205 else: # case 2 A,B/B/B or case 4,21 A/B/B
206 act("local copied/moved to " + f2, "m",
206 act("local copied/moved to " + f2, "m",
207 f, f2, f, fmerge(f, f2, f2), False)
207 f, f2, f, fmerge(f, f2, f2), False)
208 elif f in ma: # clean, a different, no remote
208 elif f in ma: # clean, a different, no remote
209 if n != ma[f]:
209 if n != ma[f]:
210 if repo.ui.promptchoice(
210 if repo.ui.promptchoice(
211 _(" local changed %s which remote deleted\n"
211 _(" local changed %s which remote deleted\n"
212 "use (c)hanged version or (d)elete?") % f,
212 "use (c)hanged version or (d)elete?") % f,
213 (_("&Changed"), _("&Delete")), 0):
213 (_("&Changed"), _("&Delete")), 0):
214 act("prompt delete", "r", f)
214 act("prompt delete", "r", f)
215 else:
215 else:
216 act("prompt keep", "a", f)
216 act("prompt keep", "a", f)
217 elif n[20:] == "a": # added, no remote
217 elif n[20:] == "a": # added, no remote
218 act("remote deleted", "f", f)
218 act("remote deleted", "f", f)
219 elif n[20:] != "u":
219 elif n[20:] != "u":
220 act("other deleted", "r", f)
220 act("other deleted", "r", f)
221
221
222 for f, n in m2.iteritems():
222 for f, n in m2.iteritems():
223 if partial and not partial(f):
223 if partial and not partial(f):
224 continue
224 continue
225 if f in m1 or f in copied: # files already visited
225 if f in m1 or f in copied: # files already visited
226 continue
226 continue
227 if f in copy:
227 if f in copy:
228 f2 = copy[f]
228 f2 = copy[f]
229 if f2 not in m1: # directory rename
229 if f2 not in m1: # directory rename
230 act("local renamed directory to " + f2, "d",
230 act("local renamed directory to " + f2, "d",
231 None, f, f2, m2.flags(f))
231 None, f, f2, m2.flags(f))
232 elif f2 in m2: # rename case 1, A/A,B/A
232 elif f2 in m2: # rename case 1, A/A,B/A
233 act("remote copied to " + f, "m",
233 act("remote copied to " + f, "m",
234 f2, f, f, fmerge(f2, f, f2), False)
234 f2, f, f, fmerge(f2, f, f2), False)
235 else: # case 3,20 A/B/A
235 else: # case 3,20 A/B/A
236 act("remote moved to " + f, "m",
236 act("remote moved to " + f, "m",
237 f2, f, f, fmerge(f2, f, f2), True)
237 f2, f, f, fmerge(f2, f, f2), True)
238 elif f not in ma:
238 elif f not in ma:
239 act("remote created", "g", f, m2.flags(f))
239 act("remote created", "g", f, m2.flags(f))
240 elif n != ma[f]:
240 elif n != ma[f]:
241 if repo.ui.promptchoice(
241 if repo.ui.promptchoice(
242 _("remote changed %s which local deleted\n"
242 _("remote changed %s which local deleted\n"
243 "use (c)hanged version or leave (d)eleted?") % f,
243 "use (c)hanged version or leave (d)eleted?") % f,
244 (_("&Changed"), _("&Deleted")), 0) == 0:
244 (_("&Changed"), _("&Deleted")), 0) == 0:
245 act("prompt recreating", "g", f, m2.flags(f))
245 act("prompt recreating", "g", f, m2.flags(f))
246
246
247 return action
247 return action
248
248
249 def actionkey(a):
249 def actionkey(a):
250 return a[1] == 'r' and -1 or 0, a
250 return a[1] == 'r' and -1 or 0, a
251
251
252 def applyupdates(repo, action, wctx, mctx, actx):
252 def applyupdates(repo, action, wctx, mctx, actx):
253 """apply the merge action list to the working directory
253 """apply the merge action list to the working directory
254
254
255 wctx is the working copy context
255 wctx is the working copy context
256 mctx is the context to be merged into the working copy
256 mctx is the context to be merged into the working copy
257 actx is the context of the common ancestor
257 actx is the context of the common ancestor
258 """
258 """
259
259
260 updated, merged, removed, unresolved = 0, 0, 0, 0
260 updated, merged, removed, unresolved = 0, 0, 0, 0
261 ms = mergestate(repo)
261 ms = mergestate(repo)
262 ms.reset(wctx.parents()[0].node())
262 ms.reset(wctx.parents()[0].node())
263 moves = []
263 moves = []
264 action.sort(key=actionkey)
264 action.sort(key=actionkey)
265 substate = wctx.substate # prime
265 substate = wctx.substate # prime
266
266
267 # prescan for merges
267 # prescan for merges
268 u = repo.ui
268 u = repo.ui
269 for a in action:
269 for a in action:
270 f, m = a[:2]
270 f, m = a[:2]
271 if m == 'm': # merge
271 if m == 'm': # merge
272 f2, fd, flags, move = a[2:]
272 f2, fd, flags, move = a[2:]
273 if f == '.hgsubstate': # merged internally
273 if f == '.hgsubstate': # merged internally
274 continue
274 continue
275 repo.ui.debug("preserving %s for resolve of %s\n" % (f, fd))
275 repo.ui.debug("preserving %s for resolve of %s\n" % (f, fd))
276 fcl = wctx[f]
276 fcl = wctx[f]
277 fco = mctx[f2]
277 fco = mctx[f2]
278 if mctx == actx: # backwards, use working dir parent as ancestor
278 if mctx == actx: # backwards, use working dir parent as ancestor
279 if fcl.parents():
279 if fcl.parents():
280 fca = fcl.parents()[0]
280 fca = fcl.parents()[0]
281 else:
281 else:
282 fca = repo.filectx(f, fileid=nullrev)
282 fca = repo.filectx(f, fileid=nullrev)
283 else:
283 else:
284 fca = fcl.ancestor(fco, actx)
284 fca = fcl.ancestor(fco, actx)
285 if not fca:
285 if not fca:
286 fca = repo.filectx(f, fileid=nullrev)
286 fca = repo.filectx(f, fileid=nullrev)
287 ms.add(fcl, fco, fca, fd, flags)
287 ms.add(fcl, fco, fca, fd, flags)
288 if f != fd and move:
288 if f != fd and move:
289 moves.append(f)
289 moves.append(f)
290
290
291 # remove renamed files after safely stored
291 # remove renamed files after safely stored
292 for f in moves:
292 for f in moves:
293 if os.path.lexists(repo.wjoin(f)):
293 if os.path.lexists(repo.wjoin(f)):
294 repo.ui.debug("removing %s\n" % f)
294 repo.ui.debug("removing %s\n" % f)
295 os.unlink(repo.wjoin(f))
295 os.unlink(repo.wjoin(f))
296
296
297 audit_path = util.path_auditor(repo.root)
297 audit_path = util.path_auditor(repo.root)
298
298
299 numupdates = len(action)
299 numupdates = len(action)
300 for i, a in enumerate(action):
300 for i, a in enumerate(action):
301 f, m = a[:2]
301 f, m = a[:2]
302 u.progress(_('updating'), i + 1, item=f, total=numupdates,
302 u.progress(_('updating'), i + 1, item=f, total=numupdates,
303 unit=_('files'))
303 unit=_('files'))
304 if f and f[0] == "/":
304 if f and f[0] == "/":
305 continue
305 continue
306 if m == "r": # remove
306 if m == "r": # remove
307 repo.ui.note(_("removing %s\n") % f)
307 repo.ui.note(_("removing %s\n") % f)
308 audit_path(f)
308 audit_path(f)
309 if f == '.hgsubstate': # subrepo states need updating
309 if f == '.hgsubstate': # subrepo states need updating
310 subrepo.submerge(repo, wctx, mctx, wctx)
310 subrepo.submerge(repo, wctx, mctx, wctx)
311 try:
311 try:
312 util.unlink(repo.wjoin(f))
312 util.unlink(repo.wjoin(f))
313 except OSError, inst:
313 except OSError, inst:
314 if inst.errno != errno.ENOENT:
314 if inst.errno != errno.ENOENT:
315 repo.ui.warn(_("update failed to remove %s: %s!\n") %
315 repo.ui.warn(_("update failed to remove %s: %s!\n") %
316 (f, inst.strerror))
316 (f, inst.strerror))
317 removed += 1
317 removed += 1
318 elif m == "m": # merge
318 elif m == "m": # merge
319 if f == '.hgsubstate': # subrepo states need updating
319 if f == '.hgsubstate': # subrepo states need updating
320 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx))
320 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx))
321 continue
321 continue
322 f2, fd, flags, move = a[2:]
322 f2, fd, flags, move = a[2:]
323 r = ms.resolve(fd, wctx, mctx)
323 r = ms.resolve(fd, wctx, mctx)
324 if r is not None and r > 0:
324 if r is not None and r > 0:
325 unresolved += 1
325 unresolved += 1
326 else:
326 else:
327 if r is None:
327 if r is None:
328 updated += 1
328 updated += 1
329 else:
329 else:
330 merged += 1
330 merged += 1
331 util.set_flags(repo.wjoin(fd), 'l' in flags, 'x' in flags)
331 util.set_flags(repo.wjoin(fd), 'l' in flags, 'x' in flags)
332 if f != fd and move and os.path.lexists(repo.wjoin(f)):
332 if f != fd and move and os.path.lexists(repo.wjoin(f)):
333 repo.ui.debug("removing %s\n" % f)
333 repo.ui.debug("removing %s\n" % f)
334 os.unlink(repo.wjoin(f))
334 os.unlink(repo.wjoin(f))
335 elif m == "g": # get
335 elif m == "g": # get
336 flags = a[2]
336 flags = a[2]
337 repo.ui.note(_("getting %s\n") % f)
337 repo.ui.note(_("getting %s\n") % f)
338 t = mctx.filectx(f).data()
338 t = mctx.filectx(f).data()
339 repo.wwrite(f, t, flags)
339 repo.wwrite(f, t, flags)
340 t = None
340 t = None
341 updated += 1
341 updated += 1
342 if f == '.hgsubstate': # subrepo states need updating
342 if f == '.hgsubstate': # subrepo states need updating
343 subrepo.submerge(repo, wctx, mctx, wctx)
343 subrepo.submerge(repo, wctx, mctx, wctx)
344 elif m == "d": # directory rename
344 elif m == "d": # directory rename
345 f2, fd, flags = a[2:]
345 f2, fd, flags = a[2:]
346 if f:
346 if f:
347 repo.ui.note(_("moving %s to %s\n") % (f, fd))
347 repo.ui.note(_("moving %s to %s\n") % (f, fd))
348 t = wctx.filectx(f).data()
348 t = wctx.filectx(f).data()
349 repo.wwrite(fd, t, flags)
349 repo.wwrite(fd, t, flags)
350 util.unlink(repo.wjoin(f))
350 util.unlink(repo.wjoin(f))
351 if f2:
351 if f2:
352 repo.ui.note(_("getting %s to %s\n") % (f2, fd))
352 repo.ui.note(_("getting %s to %s\n") % (f2, fd))
353 t = mctx.filectx(f2).data()
353 t = mctx.filectx(f2).data()
354 repo.wwrite(fd, t, flags)
354 repo.wwrite(fd, t, flags)
355 updated += 1
355 updated += 1
356 elif m == "dr": # divergent renames
356 elif m == "dr": # divergent renames
357 fl = a[2]
357 fl = a[2]
358 repo.ui.warn(_("warning: detected divergent renames of %s to:\n") % f)
358 repo.ui.warn(_("note: possible conflict - %s was renamed "
359 "multiple times to:\n") % f)
359 for nf in fl:
360 for nf in fl:
360 repo.ui.warn(" %s\n" % nf)
361 repo.ui.warn(" %s\n" % nf)
361 elif m == "e": # exec
362 elif m == "e": # exec
362 flags = a[2]
363 flags = a[2]
363 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags)
364 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags)
364 ms.commit()
365 ms.commit()
365 u.progress(_('updating'), None, total=numupdates, unit=_('files'))
366 u.progress(_('updating'), None, total=numupdates, unit=_('files'))
366
367
367 return updated, merged, removed, unresolved
368 return updated, merged, removed, unresolved
368
369
369 def recordupdates(repo, action, branchmerge):
370 def recordupdates(repo, action, branchmerge):
370 "record merge actions to the dirstate"
371 "record merge actions to the dirstate"
371
372
372 for a in action:
373 for a in action:
373 f, m = a[:2]
374 f, m = a[:2]
374 if m == "r": # remove
375 if m == "r": # remove
375 if branchmerge:
376 if branchmerge:
376 repo.dirstate.remove(f)
377 repo.dirstate.remove(f)
377 else:
378 else:
378 repo.dirstate.forget(f)
379 repo.dirstate.forget(f)
379 elif m == "a": # re-add
380 elif m == "a": # re-add
380 if not branchmerge:
381 if not branchmerge:
381 repo.dirstate.add(f)
382 repo.dirstate.add(f)
382 elif m == "f": # forget
383 elif m == "f": # forget
383 repo.dirstate.forget(f)
384 repo.dirstate.forget(f)
384 elif m == "e": # exec change
385 elif m == "e": # exec change
385 repo.dirstate.normallookup(f)
386 repo.dirstate.normallookup(f)
386 elif m == "g": # get
387 elif m == "g": # get
387 if branchmerge:
388 if branchmerge:
388 repo.dirstate.otherparent(f)
389 repo.dirstate.otherparent(f)
389 else:
390 else:
390 repo.dirstate.normal(f)
391 repo.dirstate.normal(f)
391 elif m == "m": # merge
392 elif m == "m": # merge
392 f2, fd, flag, move = a[2:]
393 f2, fd, flag, move = a[2:]
393 if branchmerge:
394 if branchmerge:
394 # We've done a branch merge, mark this file as merged
395 # We've done a branch merge, mark this file as merged
395 # so that we properly record the merger later
396 # so that we properly record the merger later
396 repo.dirstate.merge(fd)
397 repo.dirstate.merge(fd)
397 if f != f2: # copy/rename
398 if f != f2: # copy/rename
398 if move:
399 if move:
399 repo.dirstate.remove(f)
400 repo.dirstate.remove(f)
400 if f != fd:
401 if f != fd:
401 repo.dirstate.copy(f, fd)
402 repo.dirstate.copy(f, fd)
402 else:
403 else:
403 repo.dirstate.copy(f2, fd)
404 repo.dirstate.copy(f2, fd)
404 else:
405 else:
405 # We've update-merged a locally modified file, so
406 # We've update-merged a locally modified file, so
406 # we set the dirstate to emulate a normal checkout
407 # we set the dirstate to emulate a normal checkout
407 # of that file some time in the past. Thus our
408 # of that file some time in the past. Thus our
408 # merge will appear as a normal local file
409 # merge will appear as a normal local file
409 # modification.
410 # modification.
410 if f2 == fd: # file not locally copied/moved
411 if f2 == fd: # file not locally copied/moved
411 repo.dirstate.normallookup(fd)
412 repo.dirstate.normallookup(fd)
412 if move:
413 if move:
413 repo.dirstate.forget(f)
414 repo.dirstate.forget(f)
414 elif m == "d": # directory rename
415 elif m == "d": # directory rename
415 f2, fd, flag = a[2:]
416 f2, fd, flag = a[2:]
416 if not f2 and f not in repo.dirstate:
417 if not f2 and f not in repo.dirstate:
417 # untracked file moved
418 # untracked file moved
418 continue
419 continue
419 if branchmerge:
420 if branchmerge:
420 repo.dirstate.add(fd)
421 repo.dirstate.add(fd)
421 if f:
422 if f:
422 repo.dirstate.remove(f)
423 repo.dirstate.remove(f)
423 repo.dirstate.copy(f, fd)
424 repo.dirstate.copy(f, fd)
424 if f2:
425 if f2:
425 repo.dirstate.copy(f2, fd)
426 repo.dirstate.copy(f2, fd)
426 else:
427 else:
427 repo.dirstate.normal(fd)
428 repo.dirstate.normal(fd)
428 if f:
429 if f:
429 repo.dirstate.forget(f)
430 repo.dirstate.forget(f)
430
431
431 def update(repo, node, branchmerge, force, partial):
432 def update(repo, node, branchmerge, force, partial):
432 """
433 """
433 Perform a merge between the working directory and the given node
434 Perform a merge between the working directory and the given node
434
435
435 node = the node to update to, or None if unspecified
436 node = the node to update to, or None if unspecified
436 branchmerge = whether to merge between branches
437 branchmerge = whether to merge between branches
437 force = whether to force branch merging or file overwriting
438 force = whether to force branch merging or file overwriting
438 partial = a function to filter file lists (dirstate not updated)
439 partial = a function to filter file lists (dirstate not updated)
439
440
440 The table below shows all the behaviors of the update command
441 The table below shows all the behaviors of the update command
441 given the -c and -C or no options, whether the working directory
442 given the -c and -C or no options, whether the working directory
442 is dirty, whether a revision is specified, and the relationship of
443 is dirty, whether a revision is specified, and the relationship of
443 the parent rev to the target rev (linear, on the same named
444 the parent rev to the target rev (linear, on the same named
444 branch, or on another named branch).
445 branch, or on another named branch).
445
446
446 This logic is tested by test-update-branches.t.
447 This logic is tested by test-update-branches.t.
447
448
448 -c -C dirty rev | linear same cross
449 -c -C dirty rev | linear same cross
449 n n n n | ok (1) x
450 n n n n | ok (1) x
450 n n n y | ok ok ok
451 n n n y | ok ok ok
451 n n y * | merge (2) (2)
452 n n y * | merge (2) (2)
452 n y * * | --- discard ---
453 n y * * | --- discard ---
453 y n y * | --- (3) ---
454 y n y * | --- (3) ---
454 y n n * | --- ok ---
455 y n n * | --- ok ---
455 y y * * | --- (4) ---
456 y y * * | --- (4) ---
456
457
457 x = can't happen
458 x = can't happen
458 * = don't-care
459 * = don't-care
459 1 = abort: crosses branches (use 'hg merge' or 'hg update -c')
460 1 = abort: crosses branches (use 'hg merge' or 'hg update -c')
460 2 = abort: crosses branches (use 'hg merge' to merge or
461 2 = abort: crosses branches (use 'hg merge' to merge or
461 use 'hg update -C' to discard changes)
462 use 'hg update -C' to discard changes)
462 3 = abort: uncommitted local changes
463 3 = abort: uncommitted local changes
463 4 = incompatible options (checked in commands.py)
464 4 = incompatible options (checked in commands.py)
464 """
465 """
465
466
466 onode = node
467 onode = node
467 wlock = repo.wlock()
468 wlock = repo.wlock()
468 try:
469 try:
469 wc = repo[None]
470 wc = repo[None]
470 if node is None:
471 if node is None:
471 # tip of current branch
472 # tip of current branch
472 try:
473 try:
473 node = repo.branchtags()[wc.branch()]
474 node = repo.branchtags()[wc.branch()]
474 except KeyError:
475 except KeyError:
475 if wc.branch() == "default": # no default branch!
476 if wc.branch() == "default": # no default branch!
476 node = repo.lookup("tip") # update to tip
477 node = repo.lookup("tip") # update to tip
477 else:
478 else:
478 raise util.Abort(_("branch %s not found") % wc.branch())
479 raise util.Abort(_("branch %s not found") % wc.branch())
479 overwrite = force and not branchmerge
480 overwrite = force and not branchmerge
480 pl = wc.parents()
481 pl = wc.parents()
481 p1, p2 = pl[0], repo[node]
482 p1, p2 = pl[0], repo[node]
482 pa = p1.ancestor(p2)
483 pa = p1.ancestor(p2)
483 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
484 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
484 fastforward = False
485 fastforward = False
485
486
486 ### check phase
487 ### check phase
487 if not overwrite and len(pl) > 1:
488 if not overwrite and len(pl) > 1:
488 raise util.Abort(_("outstanding uncommitted merges"))
489 raise util.Abort(_("outstanding uncommitted merges"))
489 if branchmerge:
490 if branchmerge:
490 if pa == p2:
491 if pa == p2:
491 raise util.Abort(_("merging with a working directory ancestor"
492 raise util.Abort(_("merging with a working directory ancestor"
492 " has no effect"))
493 " has no effect"))
493 elif pa == p1:
494 elif pa == p1:
494 if p1.branch() != p2.branch():
495 if p1.branch() != p2.branch():
495 fastforward = True
496 fastforward = True
496 else:
497 else:
497 raise util.Abort(_("nothing to merge (use 'hg update'"
498 raise util.Abort(_("nothing to merge (use 'hg update'"
498 " or check 'hg heads')"))
499 " or check 'hg heads')"))
499 if not force and (wc.files() or wc.deleted()):
500 if not force and (wc.files() or wc.deleted()):
500 raise util.Abort(_("outstanding uncommitted changes "
501 raise util.Abort(_("outstanding uncommitted changes "
501 "(use 'hg status' to list changes)"))
502 "(use 'hg status' to list changes)"))
502 elif not overwrite:
503 elif not overwrite:
503 if pa == p1 or pa == p2: # linear
504 if pa == p1 or pa == p2: # linear
504 pass # all good
505 pass # all good
505 elif wc.files() or wc.deleted():
506 elif wc.files() or wc.deleted():
506 raise util.Abort(_("crosses branches (merge branches or use"
507 raise util.Abort(_("crosses branches (merge branches or use"
507 " --clean to discard changes)"))
508 " --clean to discard changes)"))
508 elif onode is None:
509 elif onode is None:
509 raise util.Abort(_("crosses branches (merge branches or use"
510 raise util.Abort(_("crosses branches (merge branches or use"
510 " --check to force update)"))
511 " --check to force update)"))
511 else:
512 else:
512 # Allow jumping branches if clean and specific rev given
513 # Allow jumping branches if clean and specific rev given
513 overwrite = True
514 overwrite = True
514
515
515 ### calculate phase
516 ### calculate phase
516 action = []
517 action = []
517 wc.status(unknown=True) # prime cache
518 wc.status(unknown=True) # prime cache
518 if not force:
519 if not force:
519 _checkunknown(wc, p2)
520 _checkunknown(wc, p2)
520 if not util.checkcase(repo.path):
521 if not util.checkcase(repo.path):
521 _checkcollision(p2)
522 _checkcollision(p2)
522 action += _forgetremoved(wc, p2, branchmerge)
523 action += _forgetremoved(wc, p2, branchmerge)
523 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
524 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
524
525
525 ### apply phase
526 ### apply phase
526 if not branchmerge: # just jump to the new rev
527 if not branchmerge: # just jump to the new rev
527 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
528 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
528 if not partial:
529 if not partial:
529 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
530 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
530
531
531 stats = applyupdates(repo, action, wc, p2, pa)
532 stats = applyupdates(repo, action, wc, p2, pa)
532
533
533 if not partial:
534 if not partial:
534 repo.dirstate.setparents(fp1, fp2)
535 repo.dirstate.setparents(fp1, fp2)
535 recordupdates(repo, action, branchmerge)
536 recordupdates(repo, action, branchmerge)
536 if not branchmerge and not fastforward:
537 if not branchmerge and not fastforward:
537 repo.dirstate.setbranch(p2.branch())
538 repo.dirstate.setbranch(p2.branch())
538 finally:
539 finally:
539 wlock.release()
540 wlock.release()
540
541
541 if not partial:
542 if not partial:
542 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
543 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
543 return stats
544 return stats
@@ -1,372 +1,372 b''
1 $ hg init test
1 $ hg init test
2 $ cd test
2 $ cd test
3 $ echo "0" >> afile
3 $ echo "0" >> afile
4 $ hg add afile
4 $ hg add afile
5 $ hg commit -m "0.0"
5 $ hg commit -m "0.0"
6 $ echo "1" >> afile
6 $ echo "1" >> afile
7 $ hg commit -m "0.1"
7 $ hg commit -m "0.1"
8 $ echo "2" >> afile
8 $ echo "2" >> afile
9 $ hg commit -m "0.2"
9 $ hg commit -m "0.2"
10 $ echo "3" >> afile
10 $ echo "3" >> afile
11 $ hg commit -m "0.3"
11 $ hg commit -m "0.3"
12 $ hg update -C 0
12 $ hg update -C 0
13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
14 $ echo "1" >> afile
14 $ echo "1" >> afile
15 $ hg commit -m "1.1"
15 $ hg commit -m "1.1"
16 created new head
16 created new head
17 $ echo "2" >> afile
17 $ echo "2" >> afile
18 $ hg commit -m "1.2"
18 $ hg commit -m "1.2"
19 $ echo "a line" > fred
19 $ echo "a line" > fred
20 $ echo "3" >> afile
20 $ echo "3" >> afile
21 $ hg add fred
21 $ hg add fred
22 $ hg commit -m "1.3"
22 $ hg commit -m "1.3"
23 $ hg mv afile adifferentfile
23 $ hg mv afile adifferentfile
24 $ hg commit -m "1.3m"
24 $ hg commit -m "1.3m"
25 $ hg update -C 3
25 $ hg update -C 3
26 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
26 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
27 $ hg mv afile anotherfile
27 $ hg mv afile anotherfile
28 $ hg commit -m "0.3m"
28 $ hg commit -m "0.3m"
29 $ hg debugindex .hg/store/data/afile.i
29 $ hg debugindex .hg/store/data/afile.i
30 rev offset length base linkrev nodeid p1 p2
30 rev offset length base linkrev nodeid p1 p2
31 0 0 3 0 0 362fef284ce2 000000000000 000000000000
31 0 0 3 0 0 362fef284ce2 000000000000 000000000000
32 1 3 5 1 1 125144f7e028 362fef284ce2 000000000000
32 1 3 5 1 1 125144f7e028 362fef284ce2 000000000000
33 2 8 7 2 2 4c982badb186 125144f7e028 000000000000
33 2 8 7 2 2 4c982badb186 125144f7e028 000000000000
34 3 15 9 3 3 19b1fc555737 4c982badb186 000000000000
34 3 15 9 3 3 19b1fc555737 4c982badb186 000000000000
35 $ hg debugindex .hg/store/data/adifferentfile.i
35 $ hg debugindex .hg/store/data/adifferentfile.i
36 rev offset length base linkrev nodeid p1 p2
36 rev offset length base linkrev nodeid p1 p2
37 0 0 75 0 7 2565f3199a74 000000000000 000000000000
37 0 0 75 0 7 2565f3199a74 000000000000 000000000000
38 $ hg debugindex .hg/store/data/anotherfile.i
38 $ hg debugindex .hg/store/data/anotherfile.i
39 rev offset length base linkrev nodeid p1 p2
39 rev offset length base linkrev nodeid p1 p2
40 0 0 75 0 8 2565f3199a74 000000000000 000000000000
40 0 0 75 0 8 2565f3199a74 000000000000 000000000000
41 $ hg debugindex .hg/store/data/fred.i
41 $ hg debugindex .hg/store/data/fred.i
42 rev offset length base linkrev nodeid p1 p2
42 rev offset length base linkrev nodeid p1 p2
43 0 0 8 0 6 12ab3bcc5ea4 000000000000 000000000000
43 0 0 8 0 6 12ab3bcc5ea4 000000000000 000000000000
44 $ hg debugindex .hg/store/00manifest.i
44 $ hg debugindex .hg/store/00manifest.i
45 rev offset length base linkrev nodeid p1 p2
45 rev offset length base linkrev nodeid p1 p2
46 0 0 48 0 0 43eadb1d2d06 000000000000 000000000000
46 0 0 48 0 0 43eadb1d2d06 000000000000 000000000000
47 1 48 48 1 1 8b89697eba2c 43eadb1d2d06 000000000000
47 1 48 48 1 1 8b89697eba2c 43eadb1d2d06 000000000000
48 2 96 48 2 2 626a32663c2f 8b89697eba2c 000000000000
48 2 96 48 2 2 626a32663c2f 8b89697eba2c 000000000000
49 3 144 48 3 3 f54c32f13478 626a32663c2f 000000000000
49 3 144 48 3 3 f54c32f13478 626a32663c2f 000000000000
50 4 192 58 3 6 de68e904d169 626a32663c2f 000000000000
50 4 192 58 3 6 de68e904d169 626a32663c2f 000000000000
51 5 250 68 3 7 09bb521d218d de68e904d169 000000000000
51 5 250 68 3 7 09bb521d218d de68e904d169 000000000000
52 6 318 54 6 8 1fde233dfb0f f54c32f13478 000000000000
52 6 318 54 6 8 1fde233dfb0f f54c32f13478 000000000000
53 $ hg verify
53 $ hg verify
54 checking changesets
54 checking changesets
55 checking manifests
55 checking manifests
56 crosschecking files in changesets and manifests
56 crosschecking files in changesets and manifests
57 checking files
57 checking files
58 4 files, 9 changesets, 7 total revisions
58 4 files, 9 changesets, 7 total revisions
59 $ cd ..
59 $ cd ..
60 $ for i in 0 1 2 3 4 5 6 7 8; do
60 $ for i in 0 1 2 3 4 5 6 7 8; do
61 > mkdir test-"$i"
61 > mkdir test-"$i"
62 > hg --cwd test-"$i" init
62 > hg --cwd test-"$i" init
63 > hg -R test bundle -r "$i" test-"$i".hg test-"$i"
63 > hg -R test bundle -r "$i" test-"$i".hg test-"$i"
64 > cd test-"$i"
64 > cd test-"$i"
65 > hg unbundle ../test-"$i".hg
65 > hg unbundle ../test-"$i".hg
66 > hg verify
66 > hg verify
67 > hg tip -q
67 > hg tip -q
68 > cd ..
68 > cd ..
69 > done
69 > done
70 searching for changes
70 searching for changes
71 1 changesets found
71 1 changesets found
72 adding changesets
72 adding changesets
73 adding manifests
73 adding manifests
74 adding file changes
74 adding file changes
75 added 1 changesets with 1 changes to 1 files
75 added 1 changesets with 1 changes to 1 files
76 (run 'hg update' to get a working copy)
76 (run 'hg update' to get a working copy)
77 checking changesets
77 checking changesets
78 checking manifests
78 checking manifests
79 crosschecking files in changesets and manifests
79 crosschecking files in changesets and manifests
80 checking files
80 checking files
81 1 files, 1 changesets, 1 total revisions
81 1 files, 1 changesets, 1 total revisions
82 0:f9ee2f85a263
82 0:f9ee2f85a263
83 searching for changes
83 searching for changes
84 2 changesets found
84 2 changesets found
85 adding changesets
85 adding changesets
86 adding manifests
86 adding manifests
87 adding file changes
87 adding file changes
88 added 2 changesets with 2 changes to 1 files
88 added 2 changesets with 2 changes to 1 files
89 (run 'hg update' to get a working copy)
89 (run 'hg update' to get a working copy)
90 checking changesets
90 checking changesets
91 checking manifests
91 checking manifests
92 crosschecking files in changesets and manifests
92 crosschecking files in changesets and manifests
93 checking files
93 checking files
94 1 files, 2 changesets, 2 total revisions
94 1 files, 2 changesets, 2 total revisions
95 1:34c2bf6b0626
95 1:34c2bf6b0626
96 searching for changes
96 searching for changes
97 3 changesets found
97 3 changesets found
98 adding changesets
98 adding changesets
99 adding manifests
99 adding manifests
100 adding file changes
100 adding file changes
101 added 3 changesets with 3 changes to 1 files
101 added 3 changesets with 3 changes to 1 files
102 (run 'hg update' to get a working copy)
102 (run 'hg update' to get a working copy)
103 checking changesets
103 checking changesets
104 checking manifests
104 checking manifests
105 crosschecking files in changesets and manifests
105 crosschecking files in changesets and manifests
106 checking files
106 checking files
107 1 files, 3 changesets, 3 total revisions
107 1 files, 3 changesets, 3 total revisions
108 2:e38ba6f5b7e0
108 2:e38ba6f5b7e0
109 searching for changes
109 searching for changes
110 4 changesets found
110 4 changesets found
111 adding changesets
111 adding changesets
112 adding manifests
112 adding manifests
113 adding file changes
113 adding file changes
114 added 4 changesets with 4 changes to 1 files
114 added 4 changesets with 4 changes to 1 files
115 (run 'hg update' to get a working copy)
115 (run 'hg update' to get a working copy)
116 checking changesets
116 checking changesets
117 checking manifests
117 checking manifests
118 crosschecking files in changesets and manifests
118 crosschecking files in changesets and manifests
119 checking files
119 checking files
120 1 files, 4 changesets, 4 total revisions
120 1 files, 4 changesets, 4 total revisions
121 3:eebf5a27f8ca
121 3:eebf5a27f8ca
122 searching for changes
122 searching for changes
123 2 changesets found
123 2 changesets found
124 adding changesets
124 adding changesets
125 adding manifests
125 adding manifests
126 adding file changes
126 adding file changes
127 added 2 changesets with 2 changes to 1 files
127 added 2 changesets with 2 changes to 1 files
128 (run 'hg update' to get a working copy)
128 (run 'hg update' to get a working copy)
129 checking changesets
129 checking changesets
130 checking manifests
130 checking manifests
131 crosschecking files in changesets and manifests
131 crosschecking files in changesets and manifests
132 checking files
132 checking files
133 1 files, 2 changesets, 2 total revisions
133 1 files, 2 changesets, 2 total revisions
134 1:095197eb4973
134 1:095197eb4973
135 searching for changes
135 searching for changes
136 3 changesets found
136 3 changesets found
137 adding changesets
137 adding changesets
138 adding manifests
138 adding manifests
139 adding file changes
139 adding file changes
140 added 3 changesets with 3 changes to 1 files
140 added 3 changesets with 3 changes to 1 files
141 (run 'hg update' to get a working copy)
141 (run 'hg update' to get a working copy)
142 checking changesets
142 checking changesets
143 checking manifests
143 checking manifests
144 crosschecking files in changesets and manifests
144 crosschecking files in changesets and manifests
145 checking files
145 checking files
146 1 files, 3 changesets, 3 total revisions
146 1 files, 3 changesets, 3 total revisions
147 2:1bb50a9436a7
147 2:1bb50a9436a7
148 searching for changes
148 searching for changes
149 4 changesets found
149 4 changesets found
150 adding changesets
150 adding changesets
151 adding manifests
151 adding manifests
152 adding file changes
152 adding file changes
153 added 4 changesets with 5 changes to 2 files
153 added 4 changesets with 5 changes to 2 files
154 (run 'hg update' to get a working copy)
154 (run 'hg update' to get a working copy)
155 checking changesets
155 checking changesets
156 checking manifests
156 checking manifests
157 crosschecking files in changesets and manifests
157 crosschecking files in changesets and manifests
158 checking files
158 checking files
159 2 files, 4 changesets, 5 total revisions
159 2 files, 4 changesets, 5 total revisions
160 3:7373c1169842
160 3:7373c1169842
161 searching for changes
161 searching for changes
162 5 changesets found
162 5 changesets found
163 adding changesets
163 adding changesets
164 adding manifests
164 adding manifests
165 adding file changes
165 adding file changes
166 added 5 changesets with 6 changes to 3 files
166 added 5 changesets with 6 changes to 3 files
167 (run 'hg update' to get a working copy)
167 (run 'hg update' to get a working copy)
168 checking changesets
168 checking changesets
169 checking manifests
169 checking manifests
170 crosschecking files in changesets and manifests
170 crosschecking files in changesets and manifests
171 checking files
171 checking files
172 3 files, 5 changesets, 6 total revisions
172 3 files, 5 changesets, 6 total revisions
173 4:a6a34bfa0076
173 4:a6a34bfa0076
174 searching for changes
174 searching for changes
175 5 changesets found
175 5 changesets found
176 adding changesets
176 adding changesets
177 adding manifests
177 adding manifests
178 adding file changes
178 adding file changes
179 added 5 changesets with 5 changes to 2 files
179 added 5 changesets with 5 changes to 2 files
180 (run 'hg update' to get a working copy)
180 (run 'hg update' to get a working copy)
181 checking changesets
181 checking changesets
182 checking manifests
182 checking manifests
183 crosschecking files in changesets and manifests
183 crosschecking files in changesets and manifests
184 checking files
184 checking files
185 2 files, 5 changesets, 5 total revisions
185 2 files, 5 changesets, 5 total revisions
186 4:aa35859c02ea
186 4:aa35859c02ea
187 $ cd test-8
187 $ cd test-8
188 $ hg pull ../test-7
188 $ hg pull ../test-7
189 pulling from ../test-7
189 pulling from ../test-7
190 searching for changes
190 searching for changes
191 adding changesets
191 adding changesets
192 adding manifests
192 adding manifests
193 adding file changes
193 adding file changes
194 added 4 changesets with 2 changes to 3 files (+1 heads)
194 added 4 changesets with 2 changes to 3 files (+1 heads)
195 (run 'hg heads' to see heads, 'hg merge' to merge)
195 (run 'hg heads' to see heads, 'hg merge' to merge)
196 $ hg verify
196 $ hg verify
197 checking changesets
197 checking changesets
198 checking manifests
198 checking manifests
199 crosschecking files in changesets and manifests
199 crosschecking files in changesets and manifests
200 checking files
200 checking files
201 4 files, 9 changesets, 7 total revisions
201 4 files, 9 changesets, 7 total revisions
202 $ hg rollback
202 $ hg rollback
203 rolling back to revision 4 (undo pull)
203 rolling back to revision 4 (undo pull)
204 $ cd ..
204 $ cd ..
205
205
206 should fail
206 should fail
207
207
208 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
208 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
209 abort: --base is incompatible with specifying a destination
209 abort: --base is incompatible with specifying a destination
210 [255]
210 [255]
211 $ hg -R test bundle -r tip test-bundle-branch1.hg
211 $ hg -R test bundle -r tip test-bundle-branch1.hg
212 abort: repository default-push not found!
212 abort: repository default-push not found!
213 [255]
213 [255]
214
214
215 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
215 $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
216 2 changesets found
216 2 changesets found
217 $ hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
217 $ hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
218 4 changesets found
218 4 changesets found
219 $ hg -R test bundle --base 2 test-bundle-all.hg
219 $ hg -R test bundle --base 2 test-bundle-all.hg
220 6 changesets found
220 6 changesets found
221 $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
221 $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
222 1 changesets found
222 1 changesets found
223
223
224 empty bundle
224 empty bundle
225
225
226 $ hg -R test bundle --base 7 --base 8 test-bundle-empty.hg
226 $ hg -R test bundle --base 7 --base 8 test-bundle-empty.hg
227 no changes found
227 no changes found
228 [1]
228 [1]
229
229
230 issue76 msg2163
230 issue76 msg2163
231
231
232 $ hg -R test bundle --base 3 -r 3 -r 3 test-bundle-cset-3.hg
232 $ hg -R test bundle --base 3 -r 3 -r 3 test-bundle-cset-3.hg
233 1 changesets found
233 1 changesets found
234
234
235 Issue1910: 'hg bundle --base $head' does not exclude $head from
235 Issue1910: 'hg bundle --base $head' does not exclude $head from
236 result
236 result
237
237
238 $ hg -R test bundle --base 7 test-bundle-cset-7.hg
238 $ hg -R test bundle --base 7 test-bundle-cset-7.hg
239 4 changesets found
239 4 changesets found
240
240
241 $ hg clone test-2 test-9
241 $ hg clone test-2 test-9
242 updating to branch default
242 updating to branch default
243 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
243 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
244 $ cd test-9
244 $ cd test-9
245
245
246 revision 2
246 revision 2
247
247
248 $ hg tip -q
248 $ hg tip -q
249 2:e38ba6f5b7e0
249 2:e38ba6f5b7e0
250 $ hg unbundle ../test-bundle-should-fail.hg
250 $ hg unbundle ../test-bundle-should-fail.hg
251 adding changesets
251 adding changesets
252 transaction abort!
252 transaction abort!
253 rollback completed
253 rollback completed
254 abort: 00changelog.i@eebf5a27f8ca: unknown parent!
254 abort: 00changelog.i@eebf5a27f8ca: unknown parent!
255 [255]
255 [255]
256
256
257 revision 2
257 revision 2
258
258
259 $ hg tip -q
259 $ hg tip -q
260 2:e38ba6f5b7e0
260 2:e38ba6f5b7e0
261 $ hg unbundle ../test-bundle-all.hg
261 $ hg unbundle ../test-bundle-all.hg
262 adding changesets
262 adding changesets
263 adding manifests
263 adding manifests
264 adding file changes
264 adding file changes
265 added 6 changesets with 4 changes to 4 files (+1 heads)
265 added 6 changesets with 4 changes to 4 files (+1 heads)
266 (run 'hg heads' to see heads, 'hg merge' to merge)
266 (run 'hg heads' to see heads, 'hg merge' to merge)
267
267
268 revision 8
268 revision 8
269
269
270 $ hg tip -q
270 $ hg tip -q
271 8:aa35859c02ea
271 8:aa35859c02ea
272 $ hg verify
272 $ hg verify
273 checking changesets
273 checking changesets
274 checking manifests
274 checking manifests
275 crosschecking files in changesets and manifests
275 crosschecking files in changesets and manifests
276 checking files
276 checking files
277 4 files, 9 changesets, 7 total revisions
277 4 files, 9 changesets, 7 total revisions
278 $ hg rollback
278 $ hg rollback
279 rolling back to revision 2 (undo unbundle)
279 rolling back to revision 2 (undo unbundle)
280
280
281 revision 2
281 revision 2
282
282
283 $ hg tip -q
283 $ hg tip -q
284 2:e38ba6f5b7e0
284 2:e38ba6f5b7e0
285 $ hg unbundle ../test-bundle-branch1.hg
285 $ hg unbundle ../test-bundle-branch1.hg
286 adding changesets
286 adding changesets
287 adding manifests
287 adding manifests
288 adding file changes
288 adding file changes
289 added 2 changesets with 2 changes to 2 files
289 added 2 changesets with 2 changes to 2 files
290 (run 'hg update' to get a working copy)
290 (run 'hg update' to get a working copy)
291
291
292 revision 4
292 revision 4
293
293
294 $ hg tip -q
294 $ hg tip -q
295 4:aa35859c02ea
295 4:aa35859c02ea
296 $ hg verify
296 $ hg verify
297 checking changesets
297 checking changesets
298 checking manifests
298 checking manifests
299 crosschecking files in changesets and manifests
299 crosschecking files in changesets and manifests
300 checking files
300 checking files
301 2 files, 5 changesets, 5 total revisions
301 2 files, 5 changesets, 5 total revisions
302 $ hg rollback
302 $ hg rollback
303 rolling back to revision 2 (undo unbundle)
303 rolling back to revision 2 (undo unbundle)
304 $ hg unbundle ../test-bundle-branch2.hg
304 $ hg unbundle ../test-bundle-branch2.hg
305 adding changesets
305 adding changesets
306 adding manifests
306 adding manifests
307 adding file changes
307 adding file changes
308 added 4 changesets with 3 changes to 3 files (+1 heads)
308 added 4 changesets with 3 changes to 3 files (+1 heads)
309 (run 'hg heads' to see heads, 'hg merge' to merge)
309 (run 'hg heads' to see heads, 'hg merge' to merge)
310
310
311 revision 6
311 revision 6
312
312
313 $ hg tip -q
313 $ hg tip -q
314 6:a6a34bfa0076
314 6:a6a34bfa0076
315 $ hg verify
315 $ hg verify
316 checking changesets
316 checking changesets
317 checking manifests
317 checking manifests
318 crosschecking files in changesets and manifests
318 crosschecking files in changesets and manifests
319 checking files
319 checking files
320 3 files, 7 changesets, 6 total revisions
320 3 files, 7 changesets, 6 total revisions
321 $ hg rollback
321 $ hg rollback
322 rolling back to revision 2 (undo unbundle)
322 rolling back to revision 2 (undo unbundle)
323 $ hg unbundle ../test-bundle-cset-7.hg
323 $ hg unbundle ../test-bundle-cset-7.hg
324 adding changesets
324 adding changesets
325 adding manifests
325 adding manifests
326 adding file changes
326 adding file changes
327 added 2 changesets with 2 changes to 2 files
327 added 2 changesets with 2 changes to 2 files
328 (run 'hg update' to get a working copy)
328 (run 'hg update' to get a working copy)
329
329
330 revision 4
330 revision 4
331
331
332 $ hg tip -q
332 $ hg tip -q
333 4:aa35859c02ea
333 4:aa35859c02ea
334 $ hg verify
334 $ hg verify
335 checking changesets
335 checking changesets
336 checking manifests
336 checking manifests
337 crosschecking files in changesets and manifests
337 crosschecking files in changesets and manifests
338 checking files
338 checking files
339 2 files, 5 changesets, 5 total revisions
339 2 files, 5 changesets, 5 total revisions
340
340
341 $ cd ../test
341 $ cd ../test
342 $ hg merge 7
342 $ hg merge 7
343 warning: detected divergent renames of afile to:
343 note: possible conflict - afile was renamed multiple times to:
344 anotherfile
344 anotherfile
345 adifferentfile
345 adifferentfile
346 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
346 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
347 (branch merge, don't forget to commit)
347 (branch merge, don't forget to commit)
348 $ hg ci -m merge
348 $ hg ci -m merge
349 $ cd ..
349 $ cd ..
350 $ hg -R test bundle --base 2 test-bundle-head.hg
350 $ hg -R test bundle --base 2 test-bundle-head.hg
351 7 changesets found
351 7 changesets found
352 $ hg clone test-2 test-10
352 $ hg clone test-2 test-10
353 updating to branch default
353 updating to branch default
354 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
354 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
355 $ cd test-10
355 $ cd test-10
356 $ hg unbundle ../test-bundle-head.hg
356 $ hg unbundle ../test-bundle-head.hg
357 adding changesets
357 adding changesets
358 adding manifests
358 adding manifests
359 adding file changes
359 adding file changes
360 added 7 changesets with 4 changes to 4 files
360 added 7 changesets with 4 changes to 4 files
361 (run 'hg update' to get a working copy)
361 (run 'hg update' to get a working copy)
362
362
363 revision 9
363 revision 9
364
364
365 $ hg tip -q
365 $ hg tip -q
366 9:905597b0d5d4
366 9:905597b0d5d4
367 $ hg verify
367 $ hg verify
368 checking changesets
368 checking changesets
369 checking manifests
369 checking manifests
370 crosschecking files in changesets and manifests
370 crosschecking files in changesets and manifests
371 checking files
371 checking files
372 4 files, 10 changesets, 7 total revisions
372 4 files, 10 changesets, 7 total revisions
@@ -1,53 +1,53 b''
1 http://mercurial.selenic.com/bts/issue1175
1 http://mercurial.selenic.com/bts/issue1175
2
2
3 $ hg init
3 $ hg init
4 $ touch a
4 $ touch a
5 $ hg ci -Am0
5 $ hg ci -Am0
6 adding a
6 adding a
7
7
8 $ hg mv a a1
8 $ hg mv a a1
9 $ hg ci -m1
9 $ hg ci -m1
10
10
11 $ hg co 0
11 $ hg co 0
12 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
12 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
13
13
14 $ hg mv a a2
14 $ hg mv a a2
15 $ hg up
15 $ hg up
16 warning: detected divergent renames of a to:
16 note: possible conflict - a was renamed multiple times to:
17 a2
17 a2
18 a1
18 a1
19 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
19 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
20
20
21 $ hg ci -m2
21 $ hg ci -m2
22
22
23 $ touch a
23 $ touch a
24 $ hg ci -Am3
24 $ hg ci -Am3
25 adding a
25 adding a
26
26
27 $ hg mv a b
27 $ hg mv a b
28 $ hg ci -Am4 a
28 $ hg ci -Am4 a
29
29
30 $ hg ci --debug --traceback -Am5 b
30 $ hg ci --debug --traceback -Am5 b
31 b
31 b
32 b: searching for copy revision for a
32 b: searching for copy revision for a
33 b: copy a:b80de5d138758541c5f05265ad144ab9fa86d1db
33 b: copy a:b80de5d138758541c5f05265ad144ab9fa86d1db
34 committed changeset 5:89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
34 committed changeset 5:89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
35
35
36 $ hg verify
36 $ hg verify
37 checking changesets
37 checking changesets
38 checking manifests
38 checking manifests
39 crosschecking files in changesets and manifests
39 crosschecking files in changesets and manifests
40 checking files
40 checking files
41 4 files, 6 changesets, 4 total revisions
41 4 files, 6 changesets, 4 total revisions
42
42
43 $ hg export --git tip
43 $ hg export --git tip
44 # HG changeset patch
44 # HG changeset patch
45 # User test
45 # User test
46 # Date 0 0
46 # Date 0 0
47 # Node ID 89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
47 # Node ID 89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
48 # Parent 7fc86ba705e717a721dbc361bf8c9bc05a18ca2f
48 # Parent 7fc86ba705e717a721dbc361bf8c9bc05a18ca2f
49 5
49 5
50
50
51 diff --git a/b b/b
51 diff --git a/b b/b
52 new file mode 100644
52 new file mode 100644
53
53
@@ -1,101 +1,101 b''
1 $ hg init
1 $ hg init
2
2
3 $ echo "[merge]" >> .hg/hgrc
3 $ echo "[merge]" >> .hg/hgrc
4 $ echo "followcopies = 1" >> .hg/hgrc
4 $ echo "followcopies = 1" >> .hg/hgrc
5
5
6 $ echo foo > a
6 $ echo foo > a
7 $ echo foo > a2
7 $ echo foo > a2
8 $ hg add a a2
8 $ hg add a a2
9 $ hg ci -m "start"
9 $ hg ci -m "start"
10
10
11 $ hg mv a b
11 $ hg mv a b
12 $ hg mv a2 b2
12 $ hg mv a2 b2
13 $ hg ci -m "rename"
13 $ hg ci -m "rename"
14
14
15 $ hg co 0
15 $ hg co 0
16 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
16 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
17
17
18 $ echo blahblah > a
18 $ echo blahblah > a
19 $ echo blahblah > a2
19 $ echo blahblah > a2
20 $ hg mv a2 c2
20 $ hg mv a2 c2
21 $ hg ci -m "modify"
21 $ hg ci -m "modify"
22 created new head
22 created new head
23
23
24 $ hg merge -y --debug
24 $ hg merge -y --debug
25 searching for copies back to rev 1
25 searching for copies back to rev 1
26 unmatched files in local:
26 unmatched files in local:
27 c2
27 c2
28 unmatched files in other:
28 unmatched files in other:
29 b
29 b
30 b2
30 b2
31 all copies found (* = to merge, ! = divergent):
31 all copies found (* = to merge, ! = divergent):
32 c2 -> a2 !
32 c2 -> a2 !
33 b -> a *
33 b -> a *
34 b2 -> a2 !
34 b2 -> a2 !
35 checking for directory renames
35 checking for directory renames
36 a2: divergent renames -> dr
36 a2: divergent renames -> dr
37 resolving manifests
37 resolving manifests
38 overwrite None partial False
38 overwrite None partial False
39 ancestor af1939970a1c local 044f8520aeeb+ remote 85c198ef2f6c
39 ancestor af1939970a1c local 044f8520aeeb+ remote 85c198ef2f6c
40 a: remote moved to b -> m
40 a: remote moved to b -> m
41 b2: remote created -> g
41 b2: remote created -> g
42 preserving a for resolve of b
42 preserving a for resolve of b
43 removing a
43 removing a
44 updating: a 1/3 files (33.33%)
44 updating: a 1/3 files (33.33%)
45 picked tool 'internal:merge' for b (binary False symlink False)
45 picked tool 'internal:merge' for b (binary False symlink False)
46 merging a and b to b
46 merging a and b to b
47 my b@044f8520aeeb+ other b@85c198ef2f6c ancestor a@af1939970a1c
47 my b@044f8520aeeb+ other b@85c198ef2f6c ancestor a@af1939970a1c
48 premerge successful
48 premerge successful
49 updating: a2 2/3 files (66.67%)
49 updating: a2 2/3 files (66.67%)
50 warning: detected divergent renames of a2 to:
50 note: possible conflict - a2 was renamed multiple times to:
51 c2
51 c2
52 b2
52 b2
53 updating: b2 3/3 files (100.00%)
53 updating: b2 3/3 files (100.00%)
54 getting b2
54 getting b2
55 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
55 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
56 (branch merge, don't forget to commit)
56 (branch merge, don't forget to commit)
57
57
58 $ hg status -AC
58 $ hg status -AC
59 M b
59 M b
60 a
60 a
61 M b2
61 M b2
62 R a
62 R a
63 C c2
63 C c2
64
64
65 $ cat b
65 $ cat b
66 blahblah
66 blahblah
67
67
68 $ hg ci -m "merge"
68 $ hg ci -m "merge"
69
69
70 $ hg debugindex .hg/store/data/b.i
70 $ hg debugindex .hg/store/data/b.i
71 rev offset length base linkrev nodeid p1 p2
71 rev offset length base linkrev nodeid p1 p2
72 0 0 67 0 1 57eacc201a7f 000000000000 000000000000
72 0 0 67 0 1 57eacc201a7f 000000000000 000000000000
73 1 67 72 1 3 4727ba907962 000000000000 57eacc201a7f
73 1 67 72 1 3 4727ba907962 000000000000 57eacc201a7f
74
74
75 $ hg debugrename b
75 $ hg debugrename b
76 b renamed from a:dd03b83622e78778b403775d0d074b9ac7387a66
76 b renamed from a:dd03b83622e78778b403775d0d074b9ac7387a66
77
77
78 This used to trigger a "divergent renames" warning, despite no renames
78 This used to trigger a "divergent renames" warning, despite no renames
79
79
80 $ hg cp b b3
80 $ hg cp b b3
81 $ hg cp b b4
81 $ hg cp b b4
82 $ hg ci -A -m 'copy b twice'
82 $ hg ci -A -m 'copy b twice'
83 $ hg up eb92d88a9712
83 $ hg up eb92d88a9712
84 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
84 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
85 $ hg up
85 $ hg up
86 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
86 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
87 $ hg rm b3 b4
87 $ hg rm b3 b4
88 $ hg ci -m 'clean up a bit of our mess'
88 $ hg ci -m 'clean up a bit of our mess'
89
89
90 We'd rather not warn on divergent renames done in the same changeset (issue2113)
90 We'd rather not warn on divergent renames done in the same changeset (issue2113)
91
91
92 $ hg cp b b3
92 $ hg cp b b3
93 $ hg mv b b4
93 $ hg mv b b4
94 $ hg ci -A -m 'divergent renames in same changeset'
94 $ hg ci -A -m 'divergent renames in same changeset'
95 $ hg up c761c6948de0
95 $ hg up c761c6948de0
96 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
96 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
97 $ hg up
97 $ hg up
98 warning: detected divergent renames of b to:
98 note: possible conflict - b was renamed multiple times to:
99 b3
99 b3
100 b4
100 b4
101 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
101 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -1,754 +1,754 b''
1
1
2 $ mkdir -p t
2 $ mkdir -p t
3 $ cd t
3 $ cd t
4 $ cat <<EOF > merge
4 $ cat <<EOF > merge
5 > import sys, os
5 > import sys, os
6 > f = open(sys.argv[1], "wb")
6 > f = open(sys.argv[1], "wb")
7 > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
7 > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
8 > f.close()
8 > f.close()
9 > EOF
9 > EOF
10 $ HGMERGE="python ../merge"; export HGMERGE
10 $ HGMERGE="python ../merge"; export HGMERGE
11
11
12 perform a test merge with possible renaming
12 perform a test merge with possible renaming
13 args:
13 args:
14 $1 = action in local branch
14 $1 = action in local branch
15 $2 = action in remote branch
15 $2 = action in remote branch
16 $3 = action in working dir
16 $3 = action in working dir
17 $4 = expected result
17 $4 = expected result
18
18
19 $ tm()
19 $ tm()
20 > {
20 > {
21 > mkdir t
21 > mkdir t
22 > cd t
22 > cd t
23 > hg init
23 > hg init
24 > echo "[merge]" >> .hg/hgrc
24 > echo "[merge]" >> .hg/hgrc
25 > echo "followcopies = 1" >> .hg/hgrc
25 > echo "followcopies = 1" >> .hg/hgrc
26 >
26 >
27 > # base
27 > # base
28 > echo base > a
28 > echo base > a
29 > echo base > rev # used to force commits
29 > echo base > rev # used to force commits
30 > hg add a rev
30 > hg add a rev
31 > hg ci -m "base"
31 > hg ci -m "base"
32 >
32 >
33 > # remote
33 > # remote
34 > echo remote > rev
34 > echo remote > rev
35 > if [ "$2" != "" ] ; then $2 ; fi
35 > if [ "$2" != "" ] ; then $2 ; fi
36 > hg ci -m "remote"
36 > hg ci -m "remote"
37 >
37 >
38 > # local
38 > # local
39 > hg co -q 0
39 > hg co -q 0
40 > echo local > rev
40 > echo local > rev
41 > if [ "$1" != "" ] ; then $1 ; fi
41 > if [ "$1" != "" ] ; then $1 ; fi
42 > hg ci -m "local"
42 > hg ci -m "local"
43 >
43 >
44 > # working dir
44 > # working dir
45 > echo local > rev
45 > echo local > rev
46 > if [ "$3" != "" ] ; then $3 ; fi
46 > if [ "$3" != "" ] ; then $3 ; fi
47 >
47 >
48 > # merge
48 > # merge
49 > echo "--------------"
49 > echo "--------------"
50 > echo "test L:$1 R:$2 W:$3 - $4"
50 > echo "test L:$1 R:$2 W:$3 - $4"
51 > echo "--------------"
51 > echo "--------------"
52 > hg merge -y --debug --traceback
52 > hg merge -y --debug --traceback
53 >
53 >
54 > echo "--------------"
54 > echo "--------------"
55 > hg status -camC -X rev
55 > hg status -camC -X rev
56 >
56 >
57 > hg ci -m "merge"
57 > hg ci -m "merge"
58 >
58 >
59 > echo "--------------"
59 > echo "--------------"
60 > echo
60 > echo
61 >
61 >
62 > cd ..
62 > cd ..
63 > rm -r t
63 > rm -r t
64 > }
64 > }
65 $ up() {
65 $ up() {
66 > cp rev $1
66 > cp rev $1
67 > hg add $1 2> /dev/null
67 > hg add $1 2> /dev/null
68 > if [ "$2" != "" ] ; then
68 > if [ "$2" != "" ] ; then
69 > cp rev $2
69 > cp rev $2
70 > hg add $2 2> /dev/null
70 > hg add $2 2> /dev/null
71 > fi
71 > fi
72 > }
72 > }
73 $ uc() { up $1; hg cp $1 $2; } # update + copy
73 $ uc() { up $1; hg cp $1 $2; } # update + copy
74 $ um() { up $1; hg mv $1 $2; }
74 $ um() { up $1; hg mv $1 $2; }
75 $ nc() { hg cp $1 $2; } # just copy
75 $ nc() { hg cp $1 $2; } # just copy
76 $ nm() { hg mv $1 $2; } # just move
76 $ nm() { hg mv $1 $2; } # just move
77 $ tm "up a " "nc a b" " " "1 get local a to b"
77 $ tm "up a " "nc a b" " " "1 get local a to b"
78 created new head
78 created new head
79 --------------
79 --------------
80 test L:up a R:nc a b W: - 1 get local a to b
80 test L:up a R:nc a b W: - 1 get local a to b
81 --------------
81 --------------
82 searching for copies back to rev 1
82 searching for copies back to rev 1
83 unmatched files in other:
83 unmatched files in other:
84 b
84 b
85 all copies found (* = to merge, ! = divergent):
85 all copies found (* = to merge, ! = divergent):
86 b -> a *
86 b -> a *
87 checking for directory renames
87 checking for directory renames
88 resolving manifests
88 resolving manifests
89 overwrite None partial False
89 overwrite None partial False
90 ancestor 924404dff337 local e300d1c794ec+ remote 4ce40f5aca24
90 ancestor 924404dff337 local e300d1c794ec+ remote 4ce40f5aca24
91 rev: versions differ -> m
91 rev: versions differ -> m
92 a: remote copied to b -> m
92 a: remote copied to b -> m
93 preserving a for resolve of b
93 preserving a for resolve of b
94 preserving rev for resolve of rev
94 preserving rev for resolve of rev
95 updating: a 1/2 files (50.00%)
95 updating: a 1/2 files (50.00%)
96 picked tool 'python ../merge' for b (binary False symlink False)
96 picked tool 'python ../merge' for b (binary False symlink False)
97 merging a and b to b
97 merging a and b to b
98 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
98 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
99 premerge successful
99 premerge successful
100 updating: rev 2/2 files (100.00%)
100 updating: rev 2/2 files (100.00%)
101 picked tool 'python ../merge' for rev (binary False symlink False)
101 picked tool 'python ../merge' for rev (binary False symlink False)
102 merging rev
102 merging rev
103 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
103 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
104 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
104 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
105 (branch merge, don't forget to commit)
105 (branch merge, don't forget to commit)
106 --------------
106 --------------
107 M b
107 M b
108 a
108 a
109 C a
109 C a
110 --------------
110 --------------
111
111
112 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
112 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
113 created new head
113 created new head
114 --------------
114 --------------
115 test L:nc a b R:up a W: - 2 get rem change to a and b
115 test L:nc a b R:up a W: - 2 get rem change to a and b
116 --------------
116 --------------
117 searching for copies back to rev 1
117 searching for copies back to rev 1
118 unmatched files in local:
118 unmatched files in local:
119 b
119 b
120 all copies found (* = to merge, ! = divergent):
120 all copies found (* = to merge, ! = divergent):
121 b -> a *
121 b -> a *
122 checking for directory renames
122 checking for directory renames
123 resolving manifests
123 resolving manifests
124 overwrite None partial False
124 overwrite None partial False
125 ancestor 924404dff337 local 86a2aa42fc76+ remote f4db7e329e71
125 ancestor 924404dff337 local 86a2aa42fc76+ remote f4db7e329e71
126 a: remote is newer -> g
126 a: remote is newer -> g
127 b: local copied/moved to a -> m
127 b: local copied/moved to a -> m
128 rev: versions differ -> m
128 rev: versions differ -> m
129 preserving b for resolve of b
129 preserving b for resolve of b
130 preserving rev for resolve of rev
130 preserving rev for resolve of rev
131 updating: a 1/3 files (33.33%)
131 updating: a 1/3 files (33.33%)
132 getting a
132 getting a
133 updating: b 2/3 files (66.67%)
133 updating: b 2/3 files (66.67%)
134 picked tool 'python ../merge' for b (binary False symlink False)
134 picked tool 'python ../merge' for b (binary False symlink False)
135 merging b and a to b
135 merging b and a to b
136 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
136 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
137 premerge successful
137 premerge successful
138 updating: rev 3/3 files (100.00%)
138 updating: rev 3/3 files (100.00%)
139 picked tool 'python ../merge' for rev (binary False symlink False)
139 picked tool 'python ../merge' for rev (binary False symlink False)
140 merging rev
140 merging rev
141 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
141 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
142 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
142 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
143 (branch merge, don't forget to commit)
143 (branch merge, don't forget to commit)
144 --------------
144 --------------
145 M a
145 M a
146 M b
146 M b
147 a
147 a
148 --------------
148 --------------
149
149
150 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
150 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
151 created new head
151 created new head
152 --------------
152 --------------
153 test L:up a R:nm a b W: - 3 get local a change to b, remove a
153 test L:up a R:nm a b W: - 3 get local a change to b, remove a
154 --------------
154 --------------
155 searching for copies back to rev 1
155 searching for copies back to rev 1
156 unmatched files in other:
156 unmatched files in other:
157 b
157 b
158 all copies found (* = to merge, ! = divergent):
158 all copies found (* = to merge, ! = divergent):
159 b -> a *
159 b -> a *
160 checking for directory renames
160 checking for directory renames
161 resolving manifests
161 resolving manifests
162 overwrite None partial False
162 overwrite None partial False
163 ancestor 924404dff337 local e300d1c794ec+ remote bdb19105162a
163 ancestor 924404dff337 local e300d1c794ec+ remote bdb19105162a
164 rev: versions differ -> m
164 rev: versions differ -> m
165 a: remote moved to b -> m
165 a: remote moved to b -> m
166 preserving a for resolve of b
166 preserving a for resolve of b
167 preserving rev for resolve of rev
167 preserving rev for resolve of rev
168 removing a
168 removing a
169 updating: a 1/2 files (50.00%)
169 updating: a 1/2 files (50.00%)
170 picked tool 'python ../merge' for b (binary False symlink False)
170 picked tool 'python ../merge' for b (binary False symlink False)
171 merging a and b to b
171 merging a and b to b
172 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
172 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
173 premerge successful
173 premerge successful
174 updating: rev 2/2 files (100.00%)
174 updating: rev 2/2 files (100.00%)
175 picked tool 'python ../merge' for rev (binary False symlink False)
175 picked tool 'python ../merge' for rev (binary False symlink False)
176 merging rev
176 merging rev
177 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
177 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
178 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
178 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
179 (branch merge, don't forget to commit)
179 (branch merge, don't forget to commit)
180 --------------
180 --------------
181 M b
181 M b
182 a
182 a
183 --------------
183 --------------
184
184
185 $ tm "nm a b" "up a " " " "4 get remote change to b"
185 $ tm "nm a b" "up a " " " "4 get remote change to b"
186 created new head
186 created new head
187 --------------
187 --------------
188 test L:nm a b R:up a W: - 4 get remote change to b
188 test L:nm a b R:up a W: - 4 get remote change to b
189 --------------
189 --------------
190 searching for copies back to rev 1
190 searching for copies back to rev 1
191 unmatched files in local:
191 unmatched files in local:
192 b
192 b
193 all copies found (* = to merge, ! = divergent):
193 all copies found (* = to merge, ! = divergent):
194 b -> a *
194 b -> a *
195 checking for directory renames
195 checking for directory renames
196 resolving manifests
196 resolving manifests
197 overwrite None partial False
197 overwrite None partial False
198 ancestor 924404dff337 local 02963e448370+ remote f4db7e329e71
198 ancestor 924404dff337 local 02963e448370+ remote f4db7e329e71
199 b: local copied/moved to a -> m
199 b: local copied/moved to a -> m
200 rev: versions differ -> m
200 rev: versions differ -> m
201 preserving b for resolve of b
201 preserving b for resolve of b
202 preserving rev for resolve of rev
202 preserving rev for resolve of rev
203 updating: b 1/2 files (50.00%)
203 updating: b 1/2 files (50.00%)
204 picked tool 'python ../merge' for b (binary False symlink False)
204 picked tool 'python ../merge' for b (binary False symlink False)
205 merging b and a to b
205 merging b and a to b
206 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
206 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
207 premerge successful
207 premerge successful
208 updating: rev 2/2 files (100.00%)
208 updating: rev 2/2 files (100.00%)
209 picked tool 'python ../merge' for rev (binary False symlink False)
209 picked tool 'python ../merge' for rev (binary False symlink False)
210 merging rev
210 merging rev
211 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
211 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
212 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
212 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
213 (branch merge, don't forget to commit)
213 (branch merge, don't forget to commit)
214 --------------
214 --------------
215 M b
215 M b
216 a
216 a
217 --------------
217 --------------
218
218
219 $ tm " " "nc a b" " " "5 get b"
219 $ tm " " "nc a b" " " "5 get b"
220 created new head
220 created new head
221 --------------
221 --------------
222 test L: R:nc a b W: - 5 get b
222 test L: R:nc a b W: - 5 get b
223 --------------
223 --------------
224 searching for copies back to rev 1
224 searching for copies back to rev 1
225 unmatched files in other:
225 unmatched files in other:
226 b
226 b
227 all copies found (* = to merge, ! = divergent):
227 all copies found (* = to merge, ! = divergent):
228 b -> a
228 b -> a
229 checking for directory renames
229 checking for directory renames
230 resolving manifests
230 resolving manifests
231 overwrite None partial False
231 overwrite None partial False
232 ancestor 924404dff337 local 94b33a1b7f2d+ remote 4ce40f5aca24
232 ancestor 924404dff337 local 94b33a1b7f2d+ remote 4ce40f5aca24
233 rev: versions differ -> m
233 rev: versions differ -> m
234 b: remote created -> g
234 b: remote created -> g
235 preserving rev for resolve of rev
235 preserving rev for resolve of rev
236 updating: b 1/2 files (50.00%)
236 updating: b 1/2 files (50.00%)
237 getting b
237 getting b
238 updating: rev 2/2 files (100.00%)
238 updating: rev 2/2 files (100.00%)
239 picked tool 'python ../merge' for rev (binary False symlink False)
239 picked tool 'python ../merge' for rev (binary False symlink False)
240 merging rev
240 merging rev
241 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
241 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
242 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
242 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
243 (branch merge, don't forget to commit)
243 (branch merge, don't forget to commit)
244 --------------
244 --------------
245 M b
245 M b
246 C a
246 C a
247 --------------
247 --------------
248
248
249 $ tm "nc a b" " " " " "6 nothing"
249 $ tm "nc a b" " " " " "6 nothing"
250 created new head
250 created new head
251 --------------
251 --------------
252 test L:nc a b R: W: - 6 nothing
252 test L:nc a b R: W: - 6 nothing
253 --------------
253 --------------
254 searching for copies back to rev 1
254 searching for copies back to rev 1
255 unmatched files in local:
255 unmatched files in local:
256 b
256 b
257 all copies found (* = to merge, ! = divergent):
257 all copies found (* = to merge, ! = divergent):
258 b -> a
258 b -> a
259 checking for directory renames
259 checking for directory renames
260 resolving manifests
260 resolving manifests
261 overwrite None partial False
261 overwrite None partial False
262 ancestor 924404dff337 local 86a2aa42fc76+ remote 97c705ade336
262 ancestor 924404dff337 local 86a2aa42fc76+ remote 97c705ade336
263 rev: versions differ -> m
263 rev: versions differ -> m
264 preserving rev for resolve of rev
264 preserving rev for resolve of rev
265 updating: rev 1/1 files (100.00%)
265 updating: rev 1/1 files (100.00%)
266 picked tool 'python ../merge' for rev (binary False symlink False)
266 picked tool 'python ../merge' for rev (binary False symlink False)
267 merging rev
267 merging rev
268 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
268 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
269 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
269 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
270 (branch merge, don't forget to commit)
270 (branch merge, don't forget to commit)
271 --------------
271 --------------
272 C a
272 C a
273 C b
273 C b
274 --------------
274 --------------
275
275
276 $ tm " " "nm a b" " " "7 get b"
276 $ tm " " "nm a b" " " "7 get b"
277 created new head
277 created new head
278 --------------
278 --------------
279 test L: R:nm a b W: - 7 get b
279 test L: R:nm a b W: - 7 get b
280 --------------
280 --------------
281 searching for copies back to rev 1
281 searching for copies back to rev 1
282 unmatched files in other:
282 unmatched files in other:
283 b
283 b
284 all copies found (* = to merge, ! = divergent):
284 all copies found (* = to merge, ! = divergent):
285 b -> a
285 b -> a
286 checking for directory renames
286 checking for directory renames
287 resolving manifests
287 resolving manifests
288 overwrite None partial False
288 overwrite None partial False
289 ancestor 924404dff337 local 94b33a1b7f2d+ remote bdb19105162a
289 ancestor 924404dff337 local 94b33a1b7f2d+ remote bdb19105162a
290 a: other deleted -> r
290 a: other deleted -> r
291 rev: versions differ -> m
291 rev: versions differ -> m
292 b: remote created -> g
292 b: remote created -> g
293 preserving rev for resolve of rev
293 preserving rev for resolve of rev
294 updating: a 1/3 files (33.33%)
294 updating: a 1/3 files (33.33%)
295 removing a
295 removing a
296 updating: b 2/3 files (66.67%)
296 updating: b 2/3 files (66.67%)
297 getting b
297 getting b
298 updating: rev 3/3 files (100.00%)
298 updating: rev 3/3 files (100.00%)
299 picked tool 'python ../merge' for rev (binary False symlink False)
299 picked tool 'python ../merge' for rev (binary False symlink False)
300 merging rev
300 merging rev
301 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
301 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
302 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
302 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
303 (branch merge, don't forget to commit)
303 (branch merge, don't forget to commit)
304 --------------
304 --------------
305 M b
305 M b
306 --------------
306 --------------
307
307
308 $ tm "nm a b" " " " " "8 nothing"
308 $ tm "nm a b" " " " " "8 nothing"
309 created new head
309 created new head
310 --------------
310 --------------
311 test L:nm a b R: W: - 8 nothing
311 test L:nm a b R: W: - 8 nothing
312 --------------
312 --------------
313 searching for copies back to rev 1
313 searching for copies back to rev 1
314 unmatched files in local:
314 unmatched files in local:
315 b
315 b
316 all copies found (* = to merge, ! = divergent):
316 all copies found (* = to merge, ! = divergent):
317 b -> a
317 b -> a
318 checking for directory renames
318 checking for directory renames
319 resolving manifests
319 resolving manifests
320 overwrite None partial False
320 overwrite None partial False
321 ancestor 924404dff337 local 02963e448370+ remote 97c705ade336
321 ancestor 924404dff337 local 02963e448370+ remote 97c705ade336
322 rev: versions differ -> m
322 rev: versions differ -> m
323 preserving rev for resolve of rev
323 preserving rev for resolve of rev
324 updating: rev 1/1 files (100.00%)
324 updating: rev 1/1 files (100.00%)
325 picked tool 'python ../merge' for rev (binary False symlink False)
325 picked tool 'python ../merge' for rev (binary False symlink False)
326 merging rev
326 merging rev
327 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
327 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
328 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
328 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
329 (branch merge, don't forget to commit)
329 (branch merge, don't forget to commit)
330 --------------
330 --------------
331 C b
331 C b
332 --------------
332 --------------
333
333
334 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
334 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
335 created new head
335 created new head
336 --------------
336 --------------
337 test L:um a b R:um a b W: - 9 do merge with ancestor in a
337 test L:um a b R:um a b W: - 9 do merge with ancestor in a
338 --------------
338 --------------
339 searching for copies back to rev 1
339 searching for copies back to rev 1
340 resolving manifests
340 resolving manifests
341 overwrite None partial False
341 overwrite None partial False
342 ancestor 924404dff337 local 62e7bf090eba+ remote 49b6d8032493
342 ancestor 924404dff337 local 62e7bf090eba+ remote 49b6d8032493
343 b: versions differ -> m
343 b: versions differ -> m
344 rev: versions differ -> m
344 rev: versions differ -> m
345 preserving b for resolve of b
345 preserving b for resolve of b
346 preserving rev for resolve of rev
346 preserving rev for resolve of rev
347 updating: b 1/2 files (50.00%)
347 updating: b 1/2 files (50.00%)
348 picked tool 'python ../merge' for b (binary False symlink False)
348 picked tool 'python ../merge' for b (binary False symlink False)
349 merging b
349 merging b
350 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
350 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
351 updating: rev 2/2 files (100.00%)
351 updating: rev 2/2 files (100.00%)
352 picked tool 'python ../merge' for rev (binary False symlink False)
352 picked tool 'python ../merge' for rev (binary False symlink False)
353 merging rev
353 merging rev
354 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
354 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
355 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
355 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
356 (branch merge, don't forget to commit)
356 (branch merge, don't forget to commit)
357 --------------
357 --------------
358 M b
358 M b
359 --------------
359 --------------
360
360
361
361
362 m "um a c" "um x c" " " "10 do merge with no ancestor"
362 m "um a c" "um x c" " " "10 do merge with no ancestor"
363
363
364 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
364 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
365 created new head
365 created new head
366 --------------
366 --------------
367 test L:nm a b R:nm a c W: - 11 get c, keep b
367 test L:nm a b R:nm a c W: - 11 get c, keep b
368 --------------
368 --------------
369 searching for copies back to rev 1
369 searching for copies back to rev 1
370 unmatched files in local:
370 unmatched files in local:
371 b
371 b
372 unmatched files in other:
372 unmatched files in other:
373 c
373 c
374 all copies found (* = to merge, ! = divergent):
374 all copies found (* = to merge, ! = divergent):
375 c -> a !
375 c -> a !
376 b -> a !
376 b -> a !
377 checking for directory renames
377 checking for directory renames
378 a: divergent renames -> dr
378 a: divergent renames -> dr
379 resolving manifests
379 resolving manifests
380 overwrite None partial False
380 overwrite None partial False
381 ancestor 924404dff337 local 02963e448370+ remote fe905ef2c33e
381 ancestor 924404dff337 local 02963e448370+ remote fe905ef2c33e
382 rev: versions differ -> m
382 rev: versions differ -> m
383 c: remote created -> g
383 c: remote created -> g
384 preserving rev for resolve of rev
384 preserving rev for resolve of rev
385 updating: a 1/3 files (33.33%)
385 updating: a 1/3 files (33.33%)
386 warning: detected divergent renames of a to:
386 note: possible conflict - a was renamed multiple times to:
387 b
387 b
388 c
388 c
389 updating: c 2/3 files (66.67%)
389 updating: c 2/3 files (66.67%)
390 getting c
390 getting c
391 updating: rev 3/3 files (100.00%)
391 updating: rev 3/3 files (100.00%)
392 picked tool 'python ../merge' for rev (binary False symlink False)
392 picked tool 'python ../merge' for rev (binary False symlink False)
393 merging rev
393 merging rev
394 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
394 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
395 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
395 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
396 (branch merge, don't forget to commit)
396 (branch merge, don't forget to commit)
397 --------------
397 --------------
398 M c
398 M c
399 C b
399 C b
400 --------------
400 --------------
401
401
402 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
402 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
403 created new head
403 created new head
404 --------------
404 --------------
405 test L:nc a b R:up b W: - 12 merge b no ancestor
405 test L:nc a b R:up b W: - 12 merge b no ancestor
406 --------------
406 --------------
407 searching for copies back to rev 1
407 searching for copies back to rev 1
408 resolving manifests
408 resolving manifests
409 overwrite None partial False
409 overwrite None partial False
410 ancestor 924404dff337 local 86a2aa42fc76+ remote af30c7647fc7
410 ancestor 924404dff337 local 86a2aa42fc76+ remote af30c7647fc7
411 b: versions differ -> m
411 b: versions differ -> m
412 rev: versions differ -> m
412 rev: versions differ -> m
413 preserving b for resolve of b
413 preserving b for resolve of b
414 preserving rev for resolve of rev
414 preserving rev for resolve of rev
415 updating: b 1/2 files (50.00%)
415 updating: b 1/2 files (50.00%)
416 picked tool 'python ../merge' for b (binary False symlink False)
416 picked tool 'python ../merge' for b (binary False symlink False)
417 merging b
417 merging b
418 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
418 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
419 updating: rev 2/2 files (100.00%)
419 updating: rev 2/2 files (100.00%)
420 picked tool 'python ../merge' for rev (binary False symlink False)
420 picked tool 'python ../merge' for rev (binary False symlink False)
421 merging rev
421 merging rev
422 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
422 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
423 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
423 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
424 (branch merge, don't forget to commit)
424 (branch merge, don't forget to commit)
425 --------------
425 --------------
426 M b
426 M b
427 C a
427 C a
428 --------------
428 --------------
429
429
430 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
430 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
431 created new head
431 created new head
432 --------------
432 --------------
433 test L:up b R:nm a b W: - 13 merge b no ancestor
433 test L:up b R:nm a b W: - 13 merge b no ancestor
434 --------------
434 --------------
435 searching for copies back to rev 1
435 searching for copies back to rev 1
436 resolving manifests
436 resolving manifests
437 overwrite None partial False
437 overwrite None partial False
438 ancestor 924404dff337 local 59318016310c+ remote bdb19105162a
438 ancestor 924404dff337 local 59318016310c+ remote bdb19105162a
439 a: other deleted -> r
439 a: other deleted -> r
440 b: versions differ -> m
440 b: versions differ -> m
441 rev: versions differ -> m
441 rev: versions differ -> m
442 preserving b for resolve of b
442 preserving b for resolve of b
443 preserving rev for resolve of rev
443 preserving rev for resolve of rev
444 updating: a 1/3 files (33.33%)
444 updating: a 1/3 files (33.33%)
445 removing a
445 removing a
446 updating: b 2/3 files (66.67%)
446 updating: b 2/3 files (66.67%)
447 picked tool 'python ../merge' for b (binary False symlink False)
447 picked tool 'python ../merge' for b (binary False symlink False)
448 merging b
448 merging b
449 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
449 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
450 updating: rev 3/3 files (100.00%)
450 updating: rev 3/3 files (100.00%)
451 picked tool 'python ../merge' for rev (binary False symlink False)
451 picked tool 'python ../merge' for rev (binary False symlink False)
452 merging rev
452 merging rev
453 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
453 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
454 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
454 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
455 (branch merge, don't forget to commit)
455 (branch merge, don't forget to commit)
456 --------------
456 --------------
457 M b
457 M b
458 --------------
458 --------------
459
459
460 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
460 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
461 created new head
461 created new head
462 --------------
462 --------------
463 test L:nc a b R:up a b W: - 14 merge b no ancestor
463 test L:nc a b R:up a b W: - 14 merge b no ancestor
464 --------------
464 --------------
465 searching for copies back to rev 1
465 searching for copies back to rev 1
466 resolving manifests
466 resolving manifests
467 overwrite None partial False
467 overwrite None partial False
468 ancestor 924404dff337 local 86a2aa42fc76+ remote 8dbce441892a
468 ancestor 924404dff337 local 86a2aa42fc76+ remote 8dbce441892a
469 a: remote is newer -> g
469 a: remote is newer -> g
470 b: versions differ -> m
470 b: versions differ -> m
471 rev: versions differ -> m
471 rev: versions differ -> m
472 preserving b for resolve of b
472 preserving b for resolve of b
473 preserving rev for resolve of rev
473 preserving rev for resolve of rev
474 updating: a 1/3 files (33.33%)
474 updating: a 1/3 files (33.33%)
475 getting a
475 getting a
476 updating: b 2/3 files (66.67%)
476 updating: b 2/3 files (66.67%)
477 picked tool 'python ../merge' for b (binary False symlink False)
477 picked tool 'python ../merge' for b (binary False symlink False)
478 merging b
478 merging b
479 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
479 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
480 updating: rev 3/3 files (100.00%)
480 updating: rev 3/3 files (100.00%)
481 picked tool 'python ../merge' for rev (binary False symlink False)
481 picked tool 'python ../merge' for rev (binary False symlink False)
482 merging rev
482 merging rev
483 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
483 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
484 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
484 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
485 (branch merge, don't forget to commit)
485 (branch merge, don't forget to commit)
486 --------------
486 --------------
487 M a
487 M a
488 M b
488 M b
489 --------------
489 --------------
490
490
491 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
491 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
492 created new head
492 created new head
493 --------------
493 --------------
494 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
494 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
495 --------------
495 --------------
496 searching for copies back to rev 1
496 searching for copies back to rev 1
497 resolving manifests
497 resolving manifests
498 overwrite None partial False
498 overwrite None partial False
499 ancestor 924404dff337 local 59318016310c+ remote bdb19105162a
499 ancestor 924404dff337 local 59318016310c+ remote bdb19105162a
500 a: other deleted -> r
500 a: other deleted -> r
501 b: versions differ -> m
501 b: versions differ -> m
502 rev: versions differ -> m
502 rev: versions differ -> m
503 preserving b for resolve of b
503 preserving b for resolve of b
504 preserving rev for resolve of rev
504 preserving rev for resolve of rev
505 updating: a 1/3 files (33.33%)
505 updating: a 1/3 files (33.33%)
506 removing a
506 removing a
507 updating: b 2/3 files (66.67%)
507 updating: b 2/3 files (66.67%)
508 picked tool 'python ../merge' for b (binary False symlink False)
508 picked tool 'python ../merge' for b (binary False symlink False)
509 merging b
509 merging b
510 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
510 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
511 updating: rev 3/3 files (100.00%)
511 updating: rev 3/3 files (100.00%)
512 picked tool 'python ../merge' for rev (binary False symlink False)
512 picked tool 'python ../merge' for rev (binary False symlink False)
513 merging rev
513 merging rev
514 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
514 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
515 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
515 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
516 (branch merge, don't forget to commit)
516 (branch merge, don't forget to commit)
517 --------------
517 --------------
518 M b
518 M b
519 --------------
519 --------------
520
520
521 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
521 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
522 created new head
522 created new head
523 --------------
523 --------------
524 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
524 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
525 --------------
525 --------------
526 searching for copies back to rev 1
526 searching for copies back to rev 1
527 resolving manifests
527 resolving manifests
528 overwrite None partial False
528 overwrite None partial False
529 ancestor 924404dff337 local 86a2aa42fc76+ remote 8dbce441892a
529 ancestor 924404dff337 local 86a2aa42fc76+ remote 8dbce441892a
530 a: remote is newer -> g
530 a: remote is newer -> g
531 b: versions differ -> m
531 b: versions differ -> m
532 rev: versions differ -> m
532 rev: versions differ -> m
533 preserving b for resolve of b
533 preserving b for resolve of b
534 preserving rev for resolve of rev
534 preserving rev for resolve of rev
535 updating: a 1/3 files (33.33%)
535 updating: a 1/3 files (33.33%)
536 getting a
536 getting a
537 updating: b 2/3 files (66.67%)
537 updating: b 2/3 files (66.67%)
538 picked tool 'python ../merge' for b (binary False symlink False)
538 picked tool 'python ../merge' for b (binary False symlink False)
539 merging b
539 merging b
540 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
540 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
541 updating: rev 3/3 files (100.00%)
541 updating: rev 3/3 files (100.00%)
542 picked tool 'python ../merge' for rev (binary False symlink False)
542 picked tool 'python ../merge' for rev (binary False symlink False)
543 merging rev
543 merging rev
544 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
544 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
545 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
545 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
546 (branch merge, don't forget to commit)
546 (branch merge, don't forget to commit)
547 --------------
547 --------------
548 M a
548 M a
549 M b
549 M b
550 --------------
550 --------------
551
551
552 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
552 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
553 created new head
553 created new head
554 --------------
554 --------------
555 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
555 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
556 --------------
556 --------------
557 searching for copies back to rev 1
557 searching for copies back to rev 1
558 resolving manifests
558 resolving manifests
559 overwrite None partial False
559 overwrite None partial False
560 ancestor 924404dff337 local 0b76e65c8289+ remote 4ce40f5aca24
560 ancestor 924404dff337 local 0b76e65c8289+ remote 4ce40f5aca24
561 b: versions differ -> m
561 b: versions differ -> m
562 rev: versions differ -> m
562 rev: versions differ -> m
563 preserving b for resolve of b
563 preserving b for resolve of b
564 preserving rev for resolve of rev
564 preserving rev for resolve of rev
565 updating: b 1/2 files (50.00%)
565 updating: b 1/2 files (50.00%)
566 picked tool 'python ../merge' for b (binary False symlink False)
566 picked tool 'python ../merge' for b (binary False symlink False)
567 merging b
567 merging b
568 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
568 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
569 updating: rev 2/2 files (100.00%)
569 updating: rev 2/2 files (100.00%)
570 picked tool 'python ../merge' for rev (binary False symlink False)
570 picked tool 'python ../merge' for rev (binary False symlink False)
571 merging rev
571 merging rev
572 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
572 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
573 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
573 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
574 (branch merge, don't forget to commit)
574 (branch merge, don't forget to commit)
575 --------------
575 --------------
576 M b
576 M b
577 C a
577 C a
578 --------------
578 --------------
579
579
580 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
580 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
581 created new head
581 created new head
582 --------------
582 --------------
583 test L:nm a b R:up a b W: - 18 merge b no ancestor
583 test L:nm a b R:up a b W: - 18 merge b no ancestor
584 --------------
584 --------------
585 searching for copies back to rev 1
585 searching for copies back to rev 1
586 resolving manifests
586 resolving manifests
587 overwrite None partial False
587 overwrite None partial False
588 ancestor 924404dff337 local 02963e448370+ remote 8dbce441892a
588 ancestor 924404dff337 local 02963e448370+ remote 8dbce441892a
589 b: versions differ -> m
589 b: versions differ -> m
590 rev: versions differ -> m
590 rev: versions differ -> m
591 remote changed a which local deleted
591 remote changed a which local deleted
592 use (c)hanged version or leave (d)eleted? c
592 use (c)hanged version or leave (d)eleted? c
593 a: prompt recreating -> g
593 a: prompt recreating -> g
594 preserving b for resolve of b
594 preserving b for resolve of b
595 preserving rev for resolve of rev
595 preserving rev for resolve of rev
596 updating: a 1/3 files (33.33%)
596 updating: a 1/3 files (33.33%)
597 getting a
597 getting a
598 updating: b 2/3 files (66.67%)
598 updating: b 2/3 files (66.67%)
599 picked tool 'python ../merge' for b (binary False symlink False)
599 picked tool 'python ../merge' for b (binary False symlink False)
600 merging b
600 merging b
601 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
601 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
602 updating: rev 3/3 files (100.00%)
602 updating: rev 3/3 files (100.00%)
603 picked tool 'python ../merge' for rev (binary False symlink False)
603 picked tool 'python ../merge' for rev (binary False symlink False)
604 merging rev
604 merging rev
605 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
605 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
606 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
606 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
607 (branch merge, don't forget to commit)
607 (branch merge, don't forget to commit)
608 --------------
608 --------------
609 M a
609 M a
610 M b
610 M b
611 --------------
611 --------------
612
612
613 $ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
613 $ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
614 created new head
614 created new head
615 --------------
615 --------------
616 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
616 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
617 --------------
617 --------------
618 searching for copies back to rev 1
618 searching for copies back to rev 1
619 resolving manifests
619 resolving manifests
620 overwrite None partial False
620 overwrite None partial False
621 ancestor 924404dff337 local 0b76e65c8289+ remote bdb19105162a
621 ancestor 924404dff337 local 0b76e65c8289+ remote bdb19105162a
622 local changed a which remote deleted
622 local changed a which remote deleted
623 use (c)hanged version or (d)elete? c
623 use (c)hanged version or (d)elete? c
624 a: prompt keep -> a
624 a: prompt keep -> a
625 b: versions differ -> m
625 b: versions differ -> m
626 rev: versions differ -> m
626 rev: versions differ -> m
627 preserving b for resolve of b
627 preserving b for resolve of b
628 preserving rev for resolve of rev
628 preserving rev for resolve of rev
629 updating: a 1/3 files (33.33%)
629 updating: a 1/3 files (33.33%)
630 updating: b 2/3 files (66.67%)
630 updating: b 2/3 files (66.67%)
631 picked tool 'python ../merge' for b (binary False symlink False)
631 picked tool 'python ../merge' for b (binary False symlink False)
632 merging b
632 merging b
633 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
633 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
634 updating: rev 3/3 files (100.00%)
634 updating: rev 3/3 files (100.00%)
635 picked tool 'python ../merge' for rev (binary False symlink False)
635 picked tool 'python ../merge' for rev (binary False symlink False)
636 merging rev
636 merging rev
637 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
637 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
638 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
638 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
639 (branch merge, don't forget to commit)
639 (branch merge, don't forget to commit)
640 --------------
640 --------------
641 M b
641 M b
642 C a
642 C a
643 --------------
643 --------------
644
644
645 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
645 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
646 created new head
646 created new head
647 --------------
647 --------------
648 test L:up a R:um a b W: - 20 merge a and b to b, remove a
648 test L:up a R:um a b W: - 20 merge a and b to b, remove a
649 --------------
649 --------------
650 searching for copies back to rev 1
650 searching for copies back to rev 1
651 unmatched files in other:
651 unmatched files in other:
652 b
652 b
653 all copies found (* = to merge, ! = divergent):
653 all copies found (* = to merge, ! = divergent):
654 b -> a *
654 b -> a *
655 checking for directory renames
655 checking for directory renames
656 resolving manifests
656 resolving manifests
657 overwrite None partial False
657 overwrite None partial False
658 ancestor 924404dff337 local e300d1c794ec+ remote 49b6d8032493
658 ancestor 924404dff337 local e300d1c794ec+ remote 49b6d8032493
659 rev: versions differ -> m
659 rev: versions differ -> m
660 a: remote moved to b -> m
660 a: remote moved to b -> m
661 preserving a for resolve of b
661 preserving a for resolve of b
662 preserving rev for resolve of rev
662 preserving rev for resolve of rev
663 removing a
663 removing a
664 updating: a 1/2 files (50.00%)
664 updating: a 1/2 files (50.00%)
665 picked tool 'python ../merge' for b (binary False symlink False)
665 picked tool 'python ../merge' for b (binary False symlink False)
666 merging a and b to b
666 merging a and b to b
667 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
667 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
668 updating: rev 2/2 files (100.00%)
668 updating: rev 2/2 files (100.00%)
669 picked tool 'python ../merge' for rev (binary False symlink False)
669 picked tool 'python ../merge' for rev (binary False symlink False)
670 merging rev
670 merging rev
671 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
671 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
672 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
672 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
673 (branch merge, don't forget to commit)
673 (branch merge, don't forget to commit)
674 --------------
674 --------------
675 M b
675 M b
676 a
676 a
677 --------------
677 --------------
678
678
679 $ tm "um a b" "up a " " " "21 merge a and b to b"
679 $ tm "um a b" "up a " " " "21 merge a and b to b"
680 created new head
680 created new head
681 --------------
681 --------------
682 test L:um a b R:up a W: - 21 merge a and b to b
682 test L:um a b R:up a W: - 21 merge a and b to b
683 --------------
683 --------------
684 searching for copies back to rev 1
684 searching for copies back to rev 1
685 unmatched files in local:
685 unmatched files in local:
686 b
686 b
687 all copies found (* = to merge, ! = divergent):
687 all copies found (* = to merge, ! = divergent):
688 b -> a *
688 b -> a *
689 checking for directory renames
689 checking for directory renames
690 resolving manifests
690 resolving manifests
691 overwrite None partial False
691 overwrite None partial False
692 ancestor 924404dff337 local 62e7bf090eba+ remote f4db7e329e71
692 ancestor 924404dff337 local 62e7bf090eba+ remote f4db7e329e71
693 b: local copied/moved to a -> m
693 b: local copied/moved to a -> m
694 rev: versions differ -> m
694 rev: versions differ -> m
695 preserving b for resolve of b
695 preserving b for resolve of b
696 preserving rev for resolve of rev
696 preserving rev for resolve of rev
697 updating: b 1/2 files (50.00%)
697 updating: b 1/2 files (50.00%)
698 picked tool 'python ../merge' for b (binary False symlink False)
698 picked tool 'python ../merge' for b (binary False symlink False)
699 merging b and a to b
699 merging b and a to b
700 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
700 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
701 updating: rev 2/2 files (100.00%)
701 updating: rev 2/2 files (100.00%)
702 picked tool 'python ../merge' for rev (binary False symlink False)
702 picked tool 'python ../merge' for rev (binary False symlink False)
703 merging rev
703 merging rev
704 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
704 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
705 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
705 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
706 (branch merge, don't forget to commit)
706 (branch merge, don't forget to commit)
707 --------------
707 --------------
708 M b
708 M b
709 a
709 a
710 --------------
710 --------------
711
711
712
712
713 m "nm a b" "um x a" " " "22 get a, keep b"
713 m "nm a b" "um x a" " " "22 get a, keep b"
714
714
715 $ tm "nm a b" "up a c" " " "23 get c, keep b"
715 $ tm "nm a b" "up a c" " " "23 get c, keep b"
716 created new head
716 created new head
717 --------------
717 --------------
718 test L:nm a b R:up a c W: - 23 get c, keep b
718 test L:nm a b R:up a c W: - 23 get c, keep b
719 --------------
719 --------------
720 searching for copies back to rev 1
720 searching for copies back to rev 1
721 unmatched files in local:
721 unmatched files in local:
722 b
722 b
723 unmatched files in other:
723 unmatched files in other:
724 c
724 c
725 all copies found (* = to merge, ! = divergent):
725 all copies found (* = to merge, ! = divergent):
726 b -> a *
726 b -> a *
727 checking for directory renames
727 checking for directory renames
728 resolving manifests
728 resolving manifests
729 overwrite None partial False
729 overwrite None partial False
730 ancestor 924404dff337 local 02963e448370+ remote 2b958612230f
730 ancestor 924404dff337 local 02963e448370+ remote 2b958612230f
731 b: local copied/moved to a -> m
731 b: local copied/moved to a -> m
732 rev: versions differ -> m
732 rev: versions differ -> m
733 c: remote created -> g
733 c: remote created -> g
734 preserving b for resolve of b
734 preserving b for resolve of b
735 preserving rev for resolve of rev
735 preserving rev for resolve of rev
736 updating: b 1/3 files (33.33%)
736 updating: b 1/3 files (33.33%)
737 picked tool 'python ../merge' for b (binary False symlink False)
737 picked tool 'python ../merge' for b (binary False symlink False)
738 merging b and a to b
738 merging b and a to b
739 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
739 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
740 premerge successful
740 premerge successful
741 updating: c 2/3 files (66.67%)
741 updating: c 2/3 files (66.67%)
742 getting c
742 getting c
743 updating: rev 3/3 files (100.00%)
743 updating: rev 3/3 files (100.00%)
744 picked tool 'python ../merge' for rev (binary False symlink False)
744 picked tool 'python ../merge' for rev (binary False symlink False)
745 merging rev
745 merging rev
746 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
746 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
747 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
747 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
748 (branch merge, don't forget to commit)
748 (branch merge, don't forget to commit)
749 --------------
749 --------------
750 M b
750 M b
751 a
751 a
752 M c
752 M c
753 --------------
753 --------------
754
754
General Comments 0
You need to be logged in to leave comments. Login now