comparison mercurial/localrepo.py @ 1462:12a8d772fa32

Optimizing manifest reads in changegroupsubset by using deltas.
author Eric Hopper <hopper@omnifarious.org>
date Mon, 10 Oct 2005 08:36:29 -0700
parents 02099220ad49
children 00117edce2dd
comparison
equal deleted inserted replaced
1461:02099220ad49 1462:12a8d772fa32
961 961
962 def lookup_manifest_link(mnfstnode): 962 def lookup_manifest_link(mnfstnode):
963 return msng_mnfst_set[mnfstnode] 963 return msng_mnfst_set[mnfstnode]
964 964
965 def filenode_collector(changedfiles): 965 def filenode_collector(changedfiles):
966 next_rev = [0]
966 def collect_msng_filenodes(mnfstnode): 967 def collect_msng_filenodes(mnfstnode):
967 m = mnfst.read(mnfstnode) 968 r = mnfst.rev(mnfstnode)
968 for f in changedfiles: 969 if r == next_rev[0]:
969 fnode = m.get(f, None) 970 # If the last rev we looked at was the one just previous,
970 if fnode is not None: 971 # we only need to see a diff.
971 clnode = msng_mnfst_set[mnfstnode] 972 delta = mdiff.patchtext(mnfst.delta(mnfstnode))
972 ndset = msng_filenode_set.setdefault(f, {}) 973 for dline in delta.splitlines():
973 ndset.setdefault(fnode, clnode) 974 f, fnode = dline.split('\0')
975 fnode = bin(fnode[:40])
976 f = changedfiles.get(f, None)
977 if f is not None:
978 clnode = msng_mnfst_set[mnfstnode]
979 ndset = msng_filenode_set.setdefault(f, {})
980 ndset.setdefault(fnode, clnode)
981 else:
982 m = mnfst.read(mnfstnode)
983 for f in changedfiles:
984 fnode = m.get(f, None)
985 if fnode is not None:
986 clnode = msng_mnfst_set[mnfstnode]
987 ndset = msng_filenode_set.setdefault(f, {})
988 ndset.setdefault(fnode, clnode)
989 next_rev[0] = r + 1
974 return collect_msng_filenodes 990 return collect_msng_filenodes
975 991
976 def prune_filenodes(f, filerevlog): 992 def prune_filenodes(f, filerevlog):
977 msngset = msng_filenode_set[f] 993 msngset = msng_filenode_set[f]
978 hasset = {} 994 hasset = {}
995 for chnk in group: 1011 for chnk in group:
996 yield chnk 1012 yield chnk
997 prune_manifests() 1013 prune_manifests()
998 msng_mnfst_lst = msng_mnfst_set.keys() 1014 msng_mnfst_lst = msng_mnfst_set.keys()
999 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst)) 1015 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst))
1000 changedfiles = changedfiles.keys()
1001 changedfiles.sort()
1002 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link, 1016 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link,
1003 filenode_collector(changedfiles)) 1017 filenode_collector(changedfiles))
1004 for chnk in group: 1018 for chnk in group:
1005 yield chnk 1019 yield chnk
1006 msng_mnfst_lst = None 1020 msng_mnfst_lst = None
1007 msng_mnfst_set.clear() 1021 msng_mnfst_set.clear()
1022 changedfiles = changedfiles.keys()
1023 changedfiles.sort()
1008 for fname in changedfiles: 1024 for fname in changedfiles:
1009 filerevlog = self.file(fname) 1025 filerevlog = self.file(fname)
1010 prune_filenodes(fname, filerevlog) 1026 prune_filenodes(fname, filerevlog)
1011 msng_filenode_lst = msng_filenode_set[fname].keys() 1027 msng_filenode_lst = msng_filenode_set[fname].keys()
1012 if len(msng_filenode_lst) > 0: 1028 if len(msng_filenode_lst) > 0: