# HG changeset patch # User Yuya Nishihara # Date 1487502018 -32400 # Node ID 6cf2857526c76d78283e5f27eb7ca47816d7b14a # Parent 0b8356705de671b1678d1e8dffeb6114d327fd9f 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. diff -r 0b8356705de6 -r 6cf2857526c7 mercurial/destutil.py --- 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]) diff -r 0b8356705de6 -r 6cf2857526c7 mercurial/localrepo.py --- 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 diff -r 0b8356705de6 -r 6cf2857526c7 mercurial/scmutil.py --- 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. diff -r 0b8356705de6 -r 6cf2857526c7 mercurial/tags.py --- 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