Mercurial > public > mercurial-scm > hg
comparison mercurial/localrepo.py @ 16420:4df2d335b8f6
changegroup: reduce progress overhead
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 13 Apr 2012 22:27:29 -0500 |
parents | 784606ae0029 |
children | 859ef739339e |
comparison
equal
deleted
inserted
replaced
16419:784606ae0029 | 16420:4df2d335b8f6 |
---|---|
1834 # filter any nodes that claim to be part of the known set | 1834 # filter any nodes that claim to be part of the known set |
1835 def prune(revlog, missing): | 1835 def prune(revlog, missing): |
1836 return [n for n in missing | 1836 return [n for n in missing |
1837 if revlog.linkrev(revlog.rev(n)) not in commonrevs] | 1837 if revlog.linkrev(revlog.rev(n)) not in commonrevs] |
1838 | 1838 |
1839 progress = self.ui.progress | |
1840 _bundling = _('bundling') | |
1841 _changesets = _('changesets') | |
1842 _manifests = _('manifests') | |
1843 _files = _('files') | |
1844 | |
1839 def lookup(revlog, x): | 1845 def lookup(revlog, x): |
1840 if revlog == cl: | 1846 if revlog == cl: |
1841 c = cl.read(x) | 1847 c = cl.read(x) |
1842 changedfiles.update(c[3]) | 1848 changedfiles.update(c[3]) |
1843 mfs.setdefault(c[0], x) | 1849 mfs.setdefault(c[0], x) |
1844 count[0] += 1 | 1850 count[0] += 1 |
1845 self.ui.progress(_('bundling'), count[0], | 1851 progress(_bundling, count[0], |
1846 unit=_('changesets'), total=len(csets)) | 1852 unit=_changesets, total=len(csets)) |
1847 return x | 1853 return x |
1848 elif revlog == mf: | 1854 elif revlog == mf: |
1849 clnode = mfs[x] | 1855 clnode = mfs[x] |
1850 mdata = mf.readfast(x) | 1856 mdata = mf.readfast(x) |
1851 for f in mdata: | 1857 for f in mdata: |
1852 if f in changedfiles: | 1858 if f in changedfiles: |
1853 fnodes.setdefault(f, {}).setdefault(mdata[f], clnode) | 1859 fnodes.setdefault(f, {}).setdefault(mdata[f], clnode) |
1854 count[0] += 1 | 1860 count[0] += 1 |
1855 self.ui.progress(_('bundling'), count[0], | 1861 progress(_bundling, count[0], |
1856 unit=_('manifests'), total=len(mfs)) | 1862 unit=_manifests, total=len(mfs)) |
1857 return mfs[x] | 1863 return mfs[x] |
1858 else: | 1864 else: |
1859 self.ui.progress( | 1865 progress(_bundling, count[0], item=fstate[0], |
1860 _('bundling'), count[0], item=fstate[0], | 1866 unit=_files, total=len(changedfiles)) |
1861 unit=_('files'), total=len(changedfiles)) | |
1862 return fstate[1][x] | 1867 return fstate[1][x] |
1863 | 1868 |
1864 bundler = changegroup.bundle10(lookup) | 1869 bundler = changegroup.bundle10(lookup) |
1865 reorder = self.ui.config('bundle', 'reorder', 'auto') | 1870 reorder = self.ui.config('bundle', 'reorder', 'auto') |
1866 if reorder == 'auto': | 1871 if reorder == 'auto': |
1871 def gengroup(): | 1876 def gengroup(): |
1872 # Create a changenode group generator that will call our functions | 1877 # Create a changenode group generator that will call our functions |
1873 # back to lookup the owning changenode and collect information. | 1878 # back to lookup the owning changenode and collect information. |
1874 for chunk in cl.group(csets, bundler, reorder=reorder): | 1879 for chunk in cl.group(csets, bundler, reorder=reorder): |
1875 yield chunk | 1880 yield chunk |
1876 self.ui.progress(_('bundling'), None) | 1881 progress(_bundling, None) |
1877 | 1882 |
1878 # Create a generator for the manifestnodes that calls our lookup | 1883 # Create a generator for the manifestnodes that calls our lookup |
1879 # and data collection functions back. | 1884 # and data collection functions back. |
1880 count[0] = 0 | 1885 count[0] = 0 |
1881 for chunk in mf.group(prune(mf, mfs), bundler, reorder=reorder): | 1886 for chunk in mf.group(prune(mf, mfs), bundler, reorder=reorder): |
1882 yield chunk | 1887 yield chunk |
1883 self.ui.progress(_('bundling'), None) | 1888 progress(_bundling, None) |
1884 | 1889 |
1885 mfs.clear() | 1890 mfs.clear() |
1886 | 1891 |
1887 # Go through all our files in order sorted by name. | 1892 # Go through all our files in order sorted by name. |
1888 count[0] = 0 | 1893 count[0] = 0 |
1900 for chunk in filerevlog.group(nodelist, bundler, reorder): | 1905 for chunk in filerevlog.group(nodelist, bundler, reorder): |
1901 yield chunk | 1906 yield chunk |
1902 | 1907 |
1903 # Signal that no more groups are left. | 1908 # Signal that no more groups are left. |
1904 yield bundler.close() | 1909 yield bundler.close() |
1905 self.ui.progress(_('bundling'), None) | 1910 progress(_bundling, None) |
1906 | 1911 |
1907 if csets: | 1912 if csets: |
1908 self.hook('outgoing', node=hex(csets[0]), source=source) | 1913 self.hook('outgoing', node=hex(csets[0]), source=source) |
1909 | 1914 |
1910 return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN') | 1915 return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN') |
1935 | 1940 |
1936 revset = set([cl.rev(n) for n in nodes]) | 1941 revset = set([cl.rev(n) for n in nodes]) |
1937 | 1942 |
1938 def gennodelst(log): | 1943 def gennodelst(log): |
1939 return [log.node(r) for r in log if log.linkrev(r) in revset] | 1944 return [log.node(r) for r in log if log.linkrev(r) in revset] |
1945 progress = self.ui.progress | |
1946 _bundling = _('bundling') | |
1947 _changesets = _('changesets') | |
1948 _manifests = _('manifests') | |
1949 _files = _('files') | |
1940 | 1950 |
1941 def lookup(revlog, x): | 1951 def lookup(revlog, x): |
1942 if revlog == cl: | 1952 if revlog == cl: |
1943 c = cl.read(x) | 1953 c = cl.read(x) |
1944 changedfiles.update(c[3]) | 1954 changedfiles.update(c[3]) |
1945 mfs.setdefault(c[0], x) | 1955 mfs.setdefault(c[0], x) |
1946 count[0] += 1 | 1956 count[0] += 1 |
1947 self.ui.progress(_('bundling'), count[0], | 1957 progress(_bundling, count[0], |
1948 unit=_('changesets'), total=len(nodes)) | 1958 unit=_changesets, total=len(nodes)) |
1949 return x | 1959 return x |
1950 elif revlog == mf: | 1960 elif revlog == mf: |
1951 count[0] += 1 | 1961 count[0] += 1 |
1952 self.ui.progress(_('bundling'), count[0], | 1962 progress(_bundling, count[0], |
1953 unit=_('manifests'), total=len(mfs)) | 1963 unit=_manifests, total=len(mfs)) |
1954 return cl.node(revlog.linkrev(revlog.rev(x))) | 1964 return cl.node(revlog.linkrev(revlog.rev(x))) |
1955 else: | 1965 else: |
1956 self.ui.progress( | 1966 progress(_bundling, count[0], item=fstate[0], |
1957 _('bundling'), count[0], item=fstate[0], | 1967 total=len(changedfiles), unit=_files) |
1958 total=len(changedfiles), unit=_('files')) | |
1959 return cl.node(revlog.linkrev(revlog.rev(x))) | 1968 return cl.node(revlog.linkrev(revlog.rev(x))) |
1960 | 1969 |
1961 bundler = changegroup.bundle10(lookup) | 1970 bundler = changegroup.bundle10(lookup) |
1962 reorder = self.ui.config('bundle', 'reorder', 'auto') | 1971 reorder = self.ui.config('bundle', 'reorder', 'auto') |
1963 if reorder == 'auto': | 1972 if reorder == 'auto': |
1969 '''yield a sequence of changegroup chunks (strings)''' | 1978 '''yield a sequence of changegroup chunks (strings)''' |
1970 # construct a list of all changed files | 1979 # construct a list of all changed files |
1971 | 1980 |
1972 for chunk in cl.group(nodes, bundler, reorder=reorder): | 1981 for chunk in cl.group(nodes, bundler, reorder=reorder): |
1973 yield chunk | 1982 yield chunk |
1974 self.ui.progress(_('bundling'), None) | 1983 progress(_bundling, None) |
1975 | 1984 |
1976 count[0] = 0 | 1985 count[0] = 0 |
1977 for chunk in mf.group(gennodelst(mf), bundler, reorder=reorder): | 1986 for chunk in mf.group(gennodelst(mf), bundler, reorder=reorder): |
1978 yield chunk | 1987 yield chunk |
1979 self.ui.progress(_('bundling'), None) | 1988 progress(_bundling, None) |
1980 | 1989 |
1981 count[0] = 0 | 1990 count[0] = 0 |
1982 for fname in sorted(changedfiles): | 1991 for fname in sorted(changedfiles): |
1983 filerevlog = self.file(fname) | 1992 filerevlog = self.file(fname) |
1984 if not len(filerevlog): | 1993 if not len(filerevlog): |
1989 count[0] += 1 | 1998 count[0] += 1 |
1990 yield bundler.fileheader(fname) | 1999 yield bundler.fileheader(fname) |
1991 for chunk in filerevlog.group(nodelist, bundler, reorder): | 2000 for chunk in filerevlog.group(nodelist, bundler, reorder): |
1992 yield chunk | 2001 yield chunk |
1993 yield bundler.close() | 2002 yield bundler.close() |
1994 self.ui.progress(_('bundling'), None) | 2003 progress(_bundling, None) |
1995 | 2004 |
1996 if nodes: | 2005 if nodes: |
1997 self.hook('outgoing', node=hex(nodes[0]), source=source) | 2006 self.hook('outgoing', node=hex(nodes[0]), source=source) |
1998 | 2007 |
1999 return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN') | 2008 return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN') |