changeset 31045:6cf2857526c7

scmutil: proxy revrange() through repo to break import cycles This was one of the hardest import cycles as scmutil is widely used and revset functions are likely to depend on a variety of modules. New repo.anyrevs() does not expand user aliases by default to copy the behavior of the existing repo.revs(). I don't want to add new function to localrepository, but this function is quite similar to repo.revs() so it won't increase the complexity of the localrepository class so much.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 19 Feb 2017 20:00:18 +0900
parents 0b8356705de6
children 9c827087df38
files mercurial/destutil.py mercurial/localrepo.py mercurial/scmutil.py mercurial/tags.py
diffstat 4 files changed, 17 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/destutil.py	Sun Feb 19 18:19:33 2017 +0900
+++ b/mercurial/destutil.py	Sun Feb 19 20:00:18 2017 +0900
@@ -12,6 +12,7 @@
     bookmarks,
     error,
     obsolete,
+    scmutil,
 )
 
 def _destupdateobs(repo, clean):
@@ -342,9 +343,6 @@
 
 def desthistedit(ui, repo):
     """Default base revision to edit for `hg histedit`."""
-    # Avoid cycle: scmutil -> revset -> destutil
-    from . import scmutil
-
     default = ui.config('histedit', 'defaultrev', histeditdefaultrevset)
     if default:
         revs = scmutil.revrange(repo, [default])
--- a/mercurial/localrepo.py	Sun Feb 19 18:19:33 2017 +0900
+++ b/mercurial/localrepo.py	Sun Feb 19 20:00:18 2017 +0900
@@ -577,7 +577,8 @@
         %-formatting to escape certain types. See ``revsetlang.formatspec``.
 
         Revset aliases from the configuration are not expanded. To expand
-        user aliases, consider calling ``scmutil.revrange()``.
+        user aliases, consider calling ``scmutil.revrange()`` or
+        ``repo.anyrevs([expr], user=True)``.
 
         Returns a revset.abstractsmartset, which is a list-like interface
         that contains integer revisions.
@@ -598,6 +599,18 @@
         for r in self.revs(expr, *args):
             yield self[r]
 
+    def anyrevs(self, specs, user=False):
+        '''Find revisions matching one of the given revsets.
+
+        Revset aliases from the configuration are not expanded by default. To
+        expand user aliases, specify ``user=True``.
+        '''
+        if user:
+            m = revset.matchany(self.ui, specs, repo=self)
+        else:
+            m = revset.matchany(None, specs)
+        return m(self)
+
     def url(self):
         return 'file:' + self.root
 
--- a/mercurial/scmutil.py	Sun Feb 19 18:19:33 2017 +0900
+++ b/mercurial/scmutil.py	Sun Feb 19 20:00:18 2017 +0900
@@ -29,7 +29,6 @@
     pathutil,
     phases,
     pycompat,
-    revset,
     revsetlang,
     similar,
     util,
@@ -950,8 +949,7 @@
         if isinstance(spec, int):
             spec = revsetlang.formatspec('rev(%d)', spec)
         allspecs.append(spec)
-    m = revset.matchany(repo.ui, allspecs, repo)
-    return m(repo)
+    return repo.anyrevs(allspecs, user=True)
 
 def meaningfulparents(repo, ctx):
     """Return list of meaningful (or all if debug) parentrevs for rev.
--- a/mercurial/tags.py	Sun Feb 19 18:19:33 2017 +0900
+++ b/mercurial/tags.py	Sun Feb 19 20:00:18 2017 +0900
@@ -24,6 +24,7 @@
 from . import (
     encoding,
     error,
+    scmutil,
     util,
 )
 
@@ -277,8 +278,6 @@
     If the cache is not up to date, the caller is responsible for reading tag
     info from each returned head. (See findglobaltags().)
     '''
-    from . import scmutil  # avoid cycle
-
     try:
         cachefile = repo.vfs(_filename(repo), 'r')
         # force reading the file for static-http