[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