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