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
@@ -176,9 +177,8 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
176
177
log_directory = '/var/log/docsbuild/' , language = None ):
177
178
if not language :
178
179
language = 'en'
179
- checkout = os .path .join (build_root , 'python{version}{lang}' .format (
180
- version = str (version ).replace ('.' , '' ),
181
- lang = language if language != 'en' else '' ))
180
+ checkout = os .path .join (
181
+ build_root , str (version ), 'cpython-{lang}' .format (lang = language ))
182
182
logging .info ("Build start for version: %s, language: %s" ,
183
183
str (version ), language )
184
184
sphinxopts = SPHINXOPTS [language ].copy ()
@@ -196,7 +196,7 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
196
196
os .chmod (language_dir , 0o775 )
197
197
target = os .path .join (language_dir , str (version ))
198
198
gettext_language_tag = pep_545_tag_to_gettext_tag (language )
199
- locale_dirs = os .path .join (build_root , 'locale' )
199
+ locale_dirs = os .path .join (build_root , str ( version ), 'locale' )
200
200
locale_clone_dir = os .path .join (
201
201
locale_dirs , gettext_language_tag , 'LC_MESSAGES' )
202
202
locale_repo = 'https://github.com/python/python-docs-{}.git' .format (
@@ -227,8 +227,8 @@ def build_one(version, git_branch, isdev, quick, venv, build_root, www_root,
227
227
sphinxbuild = os .path .join (venv , "bin/sphinx-build" )
228
228
blurb = os .path .join (venv , "bin/blurb" )
229
229
shell_out (
230
- "cd Doc; make PYTHON=%s SPHINXBUILD=%s BLURB=%s VENVDIR=%s SPHINXOPTS='%s' %s >> %s 2>&1" %
231
- (python , sphinxbuild , blurb , venv , ' ' .join (sphinxopts ), maketarget ,
230
+ "make -C %s PYTHON=%s SPHINXBUILD=%s BLURB=%s VENVDIR=%s SPHINXOPTS='%s' %s >> %s 2>&1" %
231
+ (os . path . join ( checkout , 'Doc' ), python , sphinxbuild , blurb , venv , ' ' .join (sphinxopts ), maketarget ,
232
232
os .path .join (log_directory , logname )), shell = True )
233
233
shell_out (['chgrp' , '-R' , group , log_directory ])
234
234
changed = changed_files (os .path .join (checkout , "Doc/build/html" ), target )
@@ -319,6 +319,12 @@ def parse_args():
319
319
help = "Language translation, as a PEP 545 language tag like"
320
320
" 'fr' or 'pt-br'." ,
321
321
metavar = 'fr' )
322
+ parser .add_argument (
323
+ "--jobs" , "-j" ,
324
+ type = int ,
325
+ default = 4 ,
326
+ help = "Specifies the number of jobs (languages, versions) "
327
+ "to run simultaneously." )
322
328
return parser .parse_args ()
323
329
324
330
@@ -348,15 +354,21 @@ def main():
348
354
# instead of none. "--languages en" builds *no* translation,
349
355
# as "en" is the untranslated one.
350
356
args .languages = LANGUAGES
351
- for version , git_branch , devel in branches_to_do :
352
- for language in args .languages :
353
- try :
354
- build_one (version , git_branch , devel , args .quick , venv ,
355
- args .build_root , args .www_root ,
356
- args .skip_cache_invalidation , args .group ,
357
- args .log_directory , language )
358
- except Exception :
359
- logging .exception ("docs build raised exception" )
357
+ with ThreadPoolExecutor (max_workers = args .jobs ) as executor :
358
+ futures = []
359
+ for version , git_branch , devel in branches_to_do :
360
+ for language in args .languages :
361
+ futures .append ((version , language , executor .submit (
362
+ build_one , version , git_branch , devel , args .quick , venv ,
363
+ args .build_root , args .www_root ,
364
+ args .skip_cache_invalidation , args .group ,
365
+ args .log_directory , language )))
366
+ wait ([future [2 ] for future in futures ], return_when = ALL_COMPLETED )
367
+ for version , language , future in futures :
368
+ if future .exception ():
369
+ logging .error ("Exception while building %s version %s: %s" ,
370
+ language , version ,
371
+ future .exception ())
360
372
361
373
362
374
if __name__ == '__main__' :
0 commit comments