1
-
2
1
# This file helps to compute a version number in source trees obtained from
3
2
# git-archive tarball (such as those provided by githubs download-from-tag
4
3
# feature). Distribution tarballs (built by setup.py sdist) and build
@@ -58,28 +57,32 @@ class NotThisMethod(Exception):
58
57
59
58
def register_vcs_handler (vcs , method ): # decorator
60
59
"""Decorator to mark a method as the handler for a particular VCS."""
60
+
61
61
def decorate (f ):
62
62
"""Store f in HANDLERS[vcs][method]."""
63
63
if vcs not in HANDLERS :
64
64
HANDLERS [vcs ] = {}
65
65
HANDLERS [vcs ][method ] = f
66
66
return f
67
+
67
68
return decorate
68
69
69
70
70
- def run_command (commands , args , cwd = None , verbose = False , hide_stderr = False ,
71
- env = None ):
71
+ def run_command (commands , args , cwd = None , verbose = False , hide_stderr = False , env = None ):
72
72
"""Call the given command(s)."""
73
73
assert isinstance (commands , list )
74
74
p = None
75
75
for c in commands :
76
76
try :
77
77
dispcmd = str ([c ] + args )
78
78
# remember shell=False, so use git.cmd on windows, not just git
79
- p = subprocess .Popen ([c ] + args , cwd = cwd , env = env ,
80
- stdout = subprocess .PIPE ,
81
- stderr = (subprocess .PIPE if hide_stderr
82
- else None ))
79
+ p = subprocess .Popen (
80
+ [c ] + args ,
81
+ cwd = cwd ,
82
+ env = env ,
83
+ stdout = subprocess .PIPE ,
84
+ stderr = (subprocess .PIPE if hide_stderr else None ),
85
+ )
83
86
break
84
87
except EnvironmentError :
85
88
e = sys .exc_info ()[1 ]
@@ -116,16 +119,22 @@ def versions_from_parentdir(parentdir_prefix, root, verbose):
116
119
for i in range (3 ):
117
120
dirname = os .path .basename (root )
118
121
if dirname .startswith (parentdir_prefix ):
119
- return {"version" : dirname [len (parentdir_prefix ):],
120
- "full-revisionid" : None ,
121
- "dirty" : False , "error" : None , "date" : None }
122
+ return {
123
+ "version" : dirname [len (parentdir_prefix ) :],
124
+ "full-revisionid" : None ,
125
+ "dirty" : False ,
126
+ "error" : None ,
127
+ "date" : None ,
128
+ }
122
129
else :
123
130
rootdirs .append (root )
124
131
root = os .path .dirname (root ) # up a level
125
132
126
133
if verbose :
127
- print ("Tried directories %s but none started with prefix %s" %
128
- (str (rootdirs ), parentdir_prefix ))
134
+ print (
135
+ "Tried directories %s but none started with prefix %s"
136
+ % (str (rootdirs ), parentdir_prefix )
137
+ )
129
138
raise NotThisMethod ("rootdir doesn't start with parentdir_prefix" )
130
139
131
140
@@ -181,7 +190,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
181
190
# starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
182
191
# just "foo-1.0". If we see a "tag: " prefix, prefer those.
183
192
TAG = "tag: "
184
- tags = set ([r [len (TAG ):] for r in refs if r .startswith (TAG )])
193
+ tags = set ([r [len (TAG ) :] for r in refs if r .startswith (TAG )])
185
194
if not tags :
186
195
# Either we're using git < 1.8.3, or there really are no tags. We use
187
196
# a heuristic: assume all version tags have a digit. The old git %d
@@ -190,27 +199,34 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
190
199
# between branches and tags. By ignoring refnames without digits, we
191
200
# filter out many common branch names like "release" and
192
201
# "stabilization", as well as "HEAD" and "master".
193
- tags = set ([r for r in refs if re .search (r'\d' , r )])
202
+ tags = set ([r for r in refs if re .search (r"\d" , r )])
194
203
if verbose :
195
204
print ("discarding '%s', no digits" % "," .join (refs - tags ))
196
205
if verbose :
197
206
print ("likely tags: %s" % "," .join (sorted (tags )))
198
207
for ref in sorted (tags ):
199
208
# sorting will prefer e.g. "2.0" over "2.0rc1"
200
209
if ref .startswith (tag_prefix ):
201
- r = ref [len (tag_prefix ):]
210
+ r = ref [len (tag_prefix ) :]
202
211
if verbose :
203
212
print ("picking %s" % r )
204
- return {"version" : r ,
205
- "full-revisionid" : keywords ["full" ].strip (),
206
- "dirty" : False , "error" : None ,
207
- "date" : date }
213
+ return {
214
+ "version" : r ,
215
+ "full-revisionid" : keywords ["full" ].strip (),
216
+ "dirty" : False ,
217
+ "error" : None ,
218
+ "date" : date ,
219
+ }
208
220
# no suitable tags, so version is "0+unknown", but full hex is still there
209
221
if verbose :
210
222
print ("no suitable tags, using unknown + full revision id" )
211
- return {"version" : "0+unknown" ,
212
- "full-revisionid" : keywords ["full" ].strip (),
213
- "dirty" : False , "error" : "no suitable tags" , "date" : None }
223
+ return {
224
+ "version" : "0+unknown" ,
225
+ "full-revisionid" : keywords ["full" ].strip (),
226
+ "dirty" : False ,
227
+ "error" : "no suitable tags" ,
228
+ "date" : None ,
229
+ }
214
230
215
231
216
232
@register_vcs_handler ("git" , "pieces_from_vcs" )
@@ -225,19 +241,27 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
225
241
if sys .platform == "win32" :
226
242
GITS = ["git.cmd" , "git.exe" ]
227
243
228
- out , rc = run_command (GITS , ["rev-parse" , "--git-dir" ], cwd = root ,
229
- hide_stderr = True )
244
+ out , rc = run_command (GITS , ["rev-parse" , "--git-dir" ], cwd = root , hide_stderr = True )
230
245
if rc != 0 :
231
246
if verbose :
232
247
print ("Directory %s not under git control" % root )
233
248
raise NotThisMethod ("'git rev-parse --git-dir' returned error" )
234
249
235
250
# if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
236
251
# if there isn't one, this yields HEX[-dirty] (no NUM)
237
- describe_out , rc = run_command (GITS , ["describe" , "--tags" , "--dirty" ,
238
- "--always" , "--long" ,
239
- "--match" , "%s*" % tag_prefix ],
240
- cwd = root )
252
+ describe_out , rc = run_command (
253
+ GITS ,
254
+ [
255
+ "describe" ,
256
+ "--tags" ,
257
+ "--dirty" ,
258
+ "--always" ,
259
+ "--long" ,
260
+ "--match" ,
261
+ "%s*" % tag_prefix ,
262
+ ],
263
+ cwd = root ,
264
+ )
241
265
# --long was added in git-1.5.5
242
266
if describe_out is None :
243
267
raise NotThisMethod ("'git describe' failed" )
@@ -260,17 +284,16 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
260
284
dirty = git_describe .endswith ("-dirty" )
261
285
pieces ["dirty" ] = dirty
262
286
if dirty :
263
- git_describe = git_describe [:git_describe .rindex ("-dirty" )]
287
+ git_describe = git_describe [: git_describe .rindex ("-dirty" )]
264
288
265
289
# now we have TAG-NUM-gHEX or HEX
266
290
267
291
if "-" in git_describe :
268
292
# TAG-NUM-gHEX
269
- mo = re .search (r' ^(.+)-(\d+)-g([0-9a-f]+)$' , git_describe )
293
+ mo = re .search (r" ^(.+)-(\d+)-g([0-9a-f]+)$" , git_describe )
270
294
if not mo :
271
295
# unparseable. Maybe git-describe is misbehaving?
272
- pieces ["error" ] = ("unable to parse git-describe output: '%s'"
273
- % describe_out )
296
+ pieces ["error" ] = "unable to parse git-describe output: '%s'" % describe_out
274
297
return pieces
275
298
276
299
# tag
@@ -279,10 +302,12 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
279
302
if verbose :
280
303
fmt = "tag '%s' doesn't start with prefix '%s'"
281
304
print (fmt % (full_tag , tag_prefix ))
282
- pieces ["error" ] = ("tag '%s' doesn't start with prefix '%s'"
283
- % (full_tag , tag_prefix ))
305
+ pieces ["error" ] = "tag '%s' doesn't start with prefix '%s'" % (
306
+ full_tag ,
307
+ tag_prefix ,
308
+ )
284
309
return pieces
285
- pieces ["closest-tag" ] = full_tag [len (tag_prefix ):]
310
+ pieces ["closest-tag" ] = full_tag [len (tag_prefix ) :]
286
311
287
312
# distance: number of commits since tag
288
313
pieces ["distance" ] = int (mo .group (2 ))
@@ -293,13 +318,13 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
293
318
else :
294
319
# HEX: no tags
295
320
pieces ["closest-tag" ] = None
296
- count_out , rc = run_command (GITS , ["rev-list" , "HEAD" , "--count" ],
297
- cwd = root )
321
+ count_out , rc = run_command (GITS , ["rev-list" , "HEAD" , "--count" ], cwd = root )
298
322
pieces ["distance" ] = int (count_out ) # total number of commits
299
323
300
324
# commit date: see ISO-8601 comment in git_versions_from_keywords()
301
- date = run_command (GITS , ["show" , "-s" , "--format=%ci" , "HEAD" ],
302
- cwd = root )[0 ].strip ()
325
+ date = run_command (GITS , ["show" , "-s" , "--format=%ci" , "HEAD" ], cwd = root )[
326
+ 0
327
+ ].strip ()
303
328
pieces ["date" ] = date .strip ().replace (" " , "T" , 1 ).replace (" " , "" , 1 )
304
329
305
330
return pieces
@@ -330,8 +355,7 @@ def render_pep440(pieces):
330
355
rendered += ".dirty"
331
356
else :
332
357
# exception #1
333
- rendered = "0+untagged.%d.g%s" % (pieces ["distance" ],
334
- pieces ["short" ])
358
+ rendered = "0+untagged.%d.g%s" % (pieces ["distance" ], pieces ["short" ])
335
359
if pieces ["dirty" ]:
336
360
rendered += ".dirty"
337
361
return rendered
@@ -445,11 +469,13 @@ def render_git_describe_long(pieces):
445
469
def render (pieces , style ):
446
470
"""Render the given version pieces into the requested style."""
447
471
if pieces ["error" ]:
448
- return {"version" : "unknown" ,
449
- "full-revisionid" : pieces .get ("long" ),
450
- "dirty" : None ,
451
- "error" : pieces ["error" ],
452
- "date" : None }
472
+ return {
473
+ "version" : "unknown" ,
474
+ "full-revisionid" : pieces .get ("long" ),
475
+ "dirty" : None ,
476
+ "error" : pieces ["error" ],
477
+ "date" : None ,
478
+ }
453
479
454
480
if not style or style == "default" :
455
481
style = "pep440" # the default
@@ -469,9 +495,13 @@ def render(pieces, style):
469
495
else :
470
496
raise ValueError ("unknown style '%s'" % style )
471
497
472
- return {"version" : rendered , "full-revisionid" : pieces ["long" ],
473
- "dirty" : pieces ["dirty" ], "error" : None ,
474
- "date" : pieces .get ("date" )}
498
+ return {
499
+ "version" : rendered ,
500
+ "full-revisionid" : pieces ["long" ],
501
+ "dirty" : pieces ["dirty" ],
502
+ "error" : None ,
503
+ "date" : pieces .get ("date" ),
504
+ }
475
505
476
506
477
507
def get_versions ():
@@ -485,8 +515,7 @@ def get_versions():
485
515
verbose = cfg .verbose
486
516
487
517
try :
488
- return git_versions_from_keywords (get_keywords (), cfg .tag_prefix ,
489
- verbose )
518
+ return git_versions_from_keywords (get_keywords (), cfg .tag_prefix , verbose )
490
519
except NotThisMethod :
491
520
pass
492
521
@@ -495,13 +524,16 @@ def get_versions():
495
524
# versionfile_source is the relative path from the top of the source
496
525
# tree (where the .git directory might live) to this file. Invert
497
526
# this to find the root from __file__.
498
- for i in cfg .versionfile_source .split ('/' ):
527
+ for i in cfg .versionfile_source .split ("/" ):
499
528
root = os .path .dirname (root )
500
529
except NameError :
501
- return {"version" : "0+unknown" , "full-revisionid" : None ,
502
- "dirty" : None ,
503
- "error" : "unable to find root of source tree" ,
504
- "date" : None }
530
+ return {
531
+ "version" : "0+unknown" ,
532
+ "full-revisionid" : None ,
533
+ "dirty" : None ,
534
+ "error" : "unable to find root of source tree" ,
535
+ "date" : None ,
536
+ }
505
537
506
538
try :
507
539
pieces = git_pieces_from_vcs (cfg .tag_prefix , root , verbose )
@@ -515,6 +547,10 @@ def get_versions():
515
547
except NotThisMethod :
516
548
pass
517
549
518
- return {"version" : "0+unknown" , "full-revisionid" : None ,
519
- "dirty" : None ,
520
- "error" : "unable to compute version" , "date" : None }
550
+ return {
551
+ "version" : "0+unknown" ,
552
+ "full-revisionid" : None ,
553
+ "dirty" : None ,
554
+ "error" : "unable to compute version" ,
555
+ "date" : None ,
556
+ }
0 commit comments