[PATCH] templatekw: add 'dirty' keyword to indicate a dirty working directory

Matt Harbison mharbison72 at gmail.com
Tue Jun 23 18:58:03 CDT 2015


On Tue, 23 Jun 2015 19:00:47 -0400, Yuya Nishihara <yuya at tcha.org> wrote:

> On Tue, 23 Jun 2015 16:22:21 -0400, Matt Harbison wrote:
>> # HG changeset patch
>> # User Matt Harbison <matt_harbison at yahoo.com>
>> # Date 1435088760 14400
>> #      Tue Jun 23 15:46:00 2015 -0400
>> # Node ID 64ee46ed27022fc1033265f7d08dc48a9c71e91d
>> # Parent  7fdd1782fc4ee9da87d8af13e806dc9055db2c38
>> templatekw: add 'dirty' keyword to indicate a dirty working directory
>>
>> This displays a '+' if the context is a dirty working directory, the  
>> same as how
>> the identify command prints a '+'.  It also works within an if clause,  
>> in case
>> output other than '+' is desired:
>>
>>     $ hg log -r "wdir()" -T '{if(dirty, "dirty!", "not dirty!")}\n'
>>     dirty!
>>     $ hg log -r tip -T '{if(dirty, "dirty!", "not dirty!")}\n'
>>     not dirty!
>>
>> It might be nice to have a different keyword, one that encompasses both  
>> this
>> ability to do a dirty check, as well as one that identifies wdir() like  
>> the
>> identify command.  The tests added to test-status.t demonstrate that it  
>> is a bit
>> verbose to do with this, now that workingctx.hex() returns all 'f's.   
>> But I have
>> no idea what to call it, and it should probably be capable of piping  
>> through
>> 'short', which currently loses the '+'.
>>
>> Something to note here- the identify command uses repo.status() to  
>> check the
>> state, and ctx.dirty() for each subrepo.  This appears to make it  
>> insensitive to
>> changes in the branch name, and to some merge cases (see the merge  
>> argument to
>> context.dirty())... unless these changes occur in a subrepo.  This  
>> seems wrong,
>> and since templates can be applied to csets other than wdir(),  
>> repo.status() is
>> avoided here.  Deleted files are covered by repo.status() though, so  
>> they are
>> also considered with dirty() here.
>>
>> diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
>> --- a/mercurial/templatekw.py
>> +++ b/mercurial/templatekw.py
>> @@ -251,6 +251,14 @@ def showdiffstat(repo, ctx, templ, **arg
>>      maxname, maxtotal, adds, removes, binary = patch.diffstatsum(stats)
>>      return '%s: +%s/-%s' % (len(stats), adds, removes)
>>
>> +def showdirty(repo, ctx, templ, **args):
>> +    """:dirty: '+' or ''.  Indicates if the changeset is a dirty  
>> working
>> +    directory.
>> +    """
>> +    if ctx.dirty(missing=True):
>> +        return '+'
>> +    return ''
>> +
>>  def showextras(**args):
>>      """:extras: List of dicts with key, value entries of the 'extras'
>>      field of this changeset."""
>> @@ -433,6 +441,7 @@ keywords = {
>>      'date': showdate,
>>      'desc': showdescription,
>>      'diffstat': showdiffstat,
>> +    'dirty': showdirty,
>>      'extras': showextras,
>>      'file_adds': showfileadds,
>>      'file_copies': showfilecopies,
>> diff --git a/tests/test-newbranch.t b/tests/test-newbranch.t
>> --- a/tests/test-newbranch.t
>> +++ b/tests/test-newbranch.t
>> @@ -22,10 +22,14 @@
>>    (branches are permanent and global, did you want a bookmark?)
>>    $ hg branch
>>    foo
>> +  $ hg log -r 'wdir()' -T '{if(dirty, "dirty!", "not dirty!")}\n'
>> +  dirty!
>>    $ hg ci -m "add branch name"
>>    $ hg branch bar
>>    marked working directory as branch bar
>>    $ hg ci -m "change branch name"
>> +  $ hg log -r 'wdir()' -T '{if(dirty, "dirty!", "not dirty!")}\n'
>> +  not dirty!
>>
>>  Branch shadowing:
>>
>> diff --git a/tests/test-status.t b/tests/test-status.t
>> --- a/tests/test-status.t
>> +++ b/tests/test-status.t
>> @@ -239,6 +239,11 @@ Test templater support:
>>    abort: "status" not in template map
>>    [255]
>>
>> +  $ hg log -r 'wdir()' -T "{if(dirty, '{p1node|short}',  
>> '{node|short}')}{dirty}\n"
>> +  389aef86a55e+
>> +  $ hg log -r tip -T "{if(dirty, '{p1node|short}',  
>> '{node|short}')}{dirty}\n"
>> +  389aef86a55e
>
> Do you plan to use the '{dirty}' keyword for log templates?
> I don't think it will be usable for the "changeset:" field because the  
> wdir
> revision should be identified differently from the p1, even if it isn't  
> dirty.
>
> % hg log -r 'wdir()' -Tdefault
> changeset:   29549:7fdd1782fc4e  # should have something even if it  
> isn't dirty
> parent:      29549:7fdd1782fc4e
> user:        ...
>
> Regards,

I didn't plan on changing any canned template styles (I actually haven't  
looked into how they work).  Would it be better to put the 'wdir()'  
indicator on the tags line for the scenario you mention, so as to not  
break the changeset line parsing?

My use case is I have build scripts that stuff a version into the things  
that it builds- the plain tag value if there is one on '.', otherwise a  
string like "3.4.1+685-6c48f012d37e".  But I can't tell from that if there  
were any uncommitted changes, without a '+' if appropriate.

'hg id' will give the "{node|short}+" part, but not the tag and distance,  
so I am currently using log -T  
"{latesttag}+{latesttagdistance}-{node|short}".  This would let me add the  
optional '+'.

I think we need something like this anyway to templatize the identify  
command.  (Probably less important now that log can be given "-r wdir()".)


More information about the Mercurial-devel mailing list