# HG changeset patch # User mpm@selenic.com # Date 1118424962 28800 # Node ID 719812eb0156ade1b4004f5a905fcc9e599034df # Parent 498fb0fa2795da638c2a534dc42588901f36105b 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----- diff -r 498fb0fa2795 -r 719812eb0156 mercurial/hg.py --- a/mercurial/hg.py Fri Jun 10 00:29:36 2005 -0800 +++ b/mercurial/hg.py Fri Jun 10 09:36:02 2005 -0800 @@ -886,6 +886,7 @@ 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 @@ merge = {} get = {} remove = [] + mark = {} # construct a working dir manifest mw = m1.copy() @@ -934,11 +936,15 @@ 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 @@ 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 @@ 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)