comparison mercurial/scmutil.py @ 37271:0194dac77c93

scmutil: add method for looking up a context given a revision symbol changectx's constructor currently supports a mix if inputs: * integer revnums * binary nodeids * '.', 'tip', 'null' * stringified revnums * namespaced identifiers (e.g. bookmarks and tags) * hex nodeids * partial hex nodeids The first two are always internal [1]. The other five can be specified by the user. The third type ('.', 'tip', 'null') often comes from either the user or internal callers. We probably have some internal callers that pass hex nodeids too, perhaps even partial ones (histedit?). There are only a few callers that pass user-supplied strings: revsets.stringset, peer.lookup, webutil.changeidctx, and maybe one or two more. Supporting this mix of things in the constructor is convenient, but a bit strange, IMO. For example, if repo[node] is given a node that's not in the repo, it will first check if it's bookmark etc before raising an exception. Of course, the risk of it being a bookmark is extremely small, but it just feels ugly. Also, a problem with having this code in the constructor (whether it supports a mix of types or not) is that it's harder to override (I'd like to override it, and that's how this series started). This patch starts moving out the handling of user-supplied strings by introducing scmutil.revsymbol(). So far, that just checks that the input is indeed a string, and then delegates to repo[symbol]. The patch also calls it from revsets.stringset to prove that it works. [1] Well, you probably can enter a 20-byte binary nodeid on the command line, but I don't think we should care to preserve support for that. Differential Revision: https://phab.mercurial-scm.org/D3024
author Martin von Zweigbergk <martinvonz@google.com>
date Mon, 02 Apr 2018 16:18:33 -0700
parents 14cd5290c4e6
children 6942c73f0733
comparison
equal deleted inserted replaced
37270:6ff8bd691fb8 37271:0194dac77c93
431 hexfunc = hex 431 hexfunc = hex
432 else: 432 else:
433 hexfunc = short 433 hexfunc = short
434 return '%d:%s' % (rev, hexfunc(node)) 434 return '%d:%s' % (rev, hexfunc(node))
435 435
436 def revsymbol(repo, symbol):
437 """Returns a context given a single revision symbol (as string).
438
439 This is similar to revsingle(), but accepts only a single revision symbol,
440 i.e. things like ".", "tip", "1234", "deadbeef", "my-bookmark" work, but
441 not "max(public())".
442 """
443 if not isinstance(symbol, bytes):
444 msg = ("symbol (%s of type %s) was not a string, did you mean "
445 "repo[symbol]?" % (symbol, type(symbol)))
446 raise error.ProgrammingError(msg)
447 return repo[symbol]
448
436 def revsingle(repo, revspec, default='.', localalias=None): 449 def revsingle(repo, revspec, default='.', localalias=None):
437 if not revspec and revspec != 0: 450 if not revspec and revspec != 0:
438 return repo[default] 451 return repo[default]
439 452
440 l = revrange(repo, [revspec], localalias=localalias) 453 l = revrange(repo, [revspec], localalias=localalias)