31
31
32
32
"""
33
33
34
+ from concurrent .futures import ThreadPoolExecutor , wait , ALL_COMPLETED
34
35
import logging
35
36
import os
36
37
import subprocess
@@ -170,9 +171,8 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
170
171
log_directory = '/var/log/docsbuild/' , language = None ):
171
172
if not language :
172
173
language = 'en'
173
- checkout = os .path .join (build_root , 'python{version}{lang}' .format (
174
- version = str (version ).replace ('.' , '' ),
175
- lang = language if language != 'en' else '' ))
174
+ checkout = os .path .join (
175
+ build_root , str (version ), 'cpython-{lang}' .format (lang = language ))
176
176
logging .info ("Build start for version: %s, language: %s" ,
177
177
str (version ), language )
178
178
sphinxopts = SPHINXOPTS [language ].copy ()
@@ -185,7 +185,7 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
185
185
os .chmod (language_dir , 0o775 )
186
186
target = os .path .join (language_dir , str (version ))
187
187
gettext_language_tag = pep_545_tag_to_gettext_tag (language )
188
- locale_dirs = os .path .join (build_root , 'locale' )
188
+ locale_dirs = os .path .join (build_root , str ( version ), 'locale' )
189
189
locale_clone_dir = os .path .join (
190
190
locale_dirs , gettext_language_tag , 'LC_MESSAGES' )
191
191
locale_repo = 'https://github.com/python/python-docs-{}.git' .format (
@@ -214,8 +214,8 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
214
214
sphinxbuild = os .path .join (venv , "bin/sphinx-build" )
215
215
blurb = os .path .join (venv , "bin/blurb" )
216
216
shell_out (
217
- "cd Doc; make PYTHON=%s SPHINXBUILD=%s BLURB=%s VENVDIR=%s SPHINXOPTS='%s' %s >> %s 2>&1" %
218
- (python , sphinxbuild , blurb , venv , ' ' .join (sphinxopts ), maketarget ,
217
+ "make -C %s PYTHON=%s SPHINXBUILD=%s BLURB=%s VENVDIR=%s SPHINXOPTS='%s' %s >> %s 2>&1" %
218
+ (os . path . join ( checkout , 'Doc' ), python , sphinxbuild , blurb , venv , ' ' .join (sphinxopts ), maketarget ,
219
219
os .path .join (log_directory , logname )), shell = True )
220
220
shell_out (['chgrp' , '-R' , group , log_directory ])
221
221
changed = changed_files (os .path .join (checkout , "Doc/build/html" ), target )
@@ -306,6 +306,12 @@ def parse_args():
306
306
help = "Language translation, as a PEP 545 language tag like"
307
307
" 'fr' or 'pt-br'." ,
308
308
metavar = 'fr' )
309
+ parser .add_argument (
310
+ "--jobs" , "-j" ,
311
+ type = int ,
312
+ default = 4 ,
313
+ help = "Specifies the number of jobs (languages, versions) "
314
+ "to run simultaneously." )
309
315
return parser .parse_args ()
310
316
311
317
@@ -335,15 +341,21 @@ def main():
335
341
# instead of none. "--languages en" builds *no* translation,
336
342
# as "en" is the untranslated one.
337
343
args .languages = LANGUAGES
338
- for version , git_branch , devel in branches_to_do :
339
- for language in args .languages :
340
- try :
341
- build_one (version , git_branch , devel , args .quick , venv ,
342
- args .build_root , args .www_root ,
343
- args .skip_cache_invalidation , args .group ,
344
- args .log_directory , language )
345
- except Exception :
346
- logging .exception ("docs build raised exception" )
344
+ with ThreadPoolExecutor (max_workers = args .jobs ) as executor :
345
+ futures = []
346
+ for version , git_branch , devel in branches_to_do :
347
+ for language in args .languages :
348
+ futures .append ((version , language , executor .submit (
349
+ build_one , version , git_branch , devel , args .quick , venv ,
350
+ args .build_root , args .www_root ,
351
+ args .skip_cache_invalidation , args .group ,
352
+ args .log_directory , language )))
353
+ wait ([future [2 ] for future in futures ], return_when = ALL_COMPLETED )
354
+ for version , language , future in futures :
355
+ if future .exception ():
356
+ logging .error ("Exception while building %s version %s: %s" ,
357
+ language , version ,
358
+ future .exception ())
347
359
348
360
349
361
if __name__ == '__main__' :
0 commit comments