dirstate walking optimizations
The repo walking code introduces a number of calls to dirstate.map.copy(),
significantly slowing down the walk on large trees. When a list of
files is passed to the walking code, we should only look at map entries
relevant to the file list passed in.
dirstate.filterfiles() is added to return a subset of the dirstate map.
The subset includes in files passed in, and if one of the files requested
is actually a directory, it includes any files inside that directory tree.
This brings the time for hg diff Makefile down from 1.7s to .3s on
a linux kernel repo.
Also, the diff command was unconditionally calling makewalk, leading
to an extra pass through repo.changes. This patch avoids the call
to makewalk when commands.diff isn't given a list of patterns, cutting
the time for hg diff (with no args) in half.
Index: mine/mercurial/hg.py
===================================================================
Summary: Mercurial -- a distributed SCM
Name: mercurial
Version: 0.6
Release: 1
Copyright: GPL
Group: Development/Tools
Distribution: RedHat
Source: http://www.selenic.com/mercurial/release/%{name}-%{version}.tar.gz
Packager: Arun Sharma <arun@sharma-home.net>
Prefix: /usr
BuildRoot: /tmp/build.%{name}-%{version}-%{release}
%define pythonver %(python -c 'import sys;print ".".join(map(str, sys.version_info[:2]))')
%define pythonlib %{_libdir}/python%{pythonver}/site-packages/%{name}
%description
Mercurial is a fast, lightweight source control management system designed
for efficient handling of very large distributed projects.
%prep
rm -rf $RPM_BUILD_ROOT
%setup -q -n %{name}-%{version}
%build
python setup.py build
%install
python setup.py install --root $RPM_BUILD_ROOT
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%doc doc
%dir %{pythonlib}
%{_bindir}/hgmerge
%{_bindir}/hg
%{pythonlib}/templates
%{pythonlib}/*.pyc
%{pythonlib}/*.py
%{pythonlib}/*.so