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):