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: