Create a setup.py command: man_pages to generate man pages in all languages

This commit is contained in:
Kovid Goyal 2017-07-04 12:28:59 +05:30
parent 5d9a4aee9d
commit fa191ab55a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 85 additions and 6 deletions

View File

@ -17,6 +17,8 @@ import sys, os, subprocess, shutil
SPHINX_BUILD = 'sphinx-build2'
j, d, a = os.path.join, os.path.dirname, os.path.abspath
BASE = d(a(__file__))
def sphinx_build(language, base, builder='html', bdir='html', t=None, quiet=True):
destdir = j(base, bdir)
@ -29,11 +31,12 @@ def sphinx_build(language, base, builder='html', bdir='html', t=None, quiet=True
ans += ['-w', j(destdir, 'sphinx-build-warnings.txt')]
if t:
ans += ['-t', t]
ans += ['-d', j(base, 'doctrees'), '.', destdir]
ans += ['-d', j(base, 'doctrees'), BASE, destdir]
print(' '.join(ans))
subprocess.check_call(ans)
return destdir
def build_manual(language, base):
sb = partial(sphinx_build, language, base)
onlinedir = sb(t='online')
@ -41,6 +44,7 @@ def build_manual(language, base):
latexdir = sb('mylatex', 'latex')
pwd = os.getcwdu()
os.chdir(latexdir)
def run_cmd(cmd):
p = subprocess.Popen(cmd, stdout=open(os.devnull, 'wb'), stdin=subprocess.PIPE)
p.stdin.close()
@ -63,6 +67,7 @@ def build_manual(language, base):
from calibre.ebooks.oeb.polish.container import epub_to_azw3
epub_to_azw3(epub_dest)
def build_pot(base):
cmd = [SPHINX_BUILD, '-b', 'gettext', '-t', 'online', '-t', 'gettext', '.', base]
print (' '.join(cmd))
@ -70,7 +75,13 @@ def build_pot(base):
os.remove(j(base, 'generated.pot'))
return base
def build_man_pages(language, base):
sphinx_build(language, base, builder='man', bdir=language)
if __name__ == '__main__':
import argparse
os.chdir(d(a(__file__)))
os.environ['__appname__'] = __appname__
os.environ['__version__'] = __version__
@ -81,12 +92,20 @@ if __name__ == '__main__':
import json
os.environ['ALL_USER_MANUAL_LANGUAGES'] = ' '.join(json.load(open('locale/completed.json', 'rb')))
sphinx_build(language, base, t='online', quiet=False)
print ('Manual built in', j(base, 'html'))
else:
language, base = sys.argv[1:]
p = argparse.ArgumentParser()
p.add_argument('language', help='The language to build for')
p.add_argument('base', help='The destination directory')
p.add_argument('--man-pages', default=False, action='store_true', help='Build man pages')
args = p.parse_args()
language, base = args.language, args.base
if language == 'gettext':
build_pot(base)
elif args.man_pages:
os.environ['CALIBRE_OVERRIDE_LANG'] = language
build_man_pages(language, base)
else:
os.environ['CALIBRE_OVERRIDE_LANG'] = language
build_manual(language, base)
if language != 'gettext':
print ('Manual for', language, 'built in', j(base, 'html'))

View File

@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en'
__all__ = [
'pot', 'translations', 'get_translations', 'iso639', 'iso3166',
'build', 'mathjax',
'build', 'mathjax', 'man_pages',
'gui',
'develop', 'install',
'kakasi', 'coffee', 'rapydscript', 'cacerts', 'recent_uas', 'resources',
@ -64,7 +64,7 @@ recent_uas = RecentUAs()
rapydscript = RapydScript()
from setup.publish import Manual, TagRelease, Stage1, Stage2, \
Stage3, Stage4, Stage5, Publish, PublishBetas
Stage3, Stage4, Stage5, Publish, PublishBetas, ManPages
manual = Manual()
tag_release = TagRelease()
stage1 = Stage1()
@ -74,6 +74,7 @@ stage4 = Stage4()
stage5 = Stage5()
publish = Publish()
publish_betas = PublishBetas()
man_pages = ManPages()
from setup.upload import (UploadUserManual, UploadDemo, UploadInstallers,
UploadToServer, ReUpload)

View File

@ -271,6 +271,65 @@ class Manual(Command):
shutil.rmtree(path)
class ManPages(Command):
description = '''Build the man pages '''
def add_options(self, parser):
parser.add_option('--man-dir', help='Where to generate the man pages')
parser.add_option('--compress-man-pages', default=False, action='store_true', help='Compress the generated man pages')
def run(self, opts):
self.build_man_pages(opts.man_dir or 'man-pages', opts.compress_man_pages)
def build_man_pages(self, dest, compress=False):
dest = os.path.abspath(dest)
if os.path.exists(dest):
shutil.rmtree(dest)
os.makedirs(dest)
self.info('\tCreating man pages in {}...'.format(dest))
base = self.j(self.d(self.SRC), 'manual')
languages = list(
json.load(open(self.j(base, 'locale', 'completed.json'), 'rb'))
)
languages = ['en'] + list(set(languages) - {'en'})
os.environ['ALL_USER_MANUAL_LANGUAGES'] = ' '.join(languages)
try:
os.makedirs(dest)
except EnvironmentError:
pass
jobs = []
for l in languages:
jobs.append((
['calibre-debug', self.j(base, 'build.py'), '--', '--man-pages', l, dest],
'\n\n**************** Building translations for: %s' % l)
)
if not parallel_build(jobs, self.info, verbose=False):
raise SystemExit(1)
shutil.rmtree(self.j(dest, 'doctrees'))
cwd = os.getcwdu()
os.chdir(dest)
try:
for x in os.listdir('.'):
if x == 'en':
os.rename(x, 'man1')
else:
os.mkdir(self.j(x, 'man1'))
for y in os.listdir(x):
if y != 'man1':
os.rename(self.j(x, y), self.j(x, 'man1', y))
if compress:
jobs = []
for dirpath, dirnames, filenames in os.walk('.'):
for f in filenames:
if f.endswith('.1'):
jobs.append((['gzip', '--best', self.j(dirpath, f)], ''))
if not parallel_build(jobs, self.info, verbose=False):
raise SystemExit(1)
finally:
os.chdir(cwd)
class TagRelease(Command):
description = 'Tag a new release in git'