comparison mercurial/localrepo.py @ 1460:40d08cf1c544

Bug fixing in localrepository.changegroupsubset. Bugs found in testing.
author Eric Hopper <hopper@omnifarious.org>
date Fri, 07 Oct 2005 19:49:25 -0700
parents 1033892bbb87
children 02099220ad49
comparison
equal deleted inserted replaced
1459:106fdec8e1fb 1460:40d08cf1c544
893 return remote.addchangegroup(cg) 893 return remote.addchangegroup(cg)
894 894
895 def changegroupsubset(self, bases, heads): 895 def changegroupsubset(self, bases, heads):
896 cl = self.changelog 896 cl = self.changelog
897 # msng = missing 897 # msng = missing
898 msng_cl_lst, bases, heads = cl.nodesbetween(basenodes, headnodes) 898 msng_cl_lst, bases, heads = cl.nodesbetween(bases, heads)
899 junk = None 899 junk = None
900 knownheads = {} 900 knownheads = {}
901 for n in basenodes: 901 for n in bases:
902 for p in cl.parents(n): 902 for p in cl.parents(n):
903 if p != nullid: 903 if p != nullid:
904 knownheads[p] = 1 904 knownheads[p] = 1
905 knownheads = knownheads.keys() 905 knownheads = knownheads.keys()
906 has_cl_set, junk, junk = cl.nodesbetween(None, knownheads) 906 if knownheads:
907 has_cl_set = dict.fromkeys(hasnodeset) 907 has_cl_set, junk, junk = cl.nodesbetween(None, knownheads)
908 has_cl_set = dict.fromkeys(hasnodeset)
909 else:
910 has_cl_set = {}
908 911
909 mnfst = self.manifest 912 mnfst = self.manifest
910 msng_mnfst_set = {} 913 msng_mnfst_set = {}
911 msng_filenode_set = {} 914 msng_filenode_set = {}
915
916 junk = mnfst.index[mnfst.count() - 1] # Get around a bug in lazyindex
917 junk = None
912 918
913 def identity(x): 919 def identity(x):
914 return x 920 return x
915 921
916 def cmp_by_rev_func(revlog): 922 def cmp_by_rev_func(revlog):
936 def collect_manifests_and_files(clnode): 942 def collect_manifests_and_files(clnode):
937 c = cl.read(clnode) 943 c = cl.read(clnode)
938 for f in c[3]: 944 for f in c[3]:
939 # This is to make sure we only have one instance of each 945 # This is to make sure we only have one instance of each
940 # filename string for each filename. 946 # filename string for each filename.
941 changedfileset.set_default(f, f) 947 changedfileset.setdefault(f, f)
942 msng_mnfst_set.set_default(c[0], clnode) 948 msng_mnfst_set.setdefault(c[0], clnode)
943 return collect_manifests_and_files 949 return collect_manifests_and_files
944 950
945 def prune_manifests(): 951 def prune_manifests():
946 has_mnfst_set = {} 952 has_mnfst_set = {}
947 for n in msng_mnfst_set: 953 for n in msng_mnfst_set:
959 for f in changedfiles: 965 for f in changedfiles:
960 fnode = m.get(f, None) 966 fnode = m.get(f, None)
961 if fnode is not None: 967 if fnode is not None:
962 clnode = msng_mnfst_set[mnfstnode] 968 clnode = msng_mnfst_set[mnfstnode]
963 ndset = msng_filenode_set.setdefault(f, {}) 969 ndset = msng_filenode_set.setdefault(f, {})
964 ndset.set_default(fnode, clnode) 970 ndset.setdefault(fnode, clnode)
971 return collect_msng_filenodes
965 972
966 def prune_filenodes(f, filerevlog): 973 def prune_filenodes(f, filerevlog):
967 msngset = msng_filenode_set[f] 974 msngset = msng_filenode_set[f]
968 hasset = {} 975 hasset = {}
969 for n in msngset: 976 for n in msngset:
987 prune_manifests() 994 prune_manifests()
988 msng_mnfst_lst = msng_mnfst_set.keys() 995 msng_mnfst_lst = msng_mnfst_set.keys()
989 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst)) 996 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst))
990 changedfiles = changedfiles.keys() 997 changedfiles = changedfiles.keys()
991 changedfiles.sort() 998 changedfiles.sort()
992 group = mnfst.group(mnfst, lookup_manifest_link, 999 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link,
993 filenode_collector(changedfiles)) 1000 filenode_collector(changedfiles))
994 for chnk in group: 1001 for chnk in group:
995 yield chnk 1002 yield chnk
996 msng_mnfst_lst = None 1003 msng_mnfst_lst = None
997 msng_mnfst_set.clear() 1004 msng_mnfst_set.clear()
998 for fname in changedfiles: 1005 for fname in changedfiles:
999 filerevlog = self.file(fname) 1006 filerevlog = self.file(fname)
1000 prune_filenodes(fname, filerevlog) 1007 prune_filenodes(fname, filerevlog)
1001 msng_filenode_lst = msng_filenode_set[fname].keys() 1008 msng_filenode_lst = msng_filenode_set[fname].keys()
1002 if len(msng_filenode_lst) > 0: 1009 if len(msng_filenode_lst) > 0:
1003 yield struct.pack(">l", len(f) + 4) + f 1010 yield struct.pack(">l", len(fname) + 4) + fname
1004 msng_filenode_lst.sort(cmp_by_rev_func(filerevlog)) 1011 msng_filenode_lst.sort(cmp_by_rev_func(filerevlog))
1005 group = filerevlog.group(msng_filenode_lst, 1012 group = filerevlog.group(msng_filenode_lst,
1006 lookup_filenode_link) 1013 lookup_filenode_link_func(fname))
1007 for chnk in group: 1014 for chnk in group:
1008 yield chnk 1015 yield chnk
1009 del msng_filenode_set[fname] 1016 del msng_filenode_set[fname]
1010 yield struct.pack(">l", 0) 1017 yield struct.pack(">l", 0)
1011 1018
1046 yield chnk 1053 yield chnk
1047 changedfiles = changedfiles.keys() 1054 changedfiles = changedfiles.keys()
1048 changedfiles.sort() 1055 changedfiles.sort()
1049 1056
1050 mnfst = self.manifest 1057 mnfst = self.manifest
1051 def nodegen(revlog, reviter):
1052 for r in reviter:
1053 yield revlog.node(r)
1054 nodeiter = gennodelst(mnfst) 1058 nodeiter = gennodelst(mnfst)
1055 for chnk in mnfst.group(nodeiter, lookuprevlink_func(mnfst)): 1059 for chnk in mnfst.group(nodeiter, lookuprevlink_func(mnfst)):
1056 yield chnk 1060 yield chnk
1057 1061
1058 for fname in changedfiles: 1062 for fname in changedfiles: