forked from bpython/bpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhgdistver.py
More file actions
121 lines (106 loc) · 3.74 KB
/
hgdistver.py
File metadata and controls
121 lines (106 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import os
import commands
import subprocess
def version_from_cachefile(cachefile=None):
if not cachefile:
return
#replaces 'with open()' from py2.6
fd = open(cachefile)
fd.readline() # remove the comment
version = None
try:
line = fd.readline()
version_string = line.split(' = ')[1].strip()
version = version_string[1:-1].decode('string-escape')
except: # any error means invalid cachefile
pass
fd.close()
return version
def version_from_hg_id(cachefile=None):
"""stolen logic from mercurials setup.py as well"""
if os.path.isdir('.hg'):
l = commands.getoutput('hg id -i -t').strip().split()
while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
l.pop()
if len(l) > 1: # tag found
version = l[-1]
if l[0].endswith('+'): # propagate the dirty status to the tag
version += '+'
return version
def version_from_hg15_parents(cachefile=None):
if os.path.isdir('.hg'):
node = commands.getoutput('hg id -i')
if node == '000000000000+':
return '0.0.dev0-' + node
cmd = 'hg parents --template "{latesttag} {latesttagdistance}"'
out = commands.getoutput(cmd)
try:
tag, dist = out.split()
if tag=='null':
tag = '0.0'
return '%s.dev%s-%s' % (tag, dist, node)
except ValueError:
pass # unpacking failed, old hg
def version_from_hg_log_with_tags(cachefile=None):
if os.path.isdir('.hg'):
node = commands.getoutput('hg id -i')
cmd = r'hg log -r %s:0 --template "{tags}\n"'
cmd = cmd % node.rstrip('+')
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
dist = -1 # no revs vs one rev is tricky
for dist, line in enumerate(proc.stdout):
tags = [t for t in line.split() if not t.isalpha()]
if tags:
return '%s.dev%s-%s' % (tags[0], dist, node)
return '0.0.dev%s-%s' % (dist+1, node)
def _archival_to_version(data):
"""stolen logic from mercurials setup.py"""
if 'tag' in data:
return data['tag']
elif 'latesttag' in data:
return '%(latesttag)s.dev%(latesttagdistance)s-%(node).12s' % data
else:
return data.get('node', '')[:12]
def _data_from_archival(path):
import email
data = email.message_from_file(open(str(path)))
return dict(data.items())
def version_from_archival(cachefile=None):
#XXX: asumes cwd is repo root
if os.path.exists('.hg_archival.txt'):
data = _data_from_archival('.hg_archival.txt')
return _archival_to_version(data)
def version_from_sdist_pkginfo(cachefile=None):
if cachefile is None and os.path.exists('PKG-INFO'):
data = _data_from_archival('PKG-INFO')
version = data.get('Version')
if version != 'UNKNOWN':
return version
def write_cachefile(path, version):
fd = open(path, 'w')
try:
fd.write('# this file is autogenerated by hgdistver + setup.py\n')
fd.write('version = %r' % version)
finally:
fd.close()
methods = [
version_from_hg_id,
version_from_hg15_parents,
version_from_hg_log_with_tags,
version_from_archival,
version_from_cachefile,
version_from_sdist_pkginfo,
]
def get_version(cachefile=None):
try:
version = None
for method in methods:
version = method(cachefile=cachefile)
if version:
if version.endswith('+'):
import time
version += time.strftime('%Y%m%d')
return version
finally:
if cachefile and version:
write_cachefile(cachefile, version)