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: |