31
31
32
32
"""
33
33
34
+ from bisect import bisect
34
35
import filecmp
35
36
import logging
36
37
import os
37
38
import pathlib
39
+ import re
38
40
import shutil
39
41
import subprocess
40
42
import sys
53
55
54
56
BRANCHES = [
55
57
# version, git branch, isdev
56
- (3.6 , "3.6" , False ),
57
- (3.7 , "3.7" , False ),
58
- (3.8 , "3.8" , False ),
59
- (3.9 , "3.9" , True ),
60
- (3.10 , "master" , True ),
58
+ (" 3.6" , "3.6" , False ),
59
+ (" 3.7" , "3.7" , False ),
60
+ (" 3.8" , "3.8" , False ),
61
+ (" 3.9" , "3.9" , True ),
62
+ (" 3.10" , "master" , True ),
61
63
]
62
64
63
65
LANGUAGES = ["en" , "fr" , "ja" , "ko" , "pt-br" , "zh-cn" , "zh-tw" , "id" ]
@@ -193,6 +195,39 @@ def pep_545_tag_to_gettext_tag(tag):
193
195
return language + "_" + region .upper ()
194
196
195
197
198
+ def locate_nearest_version (available_versions , target_version ):
199
+ """Look for the nearest version of target_version in available_versions.
200
+ Versions are to be given as tuples, like (3, 7) for 3.7.
201
+
202
+ >>> locate_nearest_version(["2.7", "3.6", "3.7", "3.8"], "3.9")
203
+ '3.8'
204
+ >>> locate_nearest_version(["2.7", "3.6", "3.7", "3.8"], "3.5")
205
+ '3.6'
206
+ >>> locate_nearest_version(["2.7", "3.6", "3.7", "3.8"], "2.6")
207
+ '2.7'
208
+ >>> locate_nearest_version(["2.7", "3.6", "3.7", "3.8"], "3.10")
209
+ '3.8'
210
+ """
211
+
212
+ def version_to_tuple (version ):
213
+ return tuple (int (part ) for part in version .split ("." ))
214
+
215
+ def tuple_to_version (version_tuple ):
216
+ return "." .join (str (part ) for part in version_tuple )
217
+
218
+ available_versions_tuples = [
219
+ version_to_tuple (available_version ) for available_version in available_versions
220
+ ]
221
+ target_version_tuple = version_to_tuple (target_version )
222
+ try :
223
+ found = available_versions_tuples [
224
+ bisect (available_versions_tuples , target_version_tuple )
225
+ ]
226
+ except IndexError :
227
+ found = available_versions_tuples [- 1 ]
228
+ return tuple_to_version (found )
229
+
230
+
196
231
def translation_branch (locale_repo , locale_clone_dir , needed_version ):
197
232
"""Some cpython versions may be untranslated, being either too old or
198
233
too new.
@@ -202,15 +237,11 @@ def translation_branch(locale_repo, locale_clone_dir, needed_version):
202
237
"""
203
238
git_clone (locale_repo , locale_clone_dir )
204
239
remote_branches = shell_out (["git" , "-C" , locale_clone_dir , "branch" , "-r" ])
205
- translated_branches = []
206
- for translated_branch in remote_branches .split ("\n " ):
207
- if not translated_branch :
208
- continue
209
- try :
210
- translated_branches .append (float (translated_branch .split ("/" )[1 ]))
211
- except ValueError :
212
- pass # Skip non-version branches like 'master' if they exists.
213
- return str (sorted (translated_branches , key = lambda x : abs (needed_version - x ))[0 ])
240
+ branches = []
241
+ for branch in remote_branches .split ("\n " ):
242
+ if re .match (r".*/[0-9]+\.[0-9]+$" , branch ):
243
+ branches .append (branch .split ("/" )[- 1 ])
244
+ return locate_nearest_version (branches , needed_version )
214
245
215
246
216
247
def build_one (
@@ -228,17 +259,15 @@ def build_one(
228
259
language = "en"
229
260
if sentry_sdk :
230
261
with sentry_sdk .configure_scope () as scope :
231
- scope .set_tag ("version" , repr ( version ) )
262
+ scope .set_tag ("version" , version )
232
263
scope .set_tag ("language" , language )
233
- checkout = os .path .join (
234
- build_root , str (version ), "cpython-{lang}" .format (lang = language )
235
- )
236
- logging .info ("Build start for version: %s, language: %s" , str (version ), language )
264
+ checkout = os .path .join (build_root , version , "cpython-{lang}" .format (lang = language ))
265
+ logging .info ("Build start for version: %s, language: %s" , version , language )
237
266
sphinxopts = SPHINXOPTS [language ].copy ()
238
267
sphinxopts .extend (["-q" ])
239
268
if language != "en" :
240
269
gettext_language_tag = pep_545_tag_to_gettext_tag (language )
241
- locale_dirs = os .path .join (build_root , str ( version ) , "locale" )
270
+ locale_dirs = os .path .join (build_root , version , "locale" )
242
271
locale_clone_dir = os .path .join (
243
272
locale_dirs , gettext_language_tag , "LC_MESSAGES"
244
273
)
@@ -280,22 +309,18 @@ def build_one(
280
309
logfile = os .path .join (log_directory , logname ),
281
310
)
282
311
shell_out (["chgrp" , "-R" , group , log_directory ])
283
- logging .info ("Build done for version: %s, language: %s" , str ( version ) , language )
312
+ logging .info ("Build done for version: %s, language: %s" , version , language )
284
313
285
314
286
315
def copy_build_to_webroot (
287
316
build_root , version , language , group , quick , skip_cache_invalidation , www_root
288
317
):
289
318
"""Copy a given build to the appropriate webroot with appropriate rights.
290
319
"""
291
- logging .info (
292
- "Publishing start for version: %s, language: %s" , str (version ), language
293
- )
294
- checkout = os .path .join (
295
- build_root , str (version ), "cpython-{lang}" .format (lang = language )
296
- )
320
+ logging .info ("Publishing start for version: %s, language: %s" , version , language )
321
+ checkout = os .path .join (build_root , version , "cpython-{lang}" .format (lang = language ))
297
322
if language == "en" :
298
- target = os .path .join (www_root , str ( version ) )
323
+ target = os .path .join (www_root , version )
299
324
else :
300
325
language_dir = os .path .join (www_root , language )
301
326
os .makedirs (language_dir , exist_ok = True )
@@ -304,7 +329,7 @@ def copy_build_to_webroot(
304
329
except subprocess .CalledProcessError as err :
305
330
logging .warning ("Can't change group of %s: %s" , language_dir , str (err ))
306
331
os .chmod (language_dir , 0o775 )
307
- target = os .path .join (language_dir , str ( version ) )
332
+ target = os .path .join (language_dir , version )
308
333
309
334
os .makedirs (target , exist_ok = True )
310
335
try :
@@ -379,9 +404,7 @@ def copy_build_to_webroot(
379
404
shell_out (
380
405
["curl" , "-XPURGE" , "https://docs.python.org/{%s}" % "," .join (to_purge )]
381
406
)
382
- logging .info (
383
- "Publishing done for version: %s, language: %s" , str (version ), language
384
- )
407
+ logging .info ("Publishing done for version: %s, language: %s" , version , language )
385
408
386
409
387
410
def head (lines , n = 10 ):
@@ -551,7 +574,7 @@ def main():
551
574
for version , language , future in futures :
552
575
if sentry_sdk :
553
576
with sentry_sdk .configure_scope () as scope :
554
- scope .set_tag ("version" , repr ( version ) )
577
+ scope .set_tag ("version" , version )
555
578
scope .set_tag ("language" , language if language else "en" )
556
579
if future .exception ():
557
580
logging .error (
0 commit comments