findrenames: Optimise "addremove -s100" by matching files by their SHA1 hashes.
We speed up 'findrenames' for the usecase when a user specifies they
want a similarity of 100% by matching files by their exact SHA1 hash
value. This reduces the number of comparisons required to find exact
matches from O(n^2) to O(n).
While it would be nice if we could just use mercurial's pre-calculated
SHA1 hash for existing files, this hash includes the file's ancestor
information making it unsuitable for our purposes. Instead, we calculate
the hash of old content from scratch.
The following benchmarks were taken on the current head of crew:
addremove 100% similarity:
rm -rf *; hg up -C; mv tests tests.new
hg --time addremove -s100 --dry-run
before: real 176.350 secs (user 128.890+0.000 sys 47.430+0.000)
after: real 2.130 secs (user 1.890+0.000 sys 0.240+0.000)
addremove 75% similarity:
rm -rf *; hg up -C; mv tests tests.new; \
for i in tests.new/*; do echo x >> $i; done
hg --time addremove -s75 --dry-run
before: real 264.560 secs (user 215.130+0.000 sys 49.410+0.000)
after: real 218.710 secs (user 172.790+0.000 sys 45.870+0.000)
uisetup called
reposetup called for a
ui == repo.ui
Foo
uisetup called
reposetup called for a
ui == repo.ui
reposetup called for b
ui == repo.ui
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
uisetup called
Bar
% module/__init__.py-style
uisetup called
reposetup called for a
ui == repo.ui
Foo
1) foo imported
1) bar imported
2) foo uisetup
2) bar uisetup
3) foo extsetup
3) bar extsetup
4) foo reposetup
4) bar reposetup
% hgweb.cgi
1) foo imported
1) bar imported
2) foo uisetup
2) bar uisetup
3) foo extsetup
3) bar extsetup
4) foo reposetup
4) bar reposetup
4) foo reposetup
4) bar reposetup
empty extension - empty cmdtable
no commands defined
% hg help
debugextension extension - only debugcommands
no commands defined
% hg help --verbose
debugextension extension - only debugcommands
list of commands:
foo:
yet another foo command
global options:
-R --repository repository root directory or name of overlay bundle file
--cwd change working directory
-y --noninteractive do not prompt, assume 'yes' for any required answers
-q --quiet suppress output
-v --verbose enable additional output
--config set/override config option (use 'section.name=value')
--debug enable debugging output
--debugger start debugger
--encoding set the charset encoding (default: ascii)
--encodingmode set the charset encoding mode (default: strict)
--traceback always print a traceback on exception
--time time how long the command takes
--profile print command execution profile
--version output version information and exit
-h --help display help and exit
% hg help --debug
debugextension extension - only debugcommands
list of commands:
debugfoobar:
yet another debug command
foo:
yet another foo command
global options:
-R --repository repository root directory or name of overlay bundle file
--cwd change working directory
-y --noninteractive do not prompt, assume 'yes' for any required answers
-q --quiet suppress output
-v --verbose enable additional output
--config set/override config option (use 'section.name=value')
--debug enable debugging output
--debugger start debugger
--encoding set the charset encoding (default: ascii)
--encodingmode set the charset encoding mode (default: strict)
--traceback always print a traceback on exception
--time time how long the command takes
--profile print command execution profile
--version output version information and exit
-h --help display help and exit
% issue811
% show extensions
debugissue811
mq
% disabled extension commands
'email' is provided by the following extension:
patchbomb command to send changesets as (a series of) patch emails
use "hg help extensions" for information on enabling extensions
hg: unknown command 'qdel'
'qdelete' is provided by the following extension:
mq manage a stack of patches
use "hg help extensions" for information on enabling extensions
hg: unknown command 'churn'
'churn' is provided by the following extension:
churn command to display statistics about repository history
use "hg help extensions" for information on enabling extensions
% disabled extensions
churn extension - command to display statistics about repository history
use "hg help extensions" for information on enabling extensions
patchbomb extension - command to send changesets as (a series of) patch emails
use "hg help extensions" for information on enabling extensions
% broken disabled extension and command
broken extension - (no help text available)
use "hg help extensions" for information on enabling extensions
hg: unknown command 'foo'