diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -24,7 +24,6 @@ short, wdirid, wdirnodes, - wdirrev, ) from . import ( dagop, @@ -415,23 +414,6 @@ except LookupError: pass - try: - r = int(changeid) - if '%d' % r != changeid: - raise ValueError - l = len(repo.changelog) - if r < 0: - r += l - if r < 0 or r >= l and r != wdirrev: - raise ValueError - self._rev = r - self._node = repo.changelog.node(r) - return - except error.FilteredIndexError: - raise - except (ValueError, OverflowError, IndexError): - pass - if len(changeid) == 40: try: self._node = bin(changeid) diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -452,7 +452,28 @@ "repo[symbol]?" % (symbol, type(symbol))) raise error.ProgrammingError(msg) try: + # TODO: We ideally should resolve these three here instead of + # delegating to repo.__getitem__ + if symbol in ('.', 'tip', 'null'): + return repo[symbol] + + try: + r = int(symbol) + if '%d' % r != symbol: + raise ValueError + l = len(repo.changelog) + if r < 0: + r += l + if r < 0 or r >= l and r != wdirrev: + raise ValueError + return repo[r] + except error.FilteredIndexError: + raise + except (ValueError, OverflowError, IndexError): + pass + return repo[symbol] + except (error.FilteredIndexError, error.FilteredLookupError, error.FilteredRepoLookupError): raise _filterederror(repo, symbol)