##// END OF EJS Templates
merge with main
Thomas Arendsen Hein -
r3408:4e0c08f0 merge default
parent child Browse files
Show More
@@ -1,412 +1,416 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 Matt Mackall <mpm@selenic.com>
3 # Copyright 2006 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 from node import *
8 from node import *
9 from i18n import gettext as _
9 from i18n import gettext as _
10 from demandload import *
10 from demandload import *
11 demandload(globals(), "errno util os tempfile")
11 demandload(globals(), "errno util os tempfile")
12
12
13 def filemerge(repo, fw, fo, wctx, mctx):
13 def filemerge(repo, fw, fo, wctx, mctx):
14 """perform a 3-way merge in the working directory
14 """perform a 3-way merge in the working directory
15
15
16 fw = filename in the working directory
16 fw = filename in the working directory
17 fo = filename in other parent
17 fo = filename in other parent
18 wctx, mctx = working and merge changecontexts
18 wctx, mctx = working and merge changecontexts
19 """
19 """
20
20
21 def temp(prefix, ctx):
21 def temp(prefix, ctx):
22 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
22 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
23 (fd, name) = tempfile.mkstemp(prefix=pre)
23 (fd, name) = tempfile.mkstemp(prefix=pre)
24 f = os.fdopen(fd, "wb")
24 f = os.fdopen(fd, "wb")
25 repo.wwrite(ctx.path(), ctx.data(), f)
25 repo.wwrite(ctx.path(), ctx.data(), f)
26 f.close()
26 f.close()
27 return name
27 return name
28
28
29 fcm = wctx.filectx(fw)
29 fcm = wctx.filectx(fw)
30 fco = mctx.filectx(fo)
30 fco = mctx.filectx(fo)
31
31
32 if not fco.cmp(fcm.data()): # files identical?
32 if not fco.cmp(fcm.data()): # files identical?
33 return 0
33 return None
34
34
35 fca = fcm.ancestor(fco)
35 fca = fcm.ancestor(fco)
36 if not fca:
36 if not fca:
37 fca = repo.filectx(fw, fileid=-1)
37 fca = repo.filectx(fw, fileid=-1)
38 a = repo.wjoin(fw)
38 a = repo.wjoin(fw)
39 b = temp("base", fca)
39 b = temp("base", fca)
40 c = temp("other", fco)
40 c = temp("other", fco)
41
41
42 if fw != fo:
42 if fw != fo:
43 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
43 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
44 else:
44 else:
45 repo.ui.status(_("merging %s\n") % fw)
45 repo.ui.status(_("merging %s\n") % fw)
46
46
47 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
47 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
48
48
49 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
49 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
50 or "hgmerge")
50 or "hgmerge")
51 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
51 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
52 environ={'HG_FILE': fw,
52 environ={'HG_FILE': fw,
53 'HG_MY_NODE': str(wctx.parents()[0]),
53 'HG_MY_NODE': str(wctx.parents()[0]),
54 'HG_OTHER_NODE': str(mctx)})
54 'HG_OTHER_NODE': str(mctx)})
55 if r:
55 if r:
56 repo.ui.warn(_("merging %s failed!\n") % fw)
56 repo.ui.warn(_("merging %s failed!\n") % fw)
57
57
58 os.unlink(b)
58 os.unlink(b)
59 os.unlink(c)
59 os.unlink(c)
60 return r
60 return r
61
61
62 def checkunknown(wctx, mctx):
62 def checkunknown(wctx, mctx):
63 "check for collisions between unknown files and files in mctx"
63 "check for collisions between unknown files and files in mctx"
64 man = mctx.manifest()
64 man = mctx.manifest()
65 for f in wctx.unknown():
65 for f in wctx.unknown():
66 if f in man:
66 if f in man:
67 if mctx.filectx(f).cmp(wctx.filectx(f).data()):
67 if mctx.filectx(f).cmp(wctx.filectx(f).data()):
68 raise util.Abort(_("'%s' already exists in the working"
68 raise util.Abort(_("'%s' already exists in the working"
69 " dir and differs from remote") % f)
69 " dir and differs from remote") % f)
70
70
71 def forgetremoved(wctx, mctx):
71 def forgetremoved(wctx, mctx):
72 """
72 """
73 Forget removed files
73 Forget removed files
74
74
75 If we're jumping between revisions (as opposed to merging), and if
75 If we're jumping between revisions (as opposed to merging), and if
76 neither the working directory nor the target rev has the file,
76 neither the working directory nor the target rev has the file,
77 then we need to remove it from the dirstate, to prevent the
77 then we need to remove it from the dirstate, to prevent the
78 dirstate from listing the file when it is no longer in the
78 dirstate from listing the file when it is no longer in the
79 manifest.
79 manifest.
80 """
80 """
81
81
82 action = []
82 action = []
83 man = mctx.manifest()
83 man = mctx.manifest()
84 for f in wctx.deleted() + wctx.removed():
84 for f in wctx.deleted() + wctx.removed():
85 if f not in man:
85 if f not in man:
86 action.append((f, "f"))
86 action.append((f, "f"))
87
87
88 return action
88 return action
89
89
90 def nonoverlap(d1, d2, d3):
90 def nonoverlap(d1, d2, d3):
91 "Return list of elements in d1 not in d2 or d3"
91 "Return list of elements in d1 not in d2 or d3"
92
92
93 l = []
93 l = []
94 for d in d1:
94 for d in d1:
95 if d not in d3 and d not in d2:
95 if d not in d3 and d not in d2:
96 l.append(d)
96 l.append(d)
97
97
98 l.sort()
98 l.sort()
99 return l
99 return l
100
100
101 def findold(fctx, limit):
101 def findold(fctx, limit):
102 "find files that path was copied from, back to linkrev limit"
102 "find files that path was copied from, back to linkrev limit"
103
103
104 old = {}
104 old = {}
105 orig = fctx.path()
105 orig = fctx.path()
106 visit = [fctx]
106 visit = [fctx]
107 while visit:
107 while visit:
108 fc = visit.pop()
108 fc = visit.pop()
109 if fc.rev() < limit:
109 if fc.rev() < limit:
110 continue
110 continue
111 if fc.path() != orig and fc.path() not in old:
111 if fc.path() != orig and fc.path() not in old:
112 old[fc.path()] = 1
112 old[fc.path()] = 1
113 visit += fc.parents()
113 visit += fc.parents()
114
114
115 old = old.keys()
115 old = old.keys()
116 old.sort()
116 old.sort()
117 return old
117 return old
118
118
119 def findcopies(repo, m1, m2, ma, limit):
119 def findcopies(repo, m1, m2, ma, limit):
120 """
120 """
121 Find moves and copies between m1 and m2 back to limit linkrev
121 Find moves and copies between m1 and m2 back to limit linkrev
122 """
122 """
123
123
124 if not repo.ui.configbool("merge", "followcopies", True):
124 if not repo.ui.configbool("merge", "followcopies", True):
125 return {}
125 return {}
126
126
127 # avoid silly behavior for update from empty dir
127 # avoid silly behavior for update from empty dir
128 if not m1:
128 if not m1:
129 return {}
129 return {}
130
130
131 dcopies = repo.dirstate.copies()
131 dcopies = repo.dirstate.copies()
132 copy = {}
132 copy = {}
133 match = {}
133 match = {}
134 u1 = nonoverlap(m1, m2, ma)
134 u1 = nonoverlap(m1, m2, ma)
135 u2 = nonoverlap(m2, m1, ma)
135 u2 = nonoverlap(m2, m1, ma)
136 ctx = util.cachefunc(lambda f,n: repo.filectx(f, fileid=n[:20]))
136 ctx = util.cachefunc(lambda f,n: repo.filectx(f, fileid=n[:20]))
137
137
138 def checkpair(c, f2, man):
138 def checkpair(c, f2, man):
139 ''' check if an apparent pair actually matches '''
139 ''' check if an apparent pair actually matches '''
140 c2 = ctx(f2, man[f2])
140 c2 = ctx(f2, man[f2])
141 ca = c.ancestor(c2)
141 ca = c.ancestor(c2)
142 if ca and ca.path() == c.path() or ca.path() == c2.path():
142 if ca and ca.path() == c.path() or ca.path() == c2.path():
143 copy[c.path()] = f2
143 copy[c.path()] = f2
144 copy[f2] = c.path()
144 copy[f2] = c.path()
145
145
146 for f in u1:
146 for f in u1:
147 c = ctx(dcopies.get(f, f), m1[f])
147 c = ctx(dcopies.get(f, f), m1[f])
148 for of in findold(c, limit):
148 for of in findold(c, limit):
149 if of in m2:
149 if of in m2:
150 checkpair(c, of, m2)
150 checkpair(c, of, m2)
151 else:
151 else:
152 match.setdefault(of, []).append(f)
152 match.setdefault(of, []).append(f)
153
153
154 for f in u2:
154 for f in u2:
155 c = ctx(f, m2[f])
155 c = ctx(f, m2[f])
156 for of in findold(c, limit):
156 for of in findold(c, limit):
157 if of in m1:
157 if of in m1:
158 checkpair(c, of, m1)
158 checkpair(c, of, m1)
159 elif of in match:
159 elif of in match:
160 for mf in match[of]:
160 for mf in match[of]:
161 checkpair(c, mf, m1)
161 checkpair(c, mf, m1)
162
162
163 return copy
163 return copy
164
164
165 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
165 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
166 """
166 """
167 Merge p1 and p2 with ancestor ma and generate merge action list
167 Merge p1 and p2 with ancestor ma and generate merge action list
168
168
169 overwrite = whether we clobber working files
169 overwrite = whether we clobber working files
170 partial = function to filter file lists
170 partial = function to filter file lists
171 """
171 """
172
172
173 repo.ui.note(_("resolving manifests\n"))
173 repo.ui.note(_("resolving manifests\n"))
174 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
174 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
175 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
175 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
176
176
177 m1 = p1.manifest()
177 m1 = p1.manifest()
178 m2 = p2.manifest()
178 m2 = p2.manifest()
179 ma = pa.manifest()
179 ma = pa.manifest()
180 backwards = (pa == p2)
180 backwards = (pa == p2)
181 action = []
181 action = []
182 copy = {}
182 copy = {}
183
183
184 def fmerge(f, f2=None, fa=None):
184 def fmerge(f, f2=None, fa=None):
185 """merge executable flags"""
185 """merge executable flags"""
186 if not f2:
186 if not f2:
187 f2 = f
187 f2 = f
188 fa = f
188 fa = f
189 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
189 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
190 return ((a^b) | (a^c)) ^ a
190 return ((a^b) | (a^c)) ^ a
191
191
192 def act(msg, m, f, *args):
192 def act(msg, m, f, *args):
193 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
193 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
194 action.append((f, m) + args)
194 action.append((f, m) + args)
195
195
196 if not (backwards or overwrite):
196 if not (backwards or overwrite):
197 copy = findcopies(repo, m1, m2, ma, pa.rev())
197 copy = findcopies(repo, m1, m2, ma, pa.rev())
198
198
199 # Compare manifests
199 # Compare manifests
200 for f, n in m1.iteritems():
200 for f, n in m1.iteritems():
201 if partial and not partial(f):
201 if partial and not partial(f):
202 continue
202 continue
203 if f in m2:
203 if f in m2:
204 # are files different?
204 # are files different?
205 if n != m2[f]:
205 if n != m2[f]:
206 a = ma.get(f, nullid)
206 a = ma.get(f, nullid)
207 # are both different from the ancestor?
207 # are both different from the ancestor?
208 if not overwrite and n != a and m2[f] != a:
208 if not overwrite and n != a and m2[f] != a:
209 act("versions differ", "m", f, f, f, fmerge(f), False)
209 act("versions differ", "m", f, f, f, fmerge(f), False)
210 # are we clobbering?
210 # are we clobbering?
211 # is remote's version newer?
211 # is remote's version newer?
212 # or are we going back in time and clean?
212 # or are we going back in time and clean?
213 elif overwrite or m2[f] != a or (backwards and not n[20:]):
213 elif overwrite or m2[f] != a or (backwards and not n[20:]):
214 act("remote is newer", "g", f, m2.execf(f))
214 act("remote is newer", "g", f, m2.execf(f))
215 # local is newer, not overwrite, check mode bits
215 # local is newer, not overwrite, check mode bits
216 elif fmerge(f) != m1.execf(f):
216 elif fmerge(f) != m1.execf(f):
217 act("update permissions", "e", f, m2.execf(f))
217 act("update permissions", "e", f, m2.execf(f))
218 # contents same, check mode bits
218 # contents same, check mode bits
219 elif m1.execf(f) != m2.execf(f):
219 elif m1.execf(f) != m2.execf(f):
220 if overwrite or fmerge(f) != m1.execf(f):
220 if overwrite or fmerge(f) != m1.execf(f):
221 act("update permissions", "e", f, m2.execf(f))
221 act("update permissions", "e", f, m2.execf(f))
222 elif f in copy:
222 elif f in copy:
223 f2 = copy[f]
223 f2 = copy[f]
224 if f in ma: # case 3,20 A/B/A
224 if f in ma: # case 3,20 A/B/A
225 act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True)
225 act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True)
226 else:
226 else:
227 if f2 in m1: # case 2 A,B/B/B
227 if f2 in m1: # case 2 A,B/B/B
228 act("local copied", "m",
228 act("local copied", "m",
229 f, f2, f, fmerge(f, f2, f2), False)
229 f, f2, f, fmerge(f, f2, f2), False)
230 else: # case 4,21 A/B/B
230 else: # case 4,21 A/B/B
231 act("local moved", "m",
231 act("local moved", "m",
232 f, f2, f, fmerge(f, f2, f2), False)
232 f, f2, f, fmerge(f, f2, f2), False)
233 elif f in ma:
233 elif f in ma:
234 if n != ma[f] and not overwrite:
234 if n != ma[f] and not overwrite:
235 if repo.ui.prompt(
235 if repo.ui.prompt(
236 (_(" local changed %s which remote deleted\n") % f) +
236 (_(" local changed %s which remote deleted\n") % f) +
237 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
237 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
238 act("prompt delete", "r", f)
238 act("prompt delete", "r", f)
239 else:
239 else:
240 act("other deleted", "r", f)
240 act("other deleted", "r", f)
241 else:
241 else:
242 # file is created on branch or in working directory
242 # file is created on branch or in working directory
243 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
243 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
244 act("remote deleted", "r", f)
244 act("remote deleted", "r", f)
245
245
246 for f, n in m2.iteritems():
246 for f, n in m2.iteritems():
247 if partial and not partial(f):
247 if partial and not partial(f):
248 continue
248 continue
249 if f in m1:
249 if f in m1:
250 continue
250 continue
251 if f in copy:
251 if f in copy:
252 f2 = copy[f]
252 f2 = copy[f]
253 if f2 not in m2: # already seen
253 if f2 not in m2: # already seen
254 continue
254 continue
255 # rename case 1, A/A,B/A
255 # rename case 1, A/A,B/A
256 act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False)
256 act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False)
257 elif f in ma:
257 elif f in ma:
258 if overwrite or backwards:
258 if overwrite or backwards:
259 act("recreating", "g", f, m2.execf(f))
259 act("recreating", "g", f, m2.execf(f))
260 elif n != ma[f]:
260 elif n != ma[f]:
261 if repo.ui.prompt(
261 if repo.ui.prompt(
262 (_("remote changed %s which local deleted\n") % f) +
262 (_("remote changed %s which local deleted\n") % f) +
263 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
263 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
264 act("prompt recreating", "g", f, m2.execf(f))
264 act("prompt recreating", "g", f, m2.execf(f))
265 else:
265 else:
266 act("remote created", "g", f, m2.execf(f))
266 act("remote created", "g", f, m2.execf(f))
267
267
268 return action
268 return action
269
269
270 def applyupdates(repo, action, wctx, mctx):
270 def applyupdates(repo, action, wctx, mctx):
271 "apply the merge action list to the working directory"
271 "apply the merge action list to the working directory"
272
272
273 updated, merged, removed, unresolved = 0, 0, 0, 0
273 updated, merged, removed, unresolved = 0, 0, 0, 0
274 action.sort()
274 action.sort()
275 for a in action:
275 for a in action:
276 f, m = a[:2]
276 f, m = a[:2]
277 if f[0] == "/":
277 if f[0] == "/":
278 continue
278 continue
279 if m == "r": # remove
279 if m == "r": # remove
280 repo.ui.note(_("removing %s\n") % f)
280 repo.ui.note(_("removing %s\n") % f)
281 util.audit_path(f)
281 util.audit_path(f)
282 try:
282 try:
283 util.unlink(repo.wjoin(f))
283 util.unlink(repo.wjoin(f))
284 except OSError, inst:
284 except OSError, inst:
285 if inst.errno != errno.ENOENT:
285 if inst.errno != errno.ENOENT:
286 repo.ui.warn(_("update failed to remove %s: %s!\n") %
286 repo.ui.warn(_("update failed to remove %s: %s!\n") %
287 (f, inst.strerror))
287 (f, inst.strerror))
288 removed +=1
288 removed +=1
289 elif m == "m": # merge
289 elif m == "m": # merge
290 f2, fd, flag, move = a[2:]
290 f2, fd, flag, move = a[2:]
291 if filemerge(repo, f, f2, wctx, mctx):
291 r = filemerge(repo, f, f2, wctx, mctx)
292 if r > 0:
292 unresolved += 1
293 unresolved += 1
293 else:
294 else:
295 if r is None:
296 updated += 1
297 else:
294 merged += 1
298 merged += 1
295 if f != fd:
299 if f != fd:
296 repo.ui.debug(_("copying %s to %s\n") % (f, fd))
300 repo.ui.debug(_("copying %s to %s\n") % (f, fd))
297 repo.wwrite(fd, repo.wread(f))
301 repo.wwrite(fd, repo.wread(f))
298 if move:
302 if move:
299 repo.ui.debug(_("removing %s\n") % f)
303 repo.ui.debug(_("removing %s\n") % f)
300 os.unlink(repo.wjoin(f))
304 os.unlink(repo.wjoin(f))
301 util.set_exec(repo.wjoin(fd), flag)
305 util.set_exec(repo.wjoin(fd), flag)
302 elif m == "g": # get
306 elif m == "g": # get
303 flag = a[2]
307 flag = a[2]
304 repo.ui.note(_("getting %s\n") % f)
308 repo.ui.note(_("getting %s\n") % f)
305 t = mctx.filectx(f).data()
309 t = mctx.filectx(f).data()
306 repo.wwrite(f, t)
310 repo.wwrite(f, t)
307 util.set_exec(repo.wjoin(f), flag)
311 util.set_exec(repo.wjoin(f), flag)
308 updated += 1
312 updated += 1
309 elif m == "e": # exec
313 elif m == "e": # exec
310 flag = a[2]
314 flag = a[2]
311 util.set_exec(repo.wjoin(f), flag)
315 util.set_exec(repo.wjoin(f), flag)
312
316
313 return updated, merged, removed, unresolved
317 return updated, merged, removed, unresolved
314
318
315 def recordupdates(repo, action, branchmerge):
319 def recordupdates(repo, action, branchmerge):
316 "record merge actions to the dirstate"
320 "record merge actions to the dirstate"
317
321
318 for a in action:
322 for a in action:
319 f, m = a[:2]
323 f, m = a[:2]
320 if m == "r": # remove
324 if m == "r": # remove
321 if branchmerge:
325 if branchmerge:
322 repo.dirstate.update([f], 'r')
326 repo.dirstate.update([f], 'r')
323 else:
327 else:
324 repo.dirstate.forget([f])
328 repo.dirstate.forget([f])
325 elif m == "f": # forget
329 elif m == "f": # forget
326 repo.dirstate.forget([f])
330 repo.dirstate.forget([f])
327 elif m == "g": # get
331 elif m == "g": # get
328 if branchmerge:
332 if branchmerge:
329 repo.dirstate.update([f], 'n', st_mtime=-1)
333 repo.dirstate.update([f], 'n', st_mtime=-1)
330 else:
334 else:
331 repo.dirstate.update([f], 'n')
335 repo.dirstate.update([f], 'n')
332 elif m == "m": # merge
336 elif m == "m": # merge
333 f2, fd, flag, move = a[2:]
337 f2, fd, flag, move = a[2:]
334 if branchmerge:
338 if branchmerge:
335 # We've done a branch merge, mark this file as merged
339 # We've done a branch merge, mark this file as merged
336 # so that we properly record the merger later
340 # so that we properly record the merger later
337 repo.dirstate.update([fd], 'm')
341 repo.dirstate.update([fd], 'm')
338 if f != f2: # copy/rename
342 if f != f2: # copy/rename
339 if move:
343 if move:
340 repo.dirstate.update([f], 'r')
344 repo.dirstate.update([f], 'r')
341 if f != fd:
345 if f != fd:
342 repo.dirstate.copy(f, fd)
346 repo.dirstate.copy(f, fd)
343 else:
347 else:
344 repo.dirstate.copy(f2, fd)
348 repo.dirstate.copy(f2, fd)
345 else:
349 else:
346 # We've update-merged a locally modified file, so
350 # We've update-merged a locally modified file, so
347 # we set the dirstate to emulate a normal checkout
351 # we set the dirstate to emulate a normal checkout
348 # of that file some time in the past. Thus our
352 # of that file some time in the past. Thus our
349 # merge will appear as a normal local file
353 # merge will appear as a normal local file
350 # modification.
354 # modification.
351 repo.dirstate.update([fd], 'n', st_size=-1, st_mtime=-1)
355 repo.dirstate.update([fd], 'n', st_size=-1, st_mtime=-1)
352 if move:
356 if move:
353 repo.dirstate.forget([f])
357 repo.dirstate.forget([f])
354
358
355 def update(repo, node, branchmerge, force, partial, wlock):
359 def update(repo, node, branchmerge, force, partial, wlock):
356 """
360 """
357 Perform a merge between the working directory and the given node
361 Perform a merge between the working directory and the given node
358
362
359 branchmerge = whether to merge between branches
363 branchmerge = whether to merge between branches
360 force = whether to force branch merging or file overwriting
364 force = whether to force branch merging or file overwriting
361 partial = a function to filter file lists (dirstate not updated)
365 partial = a function to filter file lists (dirstate not updated)
362 wlock = working dir lock, if already held
366 wlock = working dir lock, if already held
363 """
367 """
364
368
365 if not wlock:
369 if not wlock:
366 wlock = repo.wlock()
370 wlock = repo.wlock()
367
371
368 overwrite = force and not branchmerge
372 overwrite = force and not branchmerge
369 forcemerge = force and branchmerge
373 forcemerge = force and branchmerge
370 wc = repo.workingctx()
374 wc = repo.workingctx()
371 pl = wc.parents()
375 pl = wc.parents()
372 p1, p2 = pl[0], repo.changectx(node)
376 p1, p2 = pl[0], repo.changectx(node)
373 pa = p1.ancestor(p2)
377 pa = p1.ancestor(p2)
374 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
378 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
375
379
376 ### check phase
380 ### check phase
377 if not overwrite and len(pl) > 1:
381 if not overwrite and len(pl) > 1:
378 raise util.Abort(_("outstanding uncommitted merges"))
382 raise util.Abort(_("outstanding uncommitted merges"))
379 if pa == p1 or pa == p2: # is there a linear path from p1 to p2?
383 if pa == p1 or pa == p2: # is there a linear path from p1 to p2?
380 if branchmerge:
384 if branchmerge:
381 raise util.Abort(_("there is nothing to merge, just use "
385 raise util.Abort(_("there is nothing to merge, just use "
382 "'hg update' or look at 'hg heads'"))
386 "'hg update' or look at 'hg heads'"))
383 elif not (overwrite or branchmerge):
387 elif not (overwrite or branchmerge):
384 raise util.Abort(_("update spans branches, use 'hg merge' "
388 raise util.Abort(_("update spans branches, use 'hg merge' "
385 "or 'hg update -C' to lose changes"))
389 "or 'hg update -C' to lose changes"))
386 if branchmerge and not forcemerge:
390 if branchmerge and not forcemerge:
387 if wc.modified() or wc.added() or wc.removed():
391 if wc.modified() or wc.added() or wc.removed():
388 raise util.Abort(_("outstanding uncommitted changes"))
392 raise util.Abort(_("outstanding uncommitted changes"))
389
393
390 ### calculate phase
394 ### calculate phase
391 action = []
395 action = []
392 if not force:
396 if not force:
393 checkunknown(wc, p2)
397 checkunknown(wc, p2)
394 if not branchmerge:
398 if not branchmerge:
395 action += forgetremoved(wc, p2)
399 action += forgetremoved(wc, p2)
396 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
400 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
397
401
398 ### apply phase
402 ### apply phase
399 if not branchmerge: # just jump to the new rev
403 if not branchmerge: # just jump to the new rev
400 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
404 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
401 if not partial:
405 if not partial:
402 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
406 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
403
407
404 stats = applyupdates(repo, action, wc, p2)
408 stats = applyupdates(repo, action, wc, p2)
405
409
406 if not partial:
410 if not partial:
407 recordupdates(repo, action, branchmerge)
411 recordupdates(repo, action, branchmerge)
408 repo.dirstate.setparents(fp1, fp2)
412 repo.dirstate.setparents(fp1, fp2)
409 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
413 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
410
414
411 return stats
415 return stats
412
416
@@ -1,23 +1,23 b''
1 1:016807e6fdaf
1 1:016807e6fdaf
2 0:eb43f19ff115
2 0:eb43f19ff115
3 016807e6fdaf tip
3 016807e6fdaf tip
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 eb43f19ff115
5 eb43f19ff115
6 eb43f19ff115+
6 eb43f19ff115+
7 reverting file1
7 reverting file1
8 ? file1.orig
8 ? file1.orig
9 eb43f19ff115
9 eb43f19ff115
10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 ? file1.orig
11 ? file1.orig
12 016807e6fdaf tip
12 016807e6fdaf tip
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 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
14 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 ? file1.orig
15 ? file1.orig
16 016807e6fdaf tip
16 016807e6fdaf tip
17 ? file1.orig
17 ? file1.orig
18 016807e6fdaf tip
18 016807e6fdaf tip
19 ? file1.orig
19 ? file1.orig
20 016807e6fdaf tip
20 016807e6fdaf tip
21 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
21 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 ? file1.orig
22 ? file1.orig
23 016807e6fdaf tip
23 016807e6fdaf tip
@@ -1,55 +1,55 b''
1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2 %% no merges expected
2 %% no merges expected
3 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 (branch merge, don't forget to commit)
4 (branch merge, don't forget to commit)
5 diff -r d9e5953b9dec b
5 diff -r d9e5953b9dec b
6 --- /dev/null
6 --- /dev/null
7 +++ b/b
7 +++ b/b
8 @@ -0,0 +1,1 @@
8 @@ -0,0 +1,1 @@
9 +This is file b1
9 +This is file b1
10 M b
10 M b
11 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
11 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
12 %% merge should fail
12 %% merge should fail
13 abort: 'b' already exists in the working dir and differs from remote
13 abort: 'b' already exists in the working dir and differs from remote
14 %% merge of b expected
14 %% merge of b expected
15 merging for b
15 merging for b
16 merging b
16 merging b
17 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
17 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
18 (branch merge, don't forget to commit)
18 (branch merge, don't forget to commit)
19 diff -r d9e5953b9dec b
19 diff -r d9e5953b9dec b
20 --- /dev/null
20 --- /dev/null
21 +++ b/b
21 +++ b/b
22 @@ -0,0 +1,1 @@
22 @@ -0,0 +1,1 @@
23 +This is file b2
23 +This is file b2
24 M b
24 M b
25 %%
25 %%
26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
27 Contents of b should be "this is file b1"
27 Contents of b should be "this is file b1"
28 This is file b1
28 This is file b1
29 %% merge fails
29 %% merge fails
30 abort: outstanding uncommitted changes
30 abort: outstanding uncommitted changes
31 %% merge expected!
31 %% merge expected!
32 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
32 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
33 (branch merge, don't forget to commit)
33 (branch merge, don't forget to commit)
34 diff -r c1dd73cbf59f b
34 diff -r c1dd73cbf59f b
35 --- a/b
35 --- a/b
36 +++ b/b
36 +++ b/b
37 @@ -1,1 +1,1 @@ This is file b1
37 @@ -1,1 +1,1 @@ This is file b1
38 -This is file b1
38 -This is file b1
39 +This is file b22
39 +This is file b22
40 M b
40 M b
41 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
41 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
42 %% merge of b should fail
42 %% merge of b should fail
43 abort: outstanding uncommitted changes
43 abort: outstanding uncommitted changes
44 %% merge of b expected
44 %% merge of b expected
45 merging for b
45 merging for b
46 merging b
46 merging b
47 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
47 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
48 (branch merge, don't forget to commit)
48 (branch merge, don't forget to commit)
49 diff -r c1dd73cbf59f b
49 diff -r c1dd73cbf59f b
50 --- a/b
50 --- a/b
51 +++ b/b
51 +++ b/b
52 @@ -1,1 +1,1 @@ This is file b1
52 @@ -1,1 +1,1 @@ This is file b1
53 -This is file b1
53 -This is file b1
54 +This is file b33
54 +This is file b33
55 M b
55 M b
@@ -1,414 +1,414 b''
1 --------------
1 --------------
2 test L:up a R:nc a b W: - 1 get local a to b
2 test L:up a R:nc a b W: - 1 get local a to b
3 --------------
3 --------------
4 resolving manifests
4 resolving manifests
5 overwrite None partial False
5 overwrite None partial False
6 ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
6 ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
7 rev: versions differ -> m
7 rev: versions differ -> m
8 a: remote copied -> m
8 a: remote copied -> m
9 merging a and b
9 merging a and b
10 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
10 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
11 copying a to b
11 copying a to b
12 merging rev
12 merging rev
13 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
13 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
14 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
14 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
15 (branch merge, don't forget to commit)
15 (branch merge, don't forget to commit)
16 --------------
16 --------------
17 M a
17 M a
18 M b
18 M b
19 a
19 a
20 --------------
20 --------------
21
21
22 --------------
22 --------------
23 test L:nc a b R:up a W: - 2 get rem change to a and b
23 test L:nc a b R:up a W: - 2 get rem change to a and b
24 --------------
24 --------------
25 resolving manifests
25 resolving manifests
26 overwrite None partial False
26 overwrite None partial False
27 ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
27 ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
28 a: remote is newer -> g
28 a: remote is newer -> g
29 b: local copied -> m
29 b: local copied -> m
30 rev: versions differ -> m
30 rev: versions differ -> m
31 getting a
31 getting a
32 merging b and a
32 merging b and a
33 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
33 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
34 merging rev
34 merging rev
35 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
35 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
36 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
36 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
37 (branch merge, don't forget to commit)
37 (branch merge, don't forget to commit)
38 --------------
38 --------------
39 M a
39 M a
40 M b
40 M b
41 a
41 a
42 --------------
42 --------------
43
43
44 --------------
44 --------------
45 test L:up a R:nm a b W: - 3 get local a change to b, remove a
45 test L:up a R:nm a b W: - 3 get local a change to b, remove a
46 --------------
46 --------------
47 resolving manifests
47 resolving manifests
48 overwrite None partial False
48 overwrite None partial False
49 ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
49 ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
50 a: remote moved -> m
50 a: remote moved -> m
51 rev: versions differ -> m
51 rev: versions differ -> m
52 merging a and b
52 merging a and b
53 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
53 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
54 copying a to b
54 copying a to b
55 removing a
55 removing a
56 merging rev
56 merging rev
57 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
57 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
58 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
58 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
59 (branch merge, don't forget to commit)
59 (branch merge, don't forget to commit)
60 --------------
60 --------------
61 M b
61 M b
62 a
62 a
63 --------------
63 --------------
64
64
65 --------------
65 --------------
66 test L:nm a b R:up a W: - 4 get remote change to b
66 test L:nm a b R:up a W: - 4 get remote change to b
67 --------------
67 --------------
68 resolving manifests
68 resolving manifests
69 overwrite None partial False
69 overwrite None partial False
70 ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
70 ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
71 b: local moved -> m
71 b: local moved -> m
72 rev: versions differ -> m
72 rev: versions differ -> m
73 merging b and a
73 merging b and a
74 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
74 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
75 merging rev
75 merging rev
76 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
76 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
77 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
77 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
78 (branch merge, don't forget to commit)
78 (branch merge, don't forget to commit)
79 --------------
79 --------------
80 M b
80 M b
81 a
81 a
82 --------------
82 --------------
83
83
84 --------------
84 --------------
85 test L: R:nc a b W: - 5 get b
85 test L: R:nc a b W: - 5 get b
86 --------------
86 --------------
87 resolving manifests
87 resolving manifests
88 overwrite None partial False
88 overwrite None partial False
89 ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
89 ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
90 rev: versions differ -> m
90 rev: versions differ -> m
91 a: remote copied -> m
91 a: remote copied -> m
92 copying a to b
92 copying a to b
93 merging rev
93 merging rev
94 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
94 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
95 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
95 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
96 (branch merge, don't forget to commit)
96 (branch merge, don't forget to commit)
97 --------------
97 --------------
98 M b
98 M b
99 a
99 a
100 C a
100 C a
101 --------------
101 --------------
102
102
103 --------------
103 --------------
104 test L:nc a b R: W: - 6 nothing
104 test L:nc a b R: W: - 6 nothing
105 --------------
105 --------------
106 resolving manifests
106 resolving manifests
107 overwrite None partial False
107 overwrite None partial False
108 ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
108 ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
109 b: local copied -> m
109 b: local copied -> m
110 rev: versions differ -> m
110 rev: versions differ -> m
111 merging rev
111 merging rev
112 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
112 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
113 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
114 (branch merge, don't forget to commit)
114 (branch merge, don't forget to commit)
115 --------------
115 --------------
116 M b
116 M b
117 a
117 a
118 C a
118 C a
119 --------------
119 --------------
120
120
121 --------------
121 --------------
122 test L: R:nm a b W: - 7 get b
122 test L: R:nm a b W: - 7 get b
123 --------------
123 --------------
124 resolving manifests
124 resolving manifests
125 overwrite None partial False
125 overwrite None partial False
126 ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
126 ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
127 a: remote moved -> m
127 a: remote moved -> m
128 rev: versions differ -> m
128 rev: versions differ -> m
129 copying a to b
129 copying a to b
130 removing a
130 removing a
131 merging rev
131 merging rev
132 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
132 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
133 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
133 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
134 (branch merge, don't forget to commit)
134 (branch merge, don't forget to commit)
135 --------------
135 --------------
136 M b
136 M b
137 a
137 a
138 --------------
138 --------------
139
139
140 --------------
140 --------------
141 test L:nm a b R: W: - 8 nothing
141 test L:nm a b R: W: - 8 nothing
142 --------------
142 --------------
143 resolving manifests
143 resolving manifests
144 overwrite None partial False
144 overwrite None partial False
145 ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
145 ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
146 b: local moved -> m
146 b: local moved -> m
147 rev: versions differ -> m
147 rev: versions differ -> m
148 merging rev
148 merging rev
149 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
149 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
150 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
150 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
151 (branch merge, don't forget to commit)
151 (branch merge, don't forget to commit)
152 --------------
152 --------------
153 M b
153 M b
154 a
154 a
155 --------------
155 --------------
156
156
157 --------------
157 --------------
158 test L:um a b R:um a b W: - 9 do merge with ancestor in a
158 test L:um a b R:um a b W: - 9 do merge with ancestor in a
159 --------------
159 --------------
160 resolving manifests
160 resolving manifests
161 overwrite None partial False
161 overwrite None partial False
162 ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
162 ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
163 b: versions differ -> m
163 b: versions differ -> m
164 rev: versions differ -> m
164 rev: versions differ -> m
165 merging b
165 merging b
166 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
166 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
167 merging rev
167 merging rev
168 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
168 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
170 (branch merge, don't forget to commit)
170 (branch merge, don't forget to commit)
171 --------------
171 --------------
172 M b
172 M b
173 --------------
173 --------------
174
174
175 --------------
175 --------------
176 test L:nm a b R:nm a c W: - 11 get c, keep b
176 test L:nm a b R:nm a c W: - 11 get c, keep b
177 --------------
177 --------------
178 resolving manifests
178 resolving manifests
179 overwrite None partial False
179 overwrite None partial False
180 ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
180 ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
181 rev: versions differ -> m
181 rev: versions differ -> m
182 c: remote created -> g
182 c: remote created -> g
183 getting c
183 getting c
184 merging rev
184 merging rev
185 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
185 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
186 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
186 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
187 (branch merge, don't forget to commit)
187 (branch merge, don't forget to commit)
188 --------------
188 --------------
189 M c
189 M c
190 C b
190 C b
191 --------------
191 --------------
192
192
193 --------------
193 --------------
194 test L:nc a b R:up b W: - 12 merge b no ancestor
194 test L:nc a b R:up b W: - 12 merge b no ancestor
195 --------------
195 --------------
196 resolving manifests
196 resolving manifests
197 overwrite None partial False
197 overwrite None partial False
198 ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
198 ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
199 b: versions differ -> m
199 b: versions differ -> m
200 rev: versions differ -> m
200 rev: versions differ -> m
201 merging b
201 merging b
202 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
202 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
203 merging rev
203 merging rev
204 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
204 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
205 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
205 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
206 (branch merge, don't forget to commit)
206 (branch merge, don't forget to commit)
207 --------------
207 --------------
208 M b
208 M b
209 C a
209 C a
210 --------------
210 --------------
211
211
212 --------------
212 --------------
213 test L:up b R:nm a b W: - 13 merge b no ancestor
213 test L:up b R:nm a b W: - 13 merge b no ancestor
214 --------------
214 --------------
215 resolving manifests
215 resolving manifests
216 overwrite None partial False
216 overwrite None partial False
217 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
217 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
218 a: other deleted -> r
218 a: other deleted -> r
219 b: versions differ -> m
219 b: versions differ -> m
220 rev: versions differ -> m
220 rev: versions differ -> m
221 removing a
221 removing a
222 merging b
222 merging b
223 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
223 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
224 merging rev
224 merging rev
225 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
225 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
226 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
226 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
227 (branch merge, don't forget to commit)
227 (branch merge, don't forget to commit)
228 --------------
228 --------------
229 M b
229 M b
230 --------------
230 --------------
231
231
232 --------------
232 --------------
233 test L:nc a b R:up a b W: - 14 merge b no ancestor
233 test L:nc a b R:up a b W: - 14 merge b no ancestor
234 --------------
234 --------------
235 resolving manifests
235 resolving manifests
236 overwrite None partial False
236 overwrite None partial False
237 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
237 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
238 a: remote is newer -> g
238 a: remote is newer -> g
239 b: versions differ -> m
239 b: versions differ -> m
240 rev: versions differ -> m
240 rev: versions differ -> m
241 getting a
241 getting a
242 merging b
242 merging b
243 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
243 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
244 merging rev
244 merging rev
245 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
245 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
246 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
246 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
247 (branch merge, don't forget to commit)
247 (branch merge, don't forget to commit)
248 --------------
248 --------------
249 M a
249 M a
250 M b
250 M b
251 --------------
251 --------------
252
252
253 --------------
253 --------------
254 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
254 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
255 --------------
255 --------------
256 resolving manifests
256 resolving manifests
257 overwrite None partial False
257 overwrite None partial False
258 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
258 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
259 a: other deleted -> r
259 a: other deleted -> r
260 b: versions differ -> m
260 b: versions differ -> m
261 rev: versions differ -> m
261 rev: versions differ -> m
262 removing a
262 removing a
263 merging b
263 merging b
264 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
264 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
265 merging rev
265 merging rev
266 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
266 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
267 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
267 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
268 (branch merge, don't forget to commit)
268 (branch merge, don't forget to commit)
269 --------------
269 --------------
270 M b
270 M b
271 --------------
271 --------------
272
272
273 --------------
273 --------------
274 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
274 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
275 --------------
275 --------------
276 resolving manifests
276 resolving manifests
277 overwrite None partial False
277 overwrite None partial False
278 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
278 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
279 a: remote is newer -> g
279 a: remote is newer -> g
280 b: versions differ -> m
280 b: versions differ -> m
281 rev: versions differ -> m
281 rev: versions differ -> m
282 getting a
282 getting a
283 merging b
283 merging b
284 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
284 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
285 merging rev
285 merging rev
286 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
286 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
287 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
287 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
288 (branch merge, don't forget to commit)
288 (branch merge, don't forget to commit)
289 --------------
289 --------------
290 M a
290 M a
291 M b
291 M b
292 --------------
292 --------------
293
293
294 --------------
294 --------------
295 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
295 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
296 --------------
296 --------------
297 resolving manifests
297 resolving manifests
298 overwrite None partial False
298 overwrite None partial False
299 ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
299 ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
300 b: versions differ -> m
300 b: versions differ -> m
301 rev: versions differ -> m
301 rev: versions differ -> m
302 merging b
302 merging b
303 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
303 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
304 merging rev
304 merging rev
305 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
305 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
306 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
306 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
307 (branch merge, don't forget to commit)
307 (branch merge, don't forget to commit)
308 --------------
308 --------------
309 M b
309 M b
310 C a
310 C a
311 --------------
311 --------------
312
312
313 --------------
313 --------------
314 test L:nm a b R:up a b W: - 18 merge b no ancestor
314 test L:nm a b R:up a b W: - 18 merge b no ancestor
315 --------------
315 --------------
316 resolving manifests
316 resolving manifests
317 overwrite None partial False
317 overwrite None partial False
318 ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
318 ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
319 b: versions differ -> m
319 b: versions differ -> m
320 rev: versions differ -> m
320 rev: versions differ -> m
321 a: prompt recreating -> g
321 a: prompt recreating -> g
322 getting a
322 getting a
323 merging b
323 merging b
324 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
324 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
325 merging rev
325 merging rev
326 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
326 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
327 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
327 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
328 (branch merge, don't forget to commit)
328 (branch merge, don't forget to commit)
329 --------------
329 --------------
330 M a
330 M a
331 M b
331 M b
332 --------------
332 --------------
333
333
334 --------------
334 --------------
335 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
335 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
336 --------------
336 --------------
337 resolving manifests
337 resolving manifests
338 overwrite None partial False
338 overwrite None partial False
339 ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
339 ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
340 b: versions differ -> m
340 b: versions differ -> m
341 rev: versions differ -> m
341 rev: versions differ -> m
342 merging b
342 merging b
343 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
343 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
344 merging rev
344 merging rev
345 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
345 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
346 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
346 0 files updated, 2 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 --------------
348 --------------
349 M b
349 M b
350 C a
350 C a
351 --------------
351 --------------
352
352
353 --------------
353 --------------
354 test L:up a R:um a b W: - 20 merge a and b to b, remove a
354 test L:up a R:um a b W: - 20 merge a and b to b, remove a
355 --------------
355 --------------
356 resolving manifests
356 resolving manifests
357 overwrite None partial False
357 overwrite None partial False
358 ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
358 ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
359 a: remote moved -> m
359 a: remote moved -> m
360 rev: versions differ -> m
360 rev: versions differ -> m
361 merging a and b
361 merging a and b
362 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
362 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
363 copying a to b
363 copying a to b
364 removing a
364 removing a
365 merging rev
365 merging rev
366 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
366 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
367 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
367 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
368 (branch merge, don't forget to commit)
368 (branch merge, don't forget to commit)
369 --------------
369 --------------
370 M b
370 M b
371 a
371 a
372 --------------
372 --------------
373
373
374 --------------
374 --------------
375 test L:um a b R:up a W: - 21 merge a and b to b
375 test L:um a b R:up a W: - 21 merge a and b to b
376 --------------
376 --------------
377 resolving manifests
377 resolving manifests
378 overwrite None partial False
378 overwrite None partial False
379 ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
379 ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
380 b: local moved -> m
380 b: local moved -> m
381 rev: versions differ -> m
381 rev: versions differ -> m
382 merging b and a
382 merging b and a
383 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
383 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
384 merging rev
384 merging rev
385 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
385 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
386 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
386 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
387 (branch merge, don't forget to commit)
387 (branch merge, don't forget to commit)
388 --------------
388 --------------
389 M b
389 M b
390 a
390 a
391 --------------
391 --------------
392
392
393 --------------
393 --------------
394 test L:nm a b R:up a c W: - 23 get c, keep b
394 test L:nm a b R:up a c W: - 23 get c, keep b
395 --------------
395 --------------
396 resolving manifests
396 resolving manifests
397 overwrite None partial False
397 overwrite None partial False
398 ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
398 ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
399 b: local moved -> m
399 b: local moved -> m
400 rev: versions differ -> m
400 rev: versions differ -> m
401 c: remote created -> g
401 c: remote created -> g
402 merging b and a
402 merging b and a
403 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
403 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
404 getting c
404 getting c
405 merging rev
405 merging rev
406 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
406 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
407 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
407 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
408 (branch merge, don't forget to commit)
408 (branch merge, don't forget to commit)
409 --------------
409 --------------
410 M b
410 M b
411 a
411 a
412 M c
412 M c
413 --------------
413 --------------
414
414
@@ -1,136 +1,136 b''
1 adding a
1 adding a
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 diff -r 33aaa84a386b a
4 diff -r 33aaa84a386b a
5 --- a/a
5 --- a/a
6 +++ b/a
6 +++ b/a
7 @@ -1,1 +1,1 @@ a
7 @@ -1,1 +1,1 @@ a
8 -a
8 -a
9 +abc
9 +abc
10 adding b
10 adding b
11 M a
11 M a
12 changeset: 0:33aaa84a386b
12 changeset: 0:33aaa84a386b
13 user: test
13 user: test
14 date: Mon Jan 12 13:46:40 1970 +0000
14 date: Mon Jan 12 13:46:40 1970 +0000
15 summary: 1
15 summary: 1
16
16
17 resolving manifests
17 resolving manifests
18 overwrite False partial False
18 overwrite False partial False
19 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
19 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
20 a: versions differ -> m
20 a: versions differ -> m
21 b: remote created -> g
21 b: remote created -> g
22 merging a
22 merging a
23 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
23 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
24 getting b
24 getting b
25 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
25 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
26 changeset: 1:802f095af299
26 changeset: 1:802f095af299
27 tag: tip
27 tag: tip
28 user: test
28 user: test
29 date: Mon Jan 12 13:46:40 1970 +0000
29 date: Mon Jan 12 13:46:40 1970 +0000
30 summary: 2
30 summary: 2
31
31
32 resolving manifests
32 resolving manifests
33 overwrite False partial False
33 overwrite False partial False
34 ancestor 33aaa84a386b local 802f095af299+ remote 33aaa84a386b
34 ancestor 33aaa84a386b local 802f095af299+ remote 33aaa84a386b
35 b: remote deleted -> r
35 b: remote deleted -> r
36 removing b
36 removing b
37 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
37 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
38 changeset: 0:33aaa84a386b
38 changeset: 0:33aaa84a386b
39 user: test
39 user: test
40 date: Mon Jan 12 13:46:40 1970 +0000
40 date: Mon Jan 12 13:46:40 1970 +0000
41 summary: 1
41 summary: 1
42
42
43 abort: there is nothing to merge - use "hg update" instead
43 abort: there is nothing to merge - use "hg update" instead
44 failed
44 failed
45 changeset: 0:33aaa84a386b
45 changeset: 0:33aaa84a386b
46 user: test
46 user: test
47 date: Mon Jan 12 13:46:40 1970 +0000
47 date: Mon Jan 12 13:46:40 1970 +0000
48 summary: 1
48 summary: 1
49
49
50 resolving manifests
50 resolving manifests
51 overwrite False partial False
51 overwrite False partial False
52 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
52 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
53 a: versions differ -> m
53 a: versions differ -> m
54 b: remote created -> g
54 b: remote created -> g
55 merging a
55 merging a
56 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
56 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
57 getting b
57 getting b
58 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
58 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
59 changeset: 1:802f095af299
59 changeset: 1:802f095af299
60 tag: tip
60 tag: tip
61 user: test
61 user: test
62 date: Mon Jan 12 13:46:40 1970 +0000
62 date: Mon Jan 12 13:46:40 1970 +0000
63 summary: 2
63 summary: 2
64
64
65 changeset: 1:802f095af299
65 changeset: 1:802f095af299
66 tag: tip
66 tag: tip
67 user: test
67 user: test
68 date: Mon Jan 12 13:46:40 1970 +0000
68 date: Mon Jan 12 13:46:40 1970 +0000
69 files: a b
69 files: a b
70 description:
70 description:
71 2
71 2
72
72
73
73
74 changeset: 0:33aaa84a386b
74 changeset: 0:33aaa84a386b
75 user: test
75 user: test
76 date: Mon Jan 12 13:46:40 1970 +0000
76 date: Mon Jan 12 13:46:40 1970 +0000
77 files: a
77 files: a
78 description:
78 description:
79 1
79 1
80
80
81
81
82 diff -r 802f095af299 a
82 diff -r 802f095af299 a
83 --- a/a
83 --- a/a
84 +++ b/a
84 +++ b/a
85 @@ -1,1 +1,1 @@ a2
85 @@ -1,1 +1,1 @@ a2
86 -a2
86 -a2
87 +abc
87 +abc
88 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
88 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
89 adding b
89 adding b
90 M a
90 M a
91 changeset: 1:802f095af299
91 changeset: 1:802f095af299
92 user: test
92 user: test
93 date: Mon Jan 12 13:46:40 1970 +0000
93 date: Mon Jan 12 13:46:40 1970 +0000
94 summary: 2
94 summary: 2
95
95
96 abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes
96 abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes
97 failed
97 failed
98 abort: outstanding uncommitted changes
98 abort: outstanding uncommitted changes
99 failed
99 failed
100 resolving manifests
100 resolving manifests
101 overwrite False partial False
101 overwrite False partial False
102 ancestor 33aaa84a386b local 802f095af299+ remote 030602aee63d
102 ancestor 33aaa84a386b local 802f095af299+ remote 030602aee63d
103 a: versions differ -> m
103 a: versions differ -> m
104 b: versions differ -> m
104 b: versions differ -> m
105 merging a
105 merging a
106 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
106 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
107 merging b
107 merging b
108 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
108 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
109 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
109 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
110 (branch merge, don't forget to commit)
110 (branch merge, don't forget to commit)
111 changeset: 1:802f095af299
111 changeset: 1:802f095af299
112 user: test
112 user: test
113 date: Mon Jan 12 13:46:40 1970 +0000
113 date: Mon Jan 12 13:46:40 1970 +0000
114 summary: 2
114 summary: 2
115
115
116 changeset: 2:030602aee63d
116 changeset: 2:030602aee63d
117 tag: tip
117 tag: tip
118 parent: 0:33aaa84a386b
118 parent: 0:33aaa84a386b
119 user: test
119 user: test
120 date: Mon Jan 12 13:46:40 1970 +0000
120 date: Mon Jan 12 13:46:40 1970 +0000
121 summary: 3
121 summary: 3
122
122
123 diff -r 802f095af299 a
123 diff -r 802f095af299 a
124 --- a/a
124 --- a/a
125 +++ b/a
125 +++ b/a
126 @@ -1,1 +1,1 @@ a2
126 @@ -1,1 +1,1 @@ a2
127 -a2
127 -a2
128 +abc
128 +abc
129 adding a
129 adding a
130 pulling from ../a
130 pulling from ../a
131 requesting all changes
131 requesting all changes
132 adding changesets
132 adding changesets
133 adding manifests
133 adding manifests
134 adding file changes
134 adding file changes
135 added 1 changesets with 1 changes to 1 files
135 added 1 changesets with 1 changes to 1 files
136 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
136 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
General Comments 0
You need to be logged in to leave comments. Login now