[PATCH 06 of 17 RFC] clfilter: remove usage of `range` in favor of iteration over changelog
pierre-yves.david at logilab.fr
pierre-yves.david at logilab.fr
Mon Sep 3 07:58:30 CDT 2012
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1346675281 -7200
# Node ID 89a7b0e442adc3393ee98d27bdb8ef9665eef0cf
# Parent 27c1b57964bf1b37e9a8c5bb6de91dd344d4d00b
clfilter: remove usage of `range` in favor of iteration over changelog
If we want to apply filtering at changelog level, we need to iterate over it.
See previous changeset description for details.
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1384,11 +1384,12 @@ def getgraphlogrevs(repo, pats, opts):
revs = scmutil.revrange(repo, opts['rev'])
else:
if follow and len(repo) > 0:
revs = scmutil.revrange(repo, ['.:0'])
else:
- revs = range(len(repo) - 1, -1, -1)
+ revs = list(repo.changelog)
+ revs.reverse()
if not revs:
return iter([]), None, None
expr, filematcher = _makegraphlogrevset(repo, pats, opts, revs)
if expr:
matcher = revset.match(repo.ui, expr)
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -361,18 +361,17 @@ class localrepository(object):
def __len__(self):
return len(self.changelog)
def __iter__(self):
- for i in xrange(len(self)):
- yield i
+ return iter(self.changelog)
def revs(self, expr, *args):
'''Return a list of revisions matching the given revset'''
expr = revset.formatspec(expr, *args)
m = revset.match(None, expr)
- return [r for r in m(self, range(len(self)))]
+ return [r for r in m(self, list(self))]
def set(self, expr, *args):
'''
Yield a context for each matching revision, after doing arg
replacement via revset.formatspec
@@ -601,11 +600,11 @@ class localrepository(object):
def _branchtags(self, partial, lrev):
# TODO: rename this function?
tiprev = len(self) - 1
if lrev != tiprev:
- ctxgen = (self[r] for r in xrange(lrev + 1, tiprev + 1))
+ ctxgen = (self[r] for r in self.changelog.irevs(lrev + 1, tiprev))
self._updatebranchcache(partial, ctxgen)
self._writebranchcache(partial, self.changelog.tip(), tiprev)
return partial
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -212,15 +212,15 @@ def symbolset(repo, subset, x):
return stringset(repo, subset, x)
def rangeset(repo, subset, x, y):
m = getset(repo, subset, x)
if not m:
- m = getset(repo, range(len(repo)), x)
+ m = getset(repo, list(repo), x)
n = getset(repo, subset, y)
if not n:
- n = getset(repo, range(len(repo)), y)
+ n = getset(repo, list(repo), y)
if not m or not n:
return []
m, n = m[0], n[-1]
@@ -231,11 +231,11 @@ def rangeset(repo, subset, x, y):
s = set(subset)
return [x for x in r if x in s]
def dagrange(repo, subset, x, y):
if subset:
- r = range(len(repo))
+ r = list(repo)
xs = _revsbetween(repo, getset(repo, r, x), getset(repo, r, y))
s = set(subset)
return [r for r in xs if r in s]
return []
@@ -274,22 +274,22 @@ def ancestor(repo, subset, x):
"""``ancestor(single, single)``
Greatest common ancestor of the two changesets.
"""
# i18n: "ancestor" is a keyword
l = getargs(x, 2, 2, _("ancestor requires two arguments"))
- r = range(len(repo))
+ r = list(repo)
a = getset(repo, r, l[0])
b = getset(repo, r, l[1])
if len(a) != 1 or len(b) != 1:
# i18n: "ancestor" is a keyword
raise error.ParseError(_("ancestor arguments must be single revisions"))
an = [repo[a[0]].ancestor(repo[b[0]]).rev()]
return [r for r in an if r in subset]
def _ancestors(repo, subset, x, followfirst=False):
- args = getset(repo, range(len(repo)), x)
+ args = getset(repo, list(repo), x)
if not args:
return []
s = set(_revancestors(repo, args, followfirst)) | set(args)
return [r for r in subset if r in s]
@@ -412,11 +412,11 @@ def branch(repo, subset, x):
if pattern in repo.branchmap():
return [r for r in subset if matcher(repo[r].branch())]
else:
return [r for r in subset if matcher(repo[r].branch())]
- s = getset(repo, range(len(repo)), x)
+ s = getset(repo, list(repo), x)
b = set()
for r in s:
b.add(repo[r].branch())
s = set(s)
return [r for r in subset if r in s or repo[r].branch() in b]
@@ -463,11 +463,11 @@ def _children(repo, narrow, parentset):
def children(repo, subset, x):
"""``children(set)``
Child changesets of changesets in set.
"""
- s = set(getset(repo, range(len(repo)), x))
+ s = set(getset(repo, list(repo), x))
cs = _children(repo, subset, s)
return [r for r in subset if r in cs]
def closed(repo, subset, x):
"""``closed()``
@@ -544,11 +544,11 @@ def desc(repo, subset, x):
if ds in encoding.lower(c.description()):
l.append(r)
return l
def _descendants(repo, subset, x, followfirst=False):
- args = getset(repo, range(len(repo)), x)
+ args = getset(repo, list(repo), x)
if not args:
return []
s = set(_revdescendants(repo, args, followfirst)) | set(args)
return [r for r in subset if r in s]
@@ -568,13 +568,13 @@ def destination(repo, subset, x):
Changesets that were created by a graft, transplant or rebase operation,
with the given revisions specified as the source. Omitting the optional set
is the same as passing all().
"""
if x is not None:
- args = set(getset(repo, range(len(repo)), x))
+ args = set(getset(repo, list(repo), x))
else:
- args = set(getall(repo, range(len(repo)), x))
+ args = set(getall(repo, list(repo), x))
dests = set()
# subset contains all of the possible destinations that can be returned, so
# iterate over them and see if their source(s) were provided in the args.
@@ -874,11 +874,11 @@ def limit(repo, subset, x):
lim = int(getstring(l[1], _("limit requires a number")))
except (TypeError, ValueError):
# i18n: "limit" is a keyword
raise error.ParseError(_("limit expects a number"))
ss = set(subset)
- os = getset(repo, range(len(repo)), l[0])[:lim]
+ os = getset(repo, list(repo), l[0])[:lim]
return [r for r in os if r in ss]
def last(repo, subset, x):
"""``last(set, [n])``
Last n members of set, defaulting to 1.
@@ -892,18 +892,18 @@ def last(repo, subset, x):
lim = int(getstring(l[1], _("last requires a number")))
except (TypeError, ValueError):
# i18n: "last" is a keyword
raise error.ParseError(_("last expects a number"))
ss = set(subset)
- os = getset(repo, range(len(repo)), l[0])[-lim:]
+ os = getset(repo, list(repo), l[0])[-lim:]
return [r for r in os if r in ss]
def maxrev(repo, subset, x):
"""``max(set)``
Changeset with highest revision number in set.
"""
- os = getset(repo, range(len(repo)), x)
+ os = getset(repo, list(repo), x)
if os:
m = max(os)
if m in subset:
return [m]
return []
@@ -919,11 +919,11 @@ def merge(repo, subset, x):
def minrev(repo, subset, x):
"""``min(set)``
Changeset with lowest revision number in set.
"""
- os = getset(repo, range(len(repo)), x)
+ os = getset(repo, list(repo), x)
if os:
m = min(os)
if m in subset:
return [m]
return []
@@ -968,13 +968,13 @@ def origin(repo, subset, x):
same as passing all(). If a changeset created by these operations is itself
specified as a source for one of these operations, only the source changeset
for the first operation is selected.
"""
if x is not None:
- args = set(getset(repo, range(len(repo)), x))
+ args = set(getset(repo, list(repo), x))
else:
- args = set(getall(repo, range(len(repo)), x))
+ args = set(getall(repo, list(repo), x))
def _firstsrc(rev):
src = _getrevsource(repo, rev)
if src is None:
return None
@@ -1020,11 +1020,11 @@ def p1(repo, subset, x):
p = repo[x].p1().rev()
return [r for r in subset if r == p]
ps = set()
cl = repo.changelog
- for r in getset(repo, range(len(repo)), x):
+ for r in getset(repo, list(repo), x):
ps.add(cl.parentrevs(r)[0])
return [r for r in subset if r in ps]
def p2(repo, subset, x):
"""``p2([set])``
@@ -1038,11 +1038,11 @@ def p2(repo, subset, x):
except IndexError:
return []
ps = set()
cl = repo.changelog
- for r in getset(repo, range(len(repo)), x):
+ for r in getset(repo, list(repo), x):
ps.add(cl.parentrevs(r)[1])
return [r for r in subset if r in ps]
def parents(repo, subset, x):
"""``parents([set])``
@@ -1052,11 +1052,11 @@ def parents(repo, subset, x):
ps = tuple(p.rev() for p in repo[x].parents())
return [r for r in subset if r in ps]
ps = set()
cl = repo.changelog
- for r in getset(repo, range(len(repo)), x):
+ for r in getset(repo, list(repo), x):
ps.update(cl.parentrevs(r))
return [r for r in subset if r in ps]
def parentspec(repo, subset, x, n):
"""``set^0``
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -617,11 +617,11 @@ def revrange(repo, revs):
except error.RepoLookupError:
pass
# fall through to new-style queries if old-style fails
m = revset.match(repo.ui, spec)
- dl = [r for r in m(repo, xrange(len(repo))) if r not in seen]
+ dl = [r for r in m(repo, list(repo)) if r not in seen]
l.extend(dl)
seen.update(dl)
return l
More information about the Mercurial-devel
mailing list