Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/hg.py @ 275:61d45b0ba8fb
various merge improvements
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
various merge improvements
add -C flag: force update and overwrite local changes
add -m flag: allow merges with conflicts
we no longer do merge by default
and we print a warning message when the merge fails
fix bug in printing merge failure message
fix bug diffing files in 'm' state
manifest hash: 75545a6db45d1e371082343d01c9f177df0f9db3
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCpm6tywK+sNU5EO8RAvb+AJ0euC3YkUYA944hds3ooPxbw6NpVwCfc1dj
TiNsPIds560S5jgw44eWNto=
=GPXN
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Tue, 07 Jun 2005 20:06:05 -0800 |
parents | 4f8174389001 |
children | 10e325db7347 |
comparison
equal
deleted
inserted
replaced
274:5da941efbb52 | 275:61d45b0ba8fb |
---|---|
833 % (files, changesets, revisions)) | 833 % (files, changesets, revisions)) |
834 | 834 |
835 tr.close() | 835 tr.close() |
836 return | 836 return |
837 | 837 |
838 def update(self, node): | 838 def update(self, node, allow=False, force=False): |
839 pl = self.dirstate.parents() | 839 pl = self.dirstate.parents() |
840 if pl[1] != nullid: | 840 if not force and pl[1] != nullid: |
841 self.ui.warn("aborting: outstanding uncommitted merges\n") | 841 self.ui.warn("aborting: outstanding uncommitted merges\n") |
842 return | 842 return |
843 | 843 |
844 p1, p2 = pl[0], node | 844 p1, p2 = pl[0], node |
845 m1n = self.changelog.read(p1)[0] | 845 m1n = self.changelog.read(p1)[0] |
878 elif m2[f] != a: | 878 elif m2[f] != a: |
879 self.ui.debug(" remote %s is newer, get\n" % f) | 879 self.ui.debug(" remote %s is newer, get\n" % f) |
880 get[f] = m2[f] | 880 get[f] = m2[f] |
881 del m2[f] | 881 del m2[f] |
882 elif f in ma: | 882 elif f in ma: |
883 if n != ma[f]: | 883 if not force and n != ma[f]: |
884 r = self.ui.prompt( | 884 r = self.ui.prompt( |
885 (" local changed %s which remote deleted\n" % f) + | 885 (" local changed %s which remote deleted\n" % f) + |
886 "(k)eep or (d)elete?", "[kd]", "k") | 886 "(k)eep or (d)elete?", "[kd]", "k") |
887 if r == "d": | 887 if r == "d": |
888 remove.append(f) | 888 remove.append(f) |
896 else: | 896 else: |
897 self.ui.debug("working dir created %s, keeping\n" % f) | 897 self.ui.debug("working dir created %s, keeping\n" % f) |
898 | 898 |
899 for f, n in m2.iteritems(): | 899 for f, n in m2.iteritems(): |
900 if f[0] == "/": continue | 900 if f[0] == "/": continue |
901 if f in ma and n != ma[f]: | 901 if not force and f in ma and n != ma[f]: |
902 r = self.ui.prompt( | 902 r = self.ui.prompt( |
903 ("remote changed %s which local deleted\n" % f) + | 903 ("remote changed %s which local deleted\n" % f) + |
904 "(k)eep or (d)elete?", "[kd]", "k") | 904 "(k)eep or (d)elete?", "[kd]", "k") |
905 if r == "d": remove.append(f) | 905 if r == "d": remove.append(f) |
906 else: | 906 else: |
907 self.ui.debug("remote created %s\n" % f) | 907 self.ui.debug("remote created %s\n" % f) |
908 get[f] = n | 908 get[f] = n |
909 | 909 |
910 del mw, m1, m2, ma | 910 del mw, m1, m2, ma |
911 | |
912 if force: | |
913 for f in merge: | |
914 get[f] = merge[f][1] | |
915 merge = {} | |
911 | 916 |
912 if not merge: | 917 if not merge: |
913 # we don't need to do any magic, just jump to the new rev | 918 # we don't need to do any magic, just jump to the new rev |
914 mode = 'n' | 919 mode = 'n' |
915 p1, p2 = p2, nullid | 920 p1, p2 = p2, nullid |
916 else: | 921 else: |
922 if not allow: | |
923 self.ui.status("the following files conflict:\n") | |
924 for f in merge: | |
925 self.ui.status(" %s\n" % f) | |
926 self.ui.warn("aborting update due to conflicting files!\n") | |
927 self.ui.status("(use update -m to allow a merge)\n") | |
928 return 1 | |
917 # we have to remember what files we needed to get/change | 929 # we have to remember what files we needed to get/change |
918 # because any file that's different from either one of its | 930 # because any file that's different from either one of its |
919 # parents must be in the changeset | 931 # parents must be in the changeset |
920 mode = 'm' | 932 mode = 'm' |
921 | 933 |
974 (fn, short(other), short(base))) | 986 (fn, short(other), short(base))) |
975 | 987 |
976 cmd = os.environ.get("HGMERGE", "hgmerge") | 988 cmd = os.environ.get("HGMERGE", "hgmerge") |
977 r = os.system("%s %s %s %s" % (cmd, a, b, c)) | 989 r = os.system("%s %s %s %s" % (cmd, a, b, c)) |
978 if r: | 990 if r: |
979 self.ui.warn("merging %s failed!\n" % f) | 991 self.ui.warn("merging %s failed!\n" % fn) |
980 | 992 |
981 os.unlink(b) | 993 os.unlink(b) |
982 os.unlink(c) | 994 os.unlink(c) |
983 | 995 |
984 def verify(self): | 996 def verify(self): |