log: allow matchfn to be non-null even if both --patch/--stat are off
This makes the next patch slightly simpler.
log: replace "not pats" with matcher attribute for consistency
We use match.always() in _makelogrevset(). match.always() is identical to
"not pats" here since scmutil.matchandpats() empties pats in that case.
log: follow file history across copies even with -rREV (BC) (
issue4959)
Still it falls back to changelog path if glob patterns or missing paths
are specified. This will be changed later.
.. bc::
``log --follow -rREV FILE..`` now follows file history across copies and
renames.
log: resolve --follow thoroughly in getlogrevs()
This makes sense because --follow isn't really an option to filter revisions,
but an option to extend revisions to be filtered.
_fileancestors() is a minimal copy of revset._follow(). They are slightly
different in that which revision the matcher sees. _fileancestors() also
uses ctx.walk() instead of ctx.manifest().walk() to show a better warning
on bad match, which will be tested later.
log: extract function that processes log file patterns
We'll need a matcher to compute revs followed from the given patterns.
log: resolve --follow with -rREV in cmdutil.getlogrevs()
This also fixes alias expansion. Before, reverse() could be overridden by user
alias.
This isn't processed at _logrevs() as we'll need starting revisions to parse
file patterns. See the subsequent patches for details.
log: remove dead code to follow descendants if ascending revisions specified
It's been disabled since
8b4b9ee6001a "log: make -fr show complete history
from the given revs" 2015-02-06, and we've got no bug report regarding this
exact behavior. For details what the heck "followdescendants" is, please see
the issue comment:
https://bz.mercurial-scm.org/show_bug.cgi?id=4959#c72
"'rev(%d)' % startrev" can be replaced with '.' since revs are 'reversed(:.)'.
log: duplicate _logrevs() dedicated for walkchangerevs()
Prepares for refactoring getlogrevs() to fix the "log -frREV PATH" issue.
I initially thought I could get rid of walkchangerevs(), but it turned out
requiring non-trivial work because of a "prepare" callback and a scanning
window. This patch makes sure that walkchangerevs() will be unaffected by
subsequent changes.
update: fix crash on bare update when directaccess is enabled
'rev' may be None. An empty 'rev' string shouldn't also be passed to
unhidehashlikerevs().
templater: make sure expression is terminated by '}'
This can't be ensured by the tokenize() generator since the parser stop
consuming tokens once it reached an end of an operation.
Spotted by Matt Harbison.