# HG changeset patch # User Gregory Szorc # Date 2017-03-28 21:40:13 # Node ID 992882cef7e1570ec1e0956369c157e0b2b5fcba # Parent 9d3d56aa1a9fe00bb5f0ea7dd456ca4875c561bf fileset: perform membership test against set for status queries Previously, fileset functions operating on status items performed membership tests against a list of items. When there are thousands of items having a specific status, that test can be extremely slow. Changing the membership test to a set makes this operation substantially faster. On the mozilla-central repo: $ hg files -r d14cac631ecc 'set:added()' before: 28.120s after: 0.860s $ hg status --change d14cac631ecc --added 0.690s diff --git a/mercurial/fileset.py b/mercurial/fileset.py --- a/mercurial/fileset.py +++ b/mercurial/fileset.py @@ -154,7 +154,7 @@ def modified(mctx, x): """ # i18n: "modified" is a keyword getargs(x, 0, 0, _("modified takes no arguments")) - s = mctx.status().modified + s = set(mctx.status().modified) return [f for f in mctx.subset if f in s] @predicate('added()', callstatus=True) @@ -163,7 +163,7 @@ def added(mctx, x): """ # i18n: "added" is a keyword getargs(x, 0, 0, _("added takes no arguments")) - s = mctx.status().added + s = set(mctx.status().added) return [f for f in mctx.subset if f in s] @predicate('removed()', callstatus=True) @@ -172,7 +172,7 @@ def removed(mctx, x): """ # i18n: "removed" is a keyword getargs(x, 0, 0, _("removed takes no arguments")) - s = mctx.status().removed + s = set(mctx.status().removed) return [f for f in mctx.subset if f in s] @predicate('deleted()', callstatus=True) @@ -181,7 +181,7 @@ def deleted(mctx, x): """ # i18n: "deleted" is a keyword getargs(x, 0, 0, _("deleted takes no arguments")) - s = mctx.status().deleted + s = set(mctx.status().deleted) return [f for f in mctx.subset if f in s] @predicate('missing()', callstatus=True) @@ -190,7 +190,7 @@ def missing(mctx, x): """ # i18n: "missing" is a keyword getargs(x, 0, 0, _("missing takes no arguments")) - s = mctx.status().deleted + s = set(mctx.status().deleted) return [f for f in mctx.subset if f in s] @predicate('unknown()', callstatus=True) @@ -200,7 +200,7 @@ def unknown(mctx, x): """ # i18n: "unknown" is a keyword getargs(x, 0, 0, _("unknown takes no arguments")) - s = mctx.status().unknown + s = set(mctx.status().unknown) return [f for f in mctx.subset if f in s] @predicate('ignored()', callstatus=True) @@ -210,7 +210,7 @@ def ignored(mctx, x): """ # i18n: "ignored" is a keyword getargs(x, 0, 0, _("ignored takes no arguments")) - s = mctx.status().ignored + s = set(mctx.status().ignored) return [f for f in mctx.subset if f in s] @predicate('clean()', callstatus=True) @@ -219,7 +219,7 @@ def clean(mctx, x): """ # i18n: "clean" is a keyword getargs(x, 0, 0, _("clean takes no arguments")) - s = mctx.status().clean + s = set(mctx.status().clean) return [f for f in mctx.subset if f in s] def func(mctx, a, b):