1707 def identity(x): |
1707 def identity(x): |
1708 return x |
1708 return x |
1709 |
1709 |
1710 # A function generating function. Sets up an environment for the |
1710 # A function generating function. Sets up an environment for the |
1711 # inner function. |
1711 # inner function. |
1712 def cmp_by_rev_func(revlog): |
1712 def revkey(revlog): |
1713 # Compare two nodes by their revision number in the environment's |
1713 # Key to sort a node by it's revision number in the environment's |
1714 # revision history. Since the revision number both represents the |
1714 # revision history. Since the revision number both represents the |
1715 # most efficient order to read the nodes in, and represents a |
1715 # most efficient order to read the nodes in, and represents a |
1716 # topological sorting of the nodes, this function is often useful. |
1716 # topological sorting of the nodes, this function is often useful. |
1717 def cmp_by_rev(a, b): |
1717 def revlog_sort_key(x): |
1718 return cmp(revlog.rev(a), revlog.rev(b)) |
1718 return revlog.rev(x) |
1719 return cmp_by_rev |
1719 return revlog_sort_key |
1720 |
1720 |
1721 # If we determine that a particular file or manifest node must be a |
1721 # If we determine that a particular file or manifest node must be a |
1722 # node that the recipient of the changegroup will already have, we can |
1722 # node that the recipient of the changegroup will already have, we can |
1723 # also assume the recipient will have all the parents. This function |
1723 # also assume the recipient will have all the parents. This function |
1724 # prunes them from the set of missing nodes. |
1724 # prunes them from the set of missing nodes. |
1725 def prune_parents(revlog, hasset, msngset): |
1725 def prune_parents(revlog, hasset, msngset): |
1726 haslst = list(hasset) |
1726 haslst = list(hasset) |
1727 haslst.sort(cmp_by_rev_func(revlog)) |
1727 haslst.sort(key=revkey(revlog)) |
1728 for node in haslst: |
1728 for node in haslst: |
1729 parentlst = [p for p in revlog.parents(node) if p != nullid] |
1729 parentlst = [p for p in revlog.parents(node) if p != nullid] |
1730 while parentlst: |
1730 while parentlst: |
1731 n = parentlst.pop() |
1731 n = parentlst.pop() |
1732 if n not in hasset: |
1732 if n not in hasset: |
1872 # calling our functions back. |
1872 # calling our functions back. |
1873 prune_manifests() |
1873 prune_manifests() |
1874 add_extra_nodes(1, msng_mnfst_set) |
1874 add_extra_nodes(1, msng_mnfst_set) |
1875 msng_mnfst_lst = msng_mnfst_set.keys() |
1875 msng_mnfst_lst = msng_mnfst_set.keys() |
1876 # Sort the manifestnodes by revision number. |
1876 # Sort the manifestnodes by revision number. |
1877 msng_mnfst_lst.sort(cmp_by_rev_func(mnfst)) |
1877 msng_mnfst_lst.sort(key=revkey(mnfst)) |
1878 # Create a generator for the manifestnodes that calls our lookup |
1878 # Create a generator for the manifestnodes that calls our lookup |
1879 # and data collection functions back. |
1879 # and data collection functions back. |
1880 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link, |
1880 group = mnfst.group(msng_mnfst_lst, lookup_manifest_link, |
1881 filenode_collector(changedfiles)) |
1881 filenode_collector(changedfiles)) |
1882 for chnk in group: |
1882 for chnk in group: |
1910 # otherwise don't bother. |
1910 # otherwise don't bother. |
1911 if len(msng_filenode_lst) > 0: |
1911 if len(msng_filenode_lst) > 0: |
1912 yield changegroup.chunkheader(len(fname)) |
1912 yield changegroup.chunkheader(len(fname)) |
1913 yield fname |
1913 yield fname |
1914 # Sort the filenodes by their revision # |
1914 # Sort the filenodes by their revision # |
1915 msng_filenode_lst.sort(cmp_by_rev_func(filerevlog)) |
1915 msng_filenode_lst.sort(key=revkey(filerevlog)) |
1916 # Create a group generator and only pass in a changenode |
1916 # Create a group generator and only pass in a changenode |
1917 # lookup function as we need to collect no information |
1917 # lookup function as we need to collect no information |
1918 # from filenodes. |
1918 # from filenodes. |
1919 group = filerevlog.group(msng_filenode_lst, |
1919 group = filerevlog.group(msng_filenode_lst, |
1920 lookup_filenode_link_func(fname)) |
1920 lookup_filenode_link_func(fname)) |