Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/commands.py @ 872:9a0af739cf55
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
===================================================================
author | mason@suse.com |
---|---|
date | Fri, 12 Aug 2005 09:57:56 -0800 |
parents | 1df0983eb589 |
children | 4480e035d838 |
comparison
equal
deleted
inserted
replaced
859:6390c377a9e6 | 872:9a0af739cf55 |
---|---|
632 | 632 |
633 if len(revs) > 2: | 633 if len(revs) > 2: |
634 raise Abort("too many revisions to diff") | 634 raise Abort("too many revisions to diff") |
635 | 635 |
636 files = [] | 636 files = [] |
637 roots, match, results = makewalk(repo, pats, opts) | 637 match = util.always |
638 for src, abs, rel in results: | 638 if pats: |
639 files.append(abs) | 639 roots, match, results = makewalk(repo, pats, opts) |
640 for src, abs, rel in results: | |
641 files.append(abs) | |
640 dodiff(sys.stdout, ui, repo, files, *revs, **{'match': match}) | 642 dodiff(sys.stdout, ui, repo, files, *revs, **{'match': match}) |
641 | 643 |
642 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): | 644 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
643 node = repo.lookup(changeset) | 645 node = repo.lookup(changeset) |
644 prev, other = repo.changelog.parents(node) | 646 prev, other = repo.changelog.parents(node) |