mercurial/localrepo.py
changeset 1460 40d08cf1c544
parent 1458 1033892bbb87
child 1461 02099220ad49
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: