61 |
61 |
62 os.unlink(b) |
62 os.unlink(b) |
63 os.unlink(c) |
63 os.unlink(c) |
64 return r |
64 return r |
65 |
65 |
66 def checkunknown(repo, m2, wctx): |
66 def checkunknown(wctx, mctx): |
67 """ |
67 """ |
68 check for collisions between unknown files and files in m2 |
68 check for collisions between unknown files and files in m2 |
69 """ |
69 """ |
|
70 man = mctx.manifest() |
70 for f in wctx.unknown(): |
71 for f in wctx.unknown(): |
71 if f in m2: |
72 if f in man: |
72 if repo.file(f).cmp(m2[f], repo.wread(f)): |
73 if mctx.filectx(f).cmp(wctx.filectx(f).data()): |
73 raise util.Abort(_("'%s' already exists in the working" |
74 raise util.Abort(_("'%s' already exists in the working" |
74 " dir and differs from remote") % f) |
75 " dir and differs from remote") % f) |
75 |
76 |
76 def forgetremoved(m2, wctx): |
77 def forgetremoved(wctx, mctx): |
77 """ |
78 """ |
78 Forget removed files |
79 Forget removed files |
79 |
80 |
80 If we're jumping between revisions (as opposed to merging), and if |
81 If we're jumping between revisions (as opposed to merging), and if |
81 neither the working directory nor the target rev has the file, |
82 neither the working directory nor the target rev has the file, |
83 dirstate from listing the file when it is no longer in the |
84 dirstate from listing the file when it is no longer in the |
84 manifest. |
85 manifest. |
85 """ |
86 """ |
86 |
87 |
87 action = [] |
88 action = [] |
88 |
89 man = mctx.manifest() |
89 for f in wctx.deleted() + wctx.removed(): |
90 for f in wctx.deleted() + wctx.removed(): |
90 if f not in m2: |
91 if f not in man: |
91 action.append((f, "f")) |
92 action.append((f, "f")) |
92 |
93 |
93 return action |
94 return action |
94 |
95 |
95 def nonoverlap(d1, d2): |
96 def nonoverlap(d1, d2): |
381 |
382 |
382 if branchmerge and not forcemerge: |
383 if branchmerge and not forcemerge: |
383 if wc.modified() or wc.added() or wc.removed(): |
384 if wc.modified() or wc.added() or wc.removed(): |
384 raise util.Abort(_("outstanding uncommitted changes")) |
385 raise util.Abort(_("outstanding uncommitted changes")) |
385 |
386 |
386 m1 = wc.manifest() |
|
387 m2 = p2.manifest() |
|
388 |
|
389 # resolve the manifest to determine which files |
387 # resolve the manifest to determine which files |
390 # we care about merging |
388 # we care about merging |
391 repo.ui.note(_("resolving manifests\n")) |
389 repo.ui.note(_("resolving manifests\n")) |
392 repo.ui.debug(_(" overwrite %s branchmerge %s partial %s\n") % |
390 repo.ui.debug(_(" overwrite %s branchmerge %s partial %s\n") % |
393 (overwrite, branchmerge, bool(partial))) |
391 (overwrite, branchmerge, bool(partial))) |
394 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa)) |
392 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa)) |
395 |
393 |
396 action = [] |
394 action = [] |
397 |
395 |
398 if not force: |
396 if not force: |
399 checkunknown(repo, m2, wc) |
397 checkunknown(wc, p2) |
400 if not branchmerge: |
398 if not branchmerge: |
401 action += forgetremoved(m2, wc) |
399 action += forgetremoved(wc, p2) |
402 |
400 |
403 action += manifestmerge(repo, wc, p2, pa, overwrite, partial) |
401 action += manifestmerge(repo, wc, p2, pa, overwrite, partial) |
404 |
402 |
405 ### apply phase |
403 ### apply phase |
406 |
404 |