DurhamG  committed 54cedee

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

  • Participants
  • Parent commits 6f79c32
  • Branches stable

Comments (0)

Files changed (1)

File mercurial/

     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):
     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]