@@ -46,14 +46,9 @@ def parse(root):
46
46
trace ('initial node' , root )
47
47
return meta ('0.0' , dirty = dirty )
48
48
49
- # the newline is needed for merge stae, see issue 72
50
- cmd = 'hg parents --template "{latesttag} {latesttagdistance}\n "'
51
- out = do (cmd , root )
52
49
try :
53
- # in merge state we assume parent 1 is fine
54
- tags , dist = out .splitlines ()[0 ].split ()
55
- # pick latest tag from tag list
56
- tag = tags .split (':' )[- 1 ]
50
+ tag = get_latest_normalizable_tag (root )
51
+ dist = get_graph_distance (root , tag )
57
52
if tag == 'null' :
58
53
tag = '0.0'
59
54
dist = int (dist ) + 1
@@ -62,6 +57,23 @@ def parse(root):
62
57
pass # unpacking failed, old hg
63
58
64
59
60
+ def get_latest_normalizable_tag (root ):
61
+ # Gets all tags containing a '.' (see #229) from oldest to newest
62
+ cmd = ['hg' , 'log' ,
63
+ '-r' , "ancestors(.) and tag('re:\.')" , '--template' , "{tags}\n " ]
64
+ outlines = do (cmd , root ).split ()
65
+ if not outlines :
66
+ return 'null'
67
+ tag = outlines [- 1 ].split ()[- 1 ]
68
+ return tag
69
+
70
+
71
+ def get_graph_distance (root , rev1 , rev2 = '.' ):
72
+ cmd = ['hg' , 'log' , '-q' , '-r' , '%s::%s' % (rev1 , rev2 )]
73
+ out = do (cmd , root )
74
+ return len (out .strip ().splitlines ()) - 1
75
+
76
+
65
77
def archival_to_version (data ):
66
78
trace ('data' , data )
67
79
node = data .get ('node' , '' )[:12 ]
0 commit comments