51 forcemerge=False, wlock=None, show_stats=True, remind=True): |
51 forcemerge=False, wlock=None, show_stats=True, remind=True): |
52 |
52 |
53 if not wlock: |
53 if not wlock: |
54 wlock = repo.wlock() |
54 wlock = repo.wlock() |
55 |
55 |
|
56 ### check phase |
|
57 |
56 pl = repo.dirstate.parents() |
58 pl = repo.dirstate.parents() |
57 if not force and pl[1] != nullid: |
59 if not force and pl[1] != nullid: |
58 raise util.Abort(_("outstanding uncommitted merges")) |
60 raise util.Abort(_("outstanding uncommitted merges")) |
59 |
61 |
60 p1, p2 = pl[0], node |
62 p1, p2 = pl[0], node |
61 pa = repo.changelog.ancestor(p1, p2) |
63 pa = repo.changelog.ancestor(p1, p2) |
|
64 |
|
65 # is there a linear path from p1 to p2? |
|
66 linear_path = (pa == p1 or pa == p2) |
|
67 if branchmerge and linear_path: |
|
68 raise util.Abort(_("there is nothing to merge, just use " |
|
69 "'hg update' or look at 'hg heads'")) |
|
70 |
|
71 if not force and not linear_path and not branchmerge: |
|
72 raise util.Abort(_("this update spans a branch, use 'hg merge' " |
|
73 "or 'hg update -C' to lose changes")) |
|
74 |
|
75 modified, added, removed, deleted, unknown = repo.changes() |
|
76 if branchmerge and not forcemerge: |
|
77 if modified or added or removed: |
|
78 raise util.Abort(_("outstanding uncommitted changes")) |
|
79 |
62 m1n = repo.changelog.read(p1)[0] |
80 m1n = repo.changelog.read(p1)[0] |
63 m2n = repo.changelog.read(p2)[0] |
81 m2n = repo.changelog.read(p2)[0] |
64 man = repo.manifest.ancestor(m1n, m2n) |
82 man = repo.manifest.ancestor(m1n, m2n) |
65 m1 = repo.manifest.read(m1n) |
83 m1 = repo.manifest.read(m1n) |
66 mf1 = repo.manifest.readflags(m1n) |
84 mf1 = repo.manifest.readflags(m1n) |
67 m2 = repo.manifest.read(m2n).copy() |
85 m2 = repo.manifest.read(m2n).copy() |
68 mf2 = repo.manifest.readflags(m2n) |
86 mf2 = repo.manifest.readflags(m2n) |
69 ma = repo.manifest.read(man) |
87 ma = repo.manifest.read(man) |
70 mfa = repo.manifest.readflags(man) |
88 mfa = repo.manifest.readflags(man) |
71 |
|
72 modified, added, removed, deleted, unknown = repo.changes() |
|
73 |
|
74 # is this a jump, or a merge? i.e. is there a linear path |
|
75 # from p1 to p2? |
|
76 linear_path = (pa == p1 or pa == p2) |
|
77 |
|
78 if branchmerge and linear_path: |
|
79 raise util.Abort(_("there is nothing to merge, just use " |
|
80 "'hg update' or look at 'hg heads'")) |
|
81 if branchmerge and not forcemerge: |
|
82 if modified or added or removed: |
|
83 raise util.Abort(_("outstanding uncommitted changes")) |
|
84 |
89 |
85 if not forcemerge and not force: |
90 if not forcemerge and not force: |
86 for f in unknown: |
91 for f in unknown: |
87 if f in m2: |
92 if f in m2: |
88 t1 = repo.wread(f) |
93 t1 = repo.wread(f) |
232 merge = {} |
237 merge = {} |
233 |
238 |
234 if linear_path or force: |
239 if linear_path or force: |
235 # we don't need to do any magic, just jump to the new rev |
240 # we don't need to do any magic, just jump to the new rev |
236 p1, p2 = p2, nullid |
241 p1, p2 = p2, nullid |
237 else: |
|
238 if not branchmerge: |
|
239 repo.ui.status(_("this update spans a branch" |
|
240 " affecting the following files:\n")) |
|
241 fl = merge.keys() + get.keys() |
|
242 fl.sort() |
|
243 for f in fl: |
|
244 cf = "" |
|
245 if f in merge: |
|
246 cf = _(" (resolve)") |
|
247 repo.ui.status(" %s%s\n" % (f, cf)) |
|
248 repo.ui.warn(_("aborting update spanning branches!\n")) |
|
249 repo.ui.status(_("(use 'hg merge' to merge across branches" |
|
250 " or 'hg update -C' to lose changes)\n")) |
|
251 return 1 |
|
252 |
242 |
253 xp1 = hex(p1) |
243 xp1 = hex(p1) |
254 xp2 = hex(p2) |
244 xp2 = hex(p2) |
255 if p2 == nullid: xxp2 = '' |
245 if p2 == nullid: xxp2 = '' |
256 else: xxp2 = xp2 |
246 else: xxp2 = xp2 |