# HG changeset patch # User Durham Goode # Date 1353109152 28800 # Node ID 54cedee86e5126188b0dcfbd7015bcdca7f6c2e2 # Parent 6f79c32c0bdfb304b984b5e6ba318cc63032cfa4 commit: increase perf by avoiding checks against entire repo subsets When commiting to a repo with lots of history (>400000 changesets) checking the results of revset.py:descendants against the subset takes some time. Since the subset equals the entire changelog, the check isn't necessary. Avoiding it in that case saves 0.1 seconds off of a 1.78 second commit. A 6% gain. We use the length of the subset to determine if it is the entire repo. There is precedence for this in revset.py:stringset. diff -r 6f79c32c0bdf -r 54cedee86e51 mercurial/revset.py --- a/mercurial/revset.py Fri Nov 16 15:39:12 2012 -0800 +++ b/mercurial/revset.py Fri Nov 16 15:39:12 2012 -0800 @@ -571,6 +571,14 @@ if not args: return [] s = set(_revdescendants(repo, args, followfirst)) | set(args) + + if len(subset) == len(repo): + # the passed in revisions may not exist, -1 for example + for arg in args: + if arg not in subset: + s.remove(arg) + return list(s) + return [r for r in subset if r in s] def descendants(repo, subset, x): @@ -1328,7 +1336,10 @@ Changesets in set with no parent changeset in set. """ s = set(getset(repo, repo.changelog, x)) - subset = [r for r in subset if r in s] + if len(subset) == len(repo): + subset = s + else: + subset = [r for r in subset if r in s] cs = _children(repo, subset, s) return [r for r in subset if r not in cs]