Mercurial > hg > mercurial-crew-with-dirclash
changeset 305:719812eb0156
more merge fixes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
more merge fixes
Logic for getting a remote change should work going backwards and forwards
Mark all the changes in the merge that we don't get or merge so we
have the right list of files in the changeset
manifest hash: 88be742f510a2c58b276172ae538f9533f5e7491
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCqc+CywK+sNU5EO8RAjOKAJwNkC7phUO77IGW20R7MKyWBGP01gCgjxP6
K2CqUESHr2+0J96q3N74Siw=
=zb2f
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Fri, 10 Jun 2005 09:36:02 -0800 |
parents | 498fb0fa2795 |
children | f06a4a3b86a7 |
files | mercurial/hg.py |
diffstat | 1 files changed, 21 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -886,6 +886,7 @@ class localrepository: return p1, p2 = pl[0], node + pa = self.changelog.ancestor(p1, p2) m1n = self.changelog.read(p1)[0] m2n = self.changelog.read(p2)[0] man = self.manifest.ancestor(m1n, m2n) @@ -907,6 +908,7 @@ class localrepository: merge = {} get = {} remove = [] + mark = {} # construct a working dir manifest mw = m1.copy() @@ -934,11 +936,15 @@ class localrepository: mode = ((a^b) | (a^c)) ^ a merge[f] = (m1.get(f, nullid), m2[f], mode) s = 1 - # is this an unmodified file or are we clobbering? - elif mw[f] == m1[f] or force: + # are we clobbering? + # is remote's version newer? + # or are we going back in time? + elif force or m2[f] != a or (p2 == pa and mw[f] == m1[f]): self.ui.debug(" remote %s is newer, get\n" % f) get[f] = m2[f] s = 1 + else: + mark[f] = 1 if not s and mfw[f] != mf2[f]: if force: @@ -950,7 +956,7 @@ class localrepository: if mode != b: self.ui.debug(" updating permissions for %s\n" % f) set_exec(self.wjoin(f), mode) - + mark[f] = 1 del m2[f] elif f in ma: if not force and n != ma[f]: @@ -987,22 +993,28 @@ class localrepository: get[f] = merge[f][1] merge = {} - if not merge: + if pa == p1 or pa == p2: # we don't need to do any magic, just jump to the new rev mode = 'n' p1, p2 = p2, nullid else: if not allow: - self.ui.status("the following files conflict:\n") - for f in merge: - self.ui.status(" %s\n" % f) - self.ui.warn("aborting update due to conflicting files!\n") - self.ui.status("(use update -m to allow a merge)\n") + self.ui.status("this update spans a branch" + + " affecting the following files:\n") + fl = merge.keys() + get.keys() + fl.sort() + for f in fl: + cf = "" + if f in merge: cf = " (resolve)" + self.ui.status(" %s%s\n" % (f, cf)) + self.ui.warn("aborting update spanning branches!\n") + self.ui.status("(use update -m to perform a branch merge)\n") return 1 # we have to remember what files we needed to get/change # because any file that's different from either one of its # parents must be in the changeset mode = 'm' + self.dirstate.update(mark.keys(), "m") self.dirstate.setparents(p1, p2)