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.
source to share
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
|
source to share
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.
source to share