Mercury journal between two tags

I want to use hg log

to create a concise changelog covering changes to the latest version. Releases are marked with "v", for example. "v0.9.1" or "v1.0". Is it possible with revsets to select a range between the last two tags starting with "v", not counting the older of the two tags?

As an example, if I have:

  • changeset 0
  • changeset 1
    tag: v0.1
  • changeet 2
  • changeset 3
    tag: bar
  • changeset 4
    tag: v0.9
  • changeset 5
    tag: foo
  • changeset 6
  • changeset 7
    tag: v1.0
  • changeet 8

I would like to select changeset 5 to 7, if possible, without even specifying v0.9 and v1.0, using only the "v" prefix.

+3


source to share


2 answers


If you really want to answer the question "what has changed between the two versions", you need to do something a little verbose:

hg log -r 'ancestors(relB) - ancestors(relA)'

      

This differs from relA :: relB in the case of forked development.

Consider the following history graph:

$ hg glog
@  changeset:   7:cb998461fc2f
|  tag:         tip
|  user:        Danny Sadinoff <danny>
|  date:        Fri Nov 21 09:28:46 2014 +0000
|  summary:     Added tag relB for changeset b37a8f32de1d
|
o    changeset:   6:b37a8f32de1d
|\   tag:         relB
| |  parent:      5:187092bb7e9b
| |  parent:      3:2d5af4e62ad5
| |  user:        Danny Sadinoff <danny>
| |  date:        Fri Nov 21 09:27:47 2014 +0000
| |  summary:     merged
| |
| o  changeset:   5:187092bb7e9b
| |  user:        Danny Sadinoff <danny>
| |  date:        Fri Nov 21 09:27:21 2014 +0000
| |  summary:     more branch work
| |
| o  changeset:   4:dbfe8f003e51
| |  parent:      1:68f933b431ec
| |  user:        Danny Sadinoff <danny>
| |  date:        Fri Nov 21 09:26:51 2014 +0000
| |  summary:     branched dev
| |
o |  changeset:   3:2d5af4e62ad5
| |  user:        Danny Sadinoff <danny>
| |  date:        Fri Nov 21 09:26:17 2014 +0000
| |  summary:     Added tag relA for changeset 0ad160ab1455
| |
o |  changeset:   2:0ad160ab1455
|/   tag:         relA
|    user:        Danny Sadinoff <danny>
|    date:        Fri Nov 21 09:25:13 2014 +0000
|    summary:     mainline dev
|
o  changeset:   1:68f933b431ec
|  user:        Danny Sadinoff <danny>
|  date:        Fri Nov 21 09:24:18 2014 +0000
|  summary:     added a line
|
o  changeset:   0:4738f4f68f1e
   user:        Danny Sadinoff <danny>
   date:        Fri Nov 21 09:23:54 2014 +0000

      

observe the difference between @Kevin's result and ancestors approximation ():

$ hg log -r 'ancestor(relA, relB)::relB - ancestor(relA, relB)'
changeset:   3:2d5af4e62ad5
user:        Danny Sadinoff <danny>
date:        Fri Nov 21 09:26:17 2014 +0000
summary:     Added tag relA for changeset 0ad160ab1455

changeset:   6:b37a8f32de1d
tag:         relB
parent:      5:187092bb7e9b
parent:      3:2d5af4e62ad5
user:        Danny Sadinoff <danny>
date:        Fri Nov 21 09:27:47 2014 +0000
summary:     merged

      



against the ancestral approach that tells the whole story.

$ hg log -r 'ancestors(relB)  - ancestors(relA)'
changeset:   3:2d5af4e62ad5
user:        Danny Sadinoff <danny>
date:        Fri Nov 21 09:26:17 2014 +0000
summary:     Added tag relA for changeset 0ad160ab1455

changeset:   4:dbfe8f003e51
parent:      1:68f933b431ec
user:        Danny Sadinoff <danny>
date:        Fri Nov 21 09:26:51 2014 +0000
summary:     branched dev

changeset:   5:187092bb7e9b
user:        Danny Sadinoff <danny>
date:        Fri Nov 21 09:27:21 2014 +0000
summary:     more branch work

changeset:   6:b37a8f32de1d
tag:         relB
parent:      5:187092bb7e9b
parent:      3:2d5af4e62ad5
user:        Danny Sadinoff <danny>
date:        Fri Nov 21 09:27:47 2014 +0000
summary:     merged

      

the actual "largest shared revision" between the two versions looks like this:

 ancestor(ancestors(relB)  - ancestors(relA))

      

so a nice changelog would be:

$ hg glog -r 'ancestor(ancestors(relB)  - ancestors(relA))::  relB'
o    changeset:   6:b37a8f32de1d
|\   tag:         relB
| |  parent:      5:187092bb7e9b
| |  parent:      3:2d5af4e62ad5
| |  user:        Danny Sadinoff <danny@sadinoff.com>
| |  date:        Fri Nov 21 09:27:47 2014 +0000
| |  summary:     merged
| |
| o  changeset:   5:187092bb7e9b
| |  user:        Danny Sadinoff <danny@sadinoff.com>
| |  date:        Fri Nov 21 09:27:21 2014 +0000
| |  summary:     more branch work
| |
| o  changeset:   4:dbfe8f003e51
| |  parent:      1:68f933b431ec
| |  user:        Danny Sadinoff <danny@sadinoff.com>
| |  date:        Fri Nov 21 09:26:51 2014 +0000
| |  summary:     branched dev
| |
o |  changeset:   3:2d5af4e62ad5
| |  user:        Danny Sadinoff <danny@sadinoff.com>
| |  date:        Fri Nov 21 09:26:17 2014 +0000
| |  summary:     Added tag relA for changeset 0ad160ab1455
| |
o |  changeset:   2:0ad160ab1455
|/   tag:         relA
|    user:        Danny Sadinoff <danny@sadinoff.com>
|    date:        Fri Nov 21 09:25:13 2014 +0000
|    summary:     mainline dev
|
o  changeset:   1:68f933b431ec
|  user:        Danny Sadinoff <danny@sadinoff.com>
|  date:        Fri Nov 21 09:24:18 2014 +0000
|  summary:     added a line
|

      

+3


source


If you know the tag names from the top of your head:

hg log -r 'v0.9::v1.0 - v0.9'

      

If you don't, you might find out:

hg log -r 'last(tag("re:^v"), 2)'

      



The first log command only makes sense if it v0.9

is an ancestor v1.0

; if it isn't, you can use a single colon instead ::

, but the result will probably be completely meaningless. In this case, you might want something like this:

hg log -r 'ancestor(v0.9, v1.0)::v1.0 - ancestor(v0.9, v1.0)'

      

This will create a log of all changes starting from the most recent common ancestor v0.9

and v1.0

. If v0.9

is an ancestor v1.0

, it degenerates to the same behavior as the first log command.

+3


source







All Articles