Mercurial > public > mercurial-scm > hg
comparison mercurial/hg.py @ 992:f859e9cba1b9
Fix up some bugs introduced by recent merge changes
- use new changed list to track what files actually got new revlog entries
at commit/rawcommit time
- when updating a file during a merge, don't mark it as completely unchanged
- handle file not being in parent 1 in status
author | mpm@selenic.com |
---|---|
date | Mon, 22 Aug 2005 01:22:29 -0700 |
parents | b634b15c020b |
children | 6f274afc05c7 |
comparison
equal
deleted
inserted
replaced
991:b634b15c020b | 992:f859e9cba1b9 |
---|---|
822 c1 = self.changelog.read(p1) | 822 c1 = self.changelog.read(p1) |
823 c2 = self.changelog.read(p2) | 823 c2 = self.changelog.read(p2) |
824 m1 = self.manifest.read(c1[0]) | 824 m1 = self.manifest.read(c1[0]) |
825 mf1 = self.manifest.readflags(c1[0]) | 825 mf1 = self.manifest.readflags(c1[0]) |
826 m2 = self.manifest.read(c2[0]) | 826 m2 = self.manifest.read(c2[0]) |
827 changed = [] | |
827 | 828 |
828 if orig_parent == p1: | 829 if orig_parent == p1: |
829 update_dirstate = 1 | 830 update_dirstate = 1 |
830 else: | 831 else: |
831 update_dirstate = 0 | 832 update_dirstate = 0 |
862 # no need to add a revision | 863 # no need to add a revision |
863 mm[f] = fp1 | 864 mm[f] = fp1 |
864 continue | 865 continue |
865 | 866 |
866 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2) | 867 mm[f] = r.add(t, {}, tr, linkrev, fp1, fp2) |
868 changed.append(f) | |
867 if update_dirstate: | 869 if update_dirstate: |
868 self.dirstate.update([f], "n") | 870 self.dirstate.update([f], "n") |
869 except IOError: | 871 except IOError: |
870 try: | 872 try: |
871 del mm[f] | 873 del mm[f] |
876 # deleted from p2? | 878 # deleted from p2? |
877 pass | 879 pass |
878 | 880 |
879 mnode = self.manifest.add(mm, mfm, tr, linkrev, c1[0], c2[0]) | 881 mnode = self.manifest.add(mm, mfm, tr, linkrev, c1[0], c2[0]) |
880 user = user or self.ui.username() | 882 user = user or self.ui.username() |
881 n = self.changelog.add(mnode, files, text, tr, p1, p2, user, date) | 883 n = self.changelog.add(mnode, changed, text, tr, p1, p2, user, date) |
882 tr.close() | 884 tr.close() |
883 if update_dirstate: | 885 if update_dirstate: |
884 self.dirstate.setparents(n, nullid) | 886 self.dirstate.setparents(n, nullid) |
885 | 887 |
886 def commit(self, files = None, text = "", user = None, date = None, | 888 def commit(self, files = None, text = "", user = None, date = None, |
887 match = util.always, force=False): | 889 match = util.always, force=False): |
888 commit = [] | 890 commit = [] |
889 remove = [] | 891 remove = [] |
892 changed = [] | |
893 | |
890 if files: | 894 if files: |
891 for f in files: | 895 for f in files: |
892 s = self.dirstate.state(f) | 896 s = self.dirstate.state(f) |
893 if s in 'nmai': | 897 if s in 'nmai': |
894 commit.append(f) | 898 commit.append(f) |
960 # no need to add a revision | 964 # no need to add a revision |
961 new[f] = fp1 | 965 new[f] = fp1 |
962 continue | 966 continue |
963 | 967 |
964 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) | 968 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2) |
969 # remember what we've added so that we can later calculate | |
970 # the files to pull from a set of changesets | |
971 changed.append(f) | |
965 | 972 |
966 # update manifest | 973 # update manifest |
967 m1.update(new) | 974 m1.update(new) |
968 for f in remove: | 975 for f in remove: |
969 if f in m1: | 976 if f in m1: |
974 # add changeset | 981 # add changeset |
975 new = new.keys() | 982 new = new.keys() |
976 new.sort() | 983 new.sort() |
977 | 984 |
978 if not text: | 985 if not text: |
979 edittext = "\n" + "HG: manifest hash %s\n" % hex(mn) | 986 edittext = "" |
980 edittext += "".join(["HG: changed %s\n" % f for f in new]) | 987 if p2 != nullid: |
988 edittext += "HG: branch merge\n" | |
989 edittext += "\n" + "HG: manifest hash %s\n" % hex(mn) | |
990 edittext += "".join(["HG: changed %s\n" % f for f in changed]) | |
981 edittext += "".join(["HG: removed %s\n" % f for f in remove]) | 991 edittext += "".join(["HG: removed %s\n" % f for f in remove]) |
992 if not changed and not remove: | |
993 edittext += "HG: no files changed\n" | |
982 edittext = self.ui.edit(edittext) | 994 edittext = self.ui.edit(edittext) |
983 if not edittext.rstrip(): | 995 if not edittext.rstrip(): |
984 return None | 996 return None |
985 text = edittext | 997 text = edittext |
986 | 998 |
987 user = user or self.ui.username() | 999 user = user or self.ui.username() |
988 n = self.changelog.add(mn, new, text, tr, p1, p2, user, date) | 1000 n = self.changelog.add(mn, changed, text, tr, p1, p2, user, date) |
989 tr.close() | 1001 tr.close() |
990 | 1002 |
991 self.dirstate.setparents(n) | 1003 self.dirstate.setparents(n) |
992 self.dirstate.update(new, "n") | 1004 self.dirstate.update(new, "n") |
993 self.dirstate.forget(remove) | 1005 self.dirstate.forget(remove) |
1008 match = util.always): | 1020 match = util.always): |
1009 mf2, u = None, [] | 1021 mf2, u = None, [] |
1010 | 1022 |
1011 def fcmp(fn, mf): | 1023 def fcmp(fn, mf): |
1012 t1 = self.wfile(fn).read() | 1024 t1 = self.wfile(fn).read() |
1013 t2 = self.file(fn).revision(mf[fn]) | 1025 t2 = self.file(fn).revision(mf.get(fn, nullid)) |
1014 return cmp(t1, t2) | 1026 return cmp(t1, t2) |
1015 | 1027 |
1016 def mfmatches(node): | 1028 def mfmatches(node): |
1017 mf = dict(self.manifest.read(node)) | 1029 mf = dict(self.manifest.read(node)) |
1018 for fn in mf.keys(): | 1030 for fn in mf.keys(): |
1770 except IOError: | 1782 except IOError: |
1771 os.makedirs(os.path.dirname(self.wjoin(f))) | 1783 os.makedirs(os.path.dirname(self.wjoin(f))) |
1772 self.wfile(f, "w").write(t) | 1784 self.wfile(f, "w").write(t) |
1773 util.set_exec(self.wjoin(f), mf2[f]) | 1785 util.set_exec(self.wjoin(f), mf2[f]) |
1774 if moddirstate: | 1786 if moddirstate: |
1775 self.dirstate.update([f], 'n') | 1787 if mode == 'm': |
1788 self.dirstate.update([f], 'n', st_mtime=0) | |
1789 else: | |
1790 self.dirstate.update([f], 'n') | |
1776 | 1791 |
1777 # merge the tricky bits | 1792 # merge the tricky bits |
1778 files = merge.keys() | 1793 files = merge.keys() |
1779 files.sort() | 1794 files.sort() |
1780 for f in files: | 1795 for f in files: |