comparison mercurial/merge.py @ 3297:69b9471f26bb

merge: pass contexts to applyupdates
author Matt Mackall <mpm@selenic.com>
date Mon, 09 Oct 2006 20:32:03 -0500
parents 20087b4bc6f9
children e7abcf3a7c5f
comparison
equal deleted inserted replaced
3296:20087b4bc6f9 3297:69b9471f26bb
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, fd, my, other, p1, p2, move): 13 def filemerge(repo, fw, fo, fd, my, other, wctx, mctx, move):
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 and first parent 16 fw = filename in the working directory and first parent
17 fo = filename in other parent 17 fo = filename in other parent
18 fd = destination filename 18 fd = destination filename
19 my = fileid in first parent 19 my = fileid in first parent
20 other = fileid in second parent 20 other = fileid in second parent
21 p1, p2 = hex changeset ids for merge command 21 wctx, mctx = working and merge changecontexts
22 move = whether to move or copy the file to the destination 22 move = whether to move or copy the file to the destination
23 23
24 TODO: 24 TODO:
25 if fw is copied in the working directory, we get confused 25 if fw is copied in the working directory, we get confused
26 implement move and fd 26 implement move and fd
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': p1, 53 'HG_MY_NODE': str(wctx.parents()[0]),
54 'HG_OTHER_NODE': p2}) 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 else: 57 else:
58 if fd != fw: 58 if fd != fw:
59 repo.ui.debug(_("copying %s to %s\n") % (fw, fd)) 59 repo.ui.debug(_("copying %s to %s\n") % (fw, fd))
273 else: 273 else:
274 act("remote created", f, "g", m2.execf(f), n) 274 act("remote created", f, "g", m2.execf(f), n)
275 275
276 return action 276 return action
277 277
278 def applyupdates(repo, action, xp1, xp2): 278 def applyupdates(repo, action, wctx, mctx):
279 updated, merged, removed, unresolved = 0, 0, 0, 0 279 updated, merged, removed, unresolved = 0, 0, 0, 0
280 action.sort() 280 action.sort()
281 for a in action: 281 for a in action:
282 f, m = a[:2] 282 f, m = a[:2]
283 if f[0] == "/": 283 if f[0] == "/":
293 (f, inst.strerror)) 293 (f, inst.strerror))
294 removed +=1 294 removed +=1
295 elif m == "c": # copy 295 elif m == "c": # copy
296 f2, fd, my, other, flag, move = a[2:] 296 f2, fd, my, other, flag, move = a[2:]
297 repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd)) 297 repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd))
298 if filemerge(repo, f, f2, fd, my, other, xp1, xp2, move): 298 if filemerge(repo, f, f2, fd, my, other, wctx, mctx, move):
299 unresolved += 1 299 unresolved += 1
300 util.set_exec(repo.wjoin(fd), flag) 300 util.set_exec(repo.wjoin(fd), flag)
301 merged += 1 301 merged += 1
302 elif m == "m": # merge 302 elif m == "m": # merge
303 flag, my, other = a[2:] 303 flag, my, other = a[2:]
304 repo.ui.status(_("merging %s\n") % f) 304 repo.ui.status(_("merging %s\n") % f)
305 if filemerge(repo, f, f, f, my, other, xp1, xp2, False): 305 if filemerge(repo, f, f, f, my, other, wctx, mctx, False):
306 unresolved += 1 306 unresolved += 1
307 util.set_exec(repo.wjoin(f), flag) 307 util.set_exec(repo.wjoin(f), flag)
308 merged += 1 308 merged += 1
309 elif m == "g": # get 309 elif m == "g": # get
310 flag, node = a[2:] 310 flag, node = a[2:]
431 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) 431 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
432 432
433 if not partial: 433 if not partial:
434 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) 434 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
435 435
436 updated, merged, removed, unresolved = applyupdates(repo, action, xp1, xp2) 436 updated, merged, removed, unresolved = applyupdates(repo, action, wc, p2)
437 437
438 # update dirstate 438 # update dirstate
439 if not partial: 439 if not partial:
440 recordupdates(repo, action, branchmerge) 440 recordupdates(repo, action, branchmerge)
441 repo.dirstate.setparents(fp1, fp2) 441 repo.dirstate.setparents(fp1, fp2)