diff --git a/setup/publish.py b/setup/publish.py index 56c3d6f73b..6a1f486024 100644 --- a/setup/publish.py +++ b/setup/publish.py @@ -2,7 +2,7 @@ # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai from __future__ import with_statement -__license__ = 'GPL v3' +__license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' @@ -12,22 +12,24 @@ from setup import Command, __version__, require_clean_git, require_git_master from setup.upload import installers from setup.parallel_build import parallel_build + class Stage1(Command): description = 'Stage 1 of the publish process' sub_commands = [ - 'check', - 'test', - 'cacerts', - 'pot', - 'build', - 'resources', - 'translations', - 'iso639', - 'iso3166', - 'gui', - ] + 'check', + 'test', + 'cacerts', + 'pot', + 'build', + 'resources', + 'translations', + 'iso639', + 'iso3166', + 'gui', + ] + class Stage2(Command): @@ -44,6 +46,7 @@ class Stage2(Command): tdir = tempfile.mkdtemp('_build_logs') atexit.register(shutil.rmtree, tdir) self.info('Starting builds for all platforms, this will take a while...') + def kill_child_on_parent_death(): import ctypes, signal libc = ctypes.CDLL("libc.so.6") @@ -51,8 +54,11 @@ class Stage2(Command): for x in ('linux', 'osx', 'win'): r, w = pipe() - p = subprocess.Popen([sys.executable, 'setup.py', x], stdout=w, stderr=subprocess.STDOUT, - cwd=self.d(self.SRC), preexec_fn=kill_child_on_parent_death) + p = subprocess.Popen([sys.executable, 'setup.py', x], + stdout=w, + stderr=subprocess.STDOUT, + cwd=self.d(self.SRC), + preexec_fn=kill_child_on_parent_death) p.log, p.start_time, p.bname = r, time.time(), x p.save = open(os.path.join(tdir, x), 'w+b') p.duration = None @@ -69,11 +75,12 @@ class Stage2(Command): running = True return running - stop_multitail = multitail( - [proc.log for proc in processes], - name_map={proc.log:proc.bname for proc in processes}, - copy_to=[proc.save for proc in processes] - )[0] + stop_multitail = multitail([proc.log for proc in processes], + name_map={ + proc.log: proc.bname + for proc in processes + }, + copy_to=[proc.save for proc in processes])[0] while workers_running(): os.waitpid(-1, 0) @@ -94,23 +101,31 @@ class Stage2(Command): if failed: raise SystemExit('Building of installers failed!') - for p in sorted(processes, key=lambda p:p.duration): - self.info('Built %s in %d minutes and %d seconds' % (p.bname, p.duration // 60, p.duration % 60)) + for p in sorted(processes, key=lambda p: p.duration): + self.info( + 'Built %s in %d minutes and %d seconds' % + (p.bname, p.duration // 60, p.duration % 60) + ) for installer in installers(include_source=False): if not os.path.exists(self.j(self.d(self.SRC), installer)): - raise SystemExit('The installer %s does not exist' % os.path.basename(installer)) + raise SystemExit( + 'The installer %s does not exist' % os.path.basename(installer) + ) + class Stage3(Command): description = 'Stage 3 of the publish process' sub_commands = ['upload_user_manual', 'upload_demo', 'sdist', 'tag_release'] + class Stage4(Command): description = 'Stage 4 of the publish process' sub_commands = ['upload_installers'] + class Stage5(Command): description = 'Stage 5 of the publish process' @@ -119,15 +134,23 @@ class Stage5(Command): def run(self, opts): subprocess.check_call('rm -rf build/* dist/*', shell=True) + class Publish(Command): description = 'Publish a new calibre release' - sub_commands = ['stage1', 'stage2', 'stage3', 'stage4', 'stage5', ] + sub_commands = [ + 'stage1', + 'stage2', + 'stage3', + 'stage4', + 'stage5', + ] def pre_sub_commands(self, opts): require_git_master() require_clean_git() + class PublishBetas(Command): sub_commands = ['stage2', 'sdist'] @@ -137,18 +160,32 @@ class PublishBetas(Command): def run(self, opts): dist = self.a(self.j(self.d(self.SRC), 'dist')) - subprocess.check_call( - ('rsync --partial -rh --progress --delete-after %s/ download.calibre-ebook.com:/srv/download/betas/' % dist).split()) + subprocess.check_call(( + 'rsync --partial -rh --progress --delete-after %s/ download.calibre-ebook.com:/srv/download/betas/' + % dist + ).split()) + class Manual(Command): - description='''Build the User Manual ''' + description = '''Build the User Manual ''' def add_options(self, parser): - parser.add_option('-l', '--language', action='append', default=[], - help='Build translated versions for only the specified languages (can be specified multiple times)') - parser.add_option('--serve', action='store_true', default=False, - help='Run a webserver on the built manual files') + parser.add_option( + '-l', + '--language', + action='append', + default=[], + help=( + 'Build translated versions for only the specified languages (can be specified multiple times)' + ) + ) + parser.add_option( + '--serve', + action='store_true', + default=False, + help='Run a webserver on the built manual files' + ) def run(self, opts): tdir = self.j(tempfile.gettempdir(), 'user-manual-build') @@ -163,13 +200,16 @@ class Manual(Command): shutil.rmtree(d) os.makedirs(d) jobs = [] - languages = opts.language or list(json.load(open(self.j(base, 'locale', 'completed.json'), 'rb'))) + languages = opts.language or 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) for language in languages: - jobs.append((['calibre-debug', self.j(self.d(self.SRC), 'manual', 'build.py'), '--', - language, self.j(tdir, language)], - '\n\n**************** Building translations for: %s'%language)) + jobs.append(([ + 'calibre-debug', self.j(self.d(self.SRC), 'manual', 'build.py'), + '--', language, self.j(tdir, language) + ], '\n\n**************** Building translations for: %s' % language)) self.info('Building manual for %d languages' % len(jobs)) if not parallel_build(jobs, self.info): raise SystemExit(1) @@ -182,7 +222,10 @@ class Manual(Command): self.replace_with_symlinks(x) else: os.symlink('..', 'en') - self.info('Built manual for %d languages in %s minutes' % (len(jobs), int((time.time() - st)/60.))) + self.info( + 'Built manual for %d languages in %s minutes' % + (len(jobs), int((time.time() - st) / 60.)) + ) finally: os.chdir(cwd) @@ -194,14 +237,14 @@ class Manual(Command): import BaseHTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler HandlerClass = SimpleHTTPRequestHandler - ServerClass = BaseHTTPServer.HTTPServer - Protocol = "HTTP/1.0" + ServerClass = BaseHTTPServer.HTTPServer + Protocol = "HTTP/1.0" server_address = ('127.0.0.1', 8000) HandlerClass.protocol_version = Protocol httpd = ServerClass(server_address, HandlerClass) - print ("Serving User Manual on localhost:8000") + print("Serving User Manual on localhost:8000") from calibre.gui2 import open_url open_url('http://localhost:8000') httpd.serve_forever() @@ -226,11 +269,14 @@ class Manual(Command): if os.path.exists(path): shutil.rmtree(path) + class TagRelease(Command): description = 'Tag a new release in git' def run(self, opts): self.info('Tagging release') - subprocess.check_call('git tag -s v{0} -m "version-{0}"'.format(__version__).split()) + subprocess.check_call( + 'git tag -s v{0} -m "version-{0}"'.format(__version__).split() + ) subprocess.check_call('git push origin v{0}'.format(__version__).split())