shortest: don't keep checking for longer prefix if node doesn't exist (API)
If revlog.shortest() is called with an invalid nodeid, we keep
checking if longer and longer prefixes are valid. We call
revlog._partialmatch() for each prefix. That function will give us
None if the node doesn't exist (and a RevlogError if it's ambiguous),
so there's no need to keep checking.
This patch instead makes revlog.shortest() raise a LookupError is the
node does not exist, and updates the caller to handle it. Before this
patch, revlog.shortest() would return the full hexnode for nonexistent
nodeids. By the same reasoning as in
7b2955624777 (scmutil: make
shortesthexnodeidprefix() take a full binary nodeid, 2018-04-14), it's
not revlog.shortest() that should decide how to present nonexistent
nodeids, so that's now moved to the template function.
This should speed up cases where {shortest()} is applied to an invalid
nodeid, but I couldn't think of a reasonable case where that would
happen.
Differential Revision: https://phab.mercurial-scm.org/D3461
shortest: extract function for checking if a prefix is a revnum
Much of isvalid() was about testing if a prefix is a valid revnum. I
want to reuse that soon, so let's move it out.
There is no significant slowdown from the function call overhead.
Differential Revision: https://phab.mercurial-scm.org/D3460
shortest: rename "test" variable to "prefix"
Sorry if this is considered churn, but "prefix" just seems much
clearer to me.
Differential Revision: https://phab.mercurial-scm.org/D3459
shortest: move some safe code out of exception block
The RevlogError and WdirUnsupported could be raised by
_partialmatch(), but not by the rest of isvalid(), so let's move the
rest out to make it clearer.
Differential Revision: https://phab.mercurial-scm.org/D3458
revlog: don't say "not found" on internal error
If index_node() returned NULL, then index_find_node() and and
nt_partialmatch() used to return -2 to signal that the node was not
found. However, we were passing in a revnum to index_node() that we
knew should exist, so the only reason it could return NULL was due to
some internal error or perhaps out of memory. Let's not use "not
found" for these cases. I suppose we never noticed this because these
error never happen in practice.
I think there are more places where we should error out instead of
reporting that the node was not found, but the cases mentioned above
were all I cared about right now (because using the same error code
for all failures simplified some future patches).
Differential Revision: https://phab.mercurial-scm.org/D3457
revlog: extract function for getting node from known-to-exist rev
Many of the calls to index_node() (which converts a rev to a nodeid)
are done with a rev that's know to exist. If the function fails,
there's something really wrong and we should just abort. This was done
in only one place. This patch starts by extracting that code to a
function that we can reuse in later patches.
Differential Revision: https://phab.mercurial-scm.org/D3456
shortest: make {shortest("
fffffffff")} work again
{shortest("
fffffffff")} should shorten it to the shortest unambiguous
prefix for the working directory. It used to do that until I broke it
in
7b2955624777 (scmutil: make shortesthexnodeidprefix() take a full
binary nodeid, 2018-04-14), when we started returning the full hex
nodeid for any working directory prefix shorter than 40 hex
digits. This patch fixes it by catching WdirUnsupported
specifically.
Differential Revision: https://phab.mercurial-scm.org/D3455