[PATCH 2 of 2] templatekw: introduce the changessincelatesttag keyword

Yuya Nishihara yuya at tcha.org
Sat Jun 27 08:15:33 CDT 2015


On Sat, 27 Jun 2015 00:01:24 -0400, Matt Harbison wrote:
> # HG changeset patch
> # User Matt Harbison <matt_harbison at yahoo.com>
> # Date 1435374665 14400
> #      Fri Jun 26 23:11:05 2015 -0400
> # Node ID 7391298f5b4d78e7d6e56eb2e9ebaf61dbd98be9
> # Parent  c673a9cb5668ed84c13d69505cd6523a5469e385
> templatekw: introduce the changessincelatesttag keyword
> 
> Archive is putting a value with the same name in the metadata file, to count all
> of the changes not covered by the latest tag, instead of just along the longest
> path.  It seems that this would be useful to have on the command line as well.
> It might be nice for the name to start with 'latesttag' so that it is grouped
> with the other tag keywords, but I can't think of a better name.
> 
> Using p1() instead of wdir() is partially for practicality- wctx.rev() returns
> None, which crashes %d, and repo[ff..ff] doesn't currently work.  There's also
> a correctness factor- if you update to a tag and change nothing, there are 0
> changes since the latest tag.  A change without a commit (dirty) is 1 change.
> 
> Current precedent for wdir() mascarading as p1() is the fact that wctx.tags()
> reports whatever tags the parents have.  Maybe that's not a good idea (at least
> for non virtual tags like 'tip'), because a side effect of that is
> '-r wdir() -T {latesttagdistance}' after updating to a tag is 0, whether or not
> wdir() is dirty.  Committing once then jumps the value to 2, and it continues
> sequentially from there.
> 
> diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
> --- a/mercurial/templatekw.py
> +++ b/mercurial/templatekw.py
> @@ -334,6 +334,18 @@
>      """:latesttagdistance: Integer. Longest path to the latest tag."""
>      return getlatesttags(repo, ctx, cache)[1]
>  
> +def showchangessincelatesttag(repo, ctx, templ, cache, **args):
> +    """:changessincelatesttag: Integer. All ancestors not in the latest tag."""
> +    latesttag = getlatesttags(repo, ctx, cache)[2][0]
> +    offset = 0
> +
> +    if ctx.rev() is None:
> +        if ctx.dirty(missing=True):
> +            offset = 1

IMHO, offset is always 1 because the wdir revision exists no matter if it is
dirty or not.

> +        ctx = ctx.p1()
> +
> +    return len(repo.revs('only(%d, %s)', ctx.rev(), latesttag)) + offset

Perhaps repo.revs('only(%ld, %s)', [p.rev() for p in wctx.parents()]) is
more correct.


More information about the Mercurial-devel mailing list