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')