Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/hg.py @ 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 |
comparison
equal
deleted
inserted
replaced
302:498fb0fa2795 | 305:719812eb0156 |
---|---|
884 if not force and pl[1] != nullid: | 884 if not force and pl[1] != nullid: |
885 self.ui.warn("aborting: outstanding uncommitted merges\n") | 885 self.ui.warn("aborting: outstanding uncommitted merges\n") |
886 return | 886 return |
887 | 887 |
888 p1, p2 = pl[0], node | 888 p1, p2 = pl[0], node |
889 pa = self.changelog.ancestor(p1, p2) | |
889 m1n = self.changelog.read(p1)[0] | 890 m1n = self.changelog.read(p1)[0] |
890 m2n = self.changelog.read(p2)[0] | 891 m2n = self.changelog.read(p2)[0] |
891 man = self.manifest.ancestor(m1n, m2n) | 892 man = self.manifest.ancestor(m1n, m2n) |
892 m1 = self.manifest.read(m1n) | 893 m1 = self.manifest.read(m1n) |
893 mf1 = self.manifest.readflags(m1n) | 894 mf1 = self.manifest.readflags(m1n) |
905 (short(man), short(m1n), short(m2n))) | 906 (short(man), short(m1n), short(m2n))) |
906 | 907 |
907 merge = {} | 908 merge = {} |
908 get = {} | 909 get = {} |
909 remove = [] | 910 remove = [] |
911 mark = {} | |
910 | 912 |
911 # construct a working dir manifest | 913 # construct a working dir manifest |
912 mw = m1.copy() | 914 mw = m1.copy() |
913 mfw = mf1.copy() | 915 mfw = mf1.copy() |
914 for f in a + c + u: | 916 for f in a + c + u: |
932 # "if we changed or they changed, change in merge" | 934 # "if we changed or they changed, change in merge" |
933 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] | 935 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] |
934 mode = ((a^b) | (a^c)) ^ a | 936 mode = ((a^b) | (a^c)) ^ a |
935 merge[f] = (m1.get(f, nullid), m2[f], mode) | 937 merge[f] = (m1.get(f, nullid), m2[f], mode) |
936 s = 1 | 938 s = 1 |
937 # is this an unmodified file or are we clobbering? | 939 # are we clobbering? |
938 elif mw[f] == m1[f] or force: | 940 # is remote's version newer? |
941 # or are we going back in time? | |
942 elif force or m2[f] != a or (p2 == pa and mw[f] == m1[f]): | |
939 self.ui.debug(" remote %s is newer, get\n" % f) | 943 self.ui.debug(" remote %s is newer, get\n" % f) |
940 get[f] = m2[f] | 944 get[f] = m2[f] |
941 s = 1 | 945 s = 1 |
946 else: | |
947 mark[f] = 1 | |
942 | 948 |
943 if not s and mfw[f] != mf2[f]: | 949 if not s and mfw[f] != mf2[f]: |
944 if force: | 950 if force: |
945 self.ui.debug(" updating permissions for %s\n" % f) | 951 self.ui.debug(" updating permissions for %s\n" % f) |
946 set_exec(self.wjoin(f), mf2[f]) | 952 set_exec(self.wjoin(f), mf2[f]) |
948 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] | 954 a, b, c = mfa.get(f, 0), mfw[f], mf2[f] |
949 mode = ((a^b) | (a^c)) ^ a | 955 mode = ((a^b) | (a^c)) ^ a |
950 if mode != b: | 956 if mode != b: |
951 self.ui.debug(" updating permissions for %s\n" % f) | 957 self.ui.debug(" updating permissions for %s\n" % f) |
952 set_exec(self.wjoin(f), mode) | 958 set_exec(self.wjoin(f), mode) |
953 | 959 mark[f] = 1 |
954 del m2[f] | 960 del m2[f] |
955 elif f in ma: | 961 elif f in ma: |
956 if not force and n != ma[f]: | 962 if not force and n != ma[f]: |
957 r = self.ui.prompt( | 963 r = self.ui.prompt( |
958 (" local changed %s which remote deleted\n" % f) + | 964 (" local changed %s which remote deleted\n" % f) + |
985 if force: | 991 if force: |
986 for f in merge: | 992 for f in merge: |
987 get[f] = merge[f][1] | 993 get[f] = merge[f][1] |
988 merge = {} | 994 merge = {} |
989 | 995 |
990 if not merge: | 996 if pa == p1 or pa == p2: |
991 # we don't need to do any magic, just jump to the new rev | 997 # we don't need to do any magic, just jump to the new rev |
992 mode = 'n' | 998 mode = 'n' |
993 p1, p2 = p2, nullid | 999 p1, p2 = p2, nullid |
994 else: | 1000 else: |
995 if not allow: | 1001 if not allow: |
996 self.ui.status("the following files conflict:\n") | 1002 self.ui.status("this update spans a branch" + |
997 for f in merge: | 1003 " affecting the following files:\n") |
998 self.ui.status(" %s\n" % f) | 1004 fl = merge.keys() + get.keys() |
999 self.ui.warn("aborting update due to conflicting files!\n") | 1005 fl.sort() |
1000 self.ui.status("(use update -m to allow a merge)\n") | 1006 for f in fl: |
1007 cf = "" | |
1008 if f in merge: cf = " (resolve)" | |
1009 self.ui.status(" %s%s\n" % (f, cf)) | |
1010 self.ui.warn("aborting update spanning branches!\n") | |
1011 self.ui.status("(use update -m to perform a branch merge)\n") | |
1001 return 1 | 1012 return 1 |
1002 # we have to remember what files we needed to get/change | 1013 # we have to remember what files we needed to get/change |
1003 # because any file that's different from either one of its | 1014 # because any file that's different from either one of its |
1004 # parents must be in the changeset | 1015 # parents must be in the changeset |
1005 mode = 'm' | 1016 mode = 'm' |
1017 self.dirstate.update(mark.keys(), "m") | |
1006 | 1018 |
1007 self.dirstate.setparents(p1, p2) | 1019 self.dirstate.setparents(p1, p2) |
1008 | 1020 |
1009 # get the files we don't need to change | 1021 # get the files we don't need to change |
1010 files = get.keys() | 1022 files = get.keys() |