#!/usr/bin/env python # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import sys, os, shutil, subprocess, re, time, glob from datetime import datetime from setup import Command, __appname__, __version__ class Stage1(Command): description = 'Stage 1 of the publish process' sub_commands = [ 'check', 'pot', 'build', 'resources', 'translations', 'iso639', 'gui', ] class Stage2(Command): description = 'Stage 2 of the publish process' sub_commands = ['linux', 'win', 'osx'] def pre_sub_commands(self, opts): for x in glob.glob(os.path.join(self.d(self.SRC), 'dist', '*')): os.remove(x) class Stage3(Command): description = 'Stage 3 of the publish process' sub_commands = ['upload_rss', 'upload_user_manual', 'upload_demo', 'pypi_upload', 'tag_release', 'upload_installers', 'upload_to_server'] class Publish(Command): description = 'Publish a new calibre release' sub_commands = ['stage1', 'stage2', 'stage3'] class Manual(Command): description='''Build the User Manual ''' def run(self, opts): cwd = os.path.abspath(os.getcwd()) os.chdir(os.path.join(self.SRC, 'calibre', 'manual')) try: for d in ('.build', 'cli'): if os.path.exists(d): shutil.rmtree(d) os.makedirs(d) if not os.path.exists('.build'+os.sep+'html'): os.makedirs('.build'+os.sep+'html') os.environ['__appname__']= __appname__ os.environ['__version__']= __version__ subprocess.check_call(['sphinx-build', '-b', 'custom', '-t', 'online', '-d', '.build/doctrees', '.', '.build/html']) subprocess.check_call(['sphinx-build', '-b', 'epub', '-d', '.build/doctrees', '.', '.build/epub']) shutil.copyfile(self.j('.build', 'epub', 'calibre.epub'), self.j('.build', 'html', 'calibre.epub')) finally: os.chdir(cwd) def clean(self): path = os.path.join(self.SRC, 'calibre', 'manual', '.build') if os.path.exists(path): shutil.rmtree(path) class TagRelease(Command): description = 'Tag a new release in bzr' def run(self, opts): self.info('Tagging release') subprocess.check_call(('bzr tag '+__version__).split()) subprocess.check_call('bzr commit --unchanged -m'.split() + ['IGN:Tag release']) if os.environ.get('CALIBRE_BUILDBOT', None) == '1': class UploadRss(Command): pass else: class UploadRss(Command): description = 'Generate and upload a RSS feed of calibre releases' from bzrlib import log as blog class ChangelogFormatter(blog.LogFormatter): supports_tags = True supports_merge_revisions = False _show_advice = False def __init__(self, num_of_versions=20): sys.path.insert(0, os.path.join(Command.SRC, 'calibre', 'utils')) from rss_gen import RSS2 self.num_of_versions = num_of_versions self.rss = RSS2( title = 'calibre releases', link = 'http://calibre.kovidgoyal.net/wiki/Changelog', description = 'Latest release of calibre', lastBuildDate = datetime.utcnow() ) self.current_entry = None def log_revision(self, r): from rss_gen import RSSItem, Guid if len(self.rss.items) > self.num_of_versions-1: return msg = r.rev.message match = re.match(r'version\s+(\d+\.\d+.\d+)', msg) if match: if self.current_entry is not None: mkup = '
' self.current_entry.description = mkup%(''.join( self.current_entry.description)) if match.group(1) == '0.5.14': self.current_entry.description = \ '''
See New in 6
''' self.rss.items.append(self.current_entry) timestamp = r.rev.timezone + r.rev.timestamp self.current_entry = RSSItem( title = 'calibre %s released'%match.group(1), link = 'http://calibre.kovidgoyal.net/download', guid = Guid(match.group(), False), pubDate = datetime(*time.gmtime(timestamp)[:6]), description = [] ) elif self.current_entry is not None: if re.search(r'[a-zA-Z]', msg) and len(msg.strip()) > 5: if 'translation' not in msg and not msg.startswith('IGN'): msg = msg.replace('<', '<').replace('>', '>') msg = re.sub('#(\d+)', r'#\1', msg) self.current_entry.description.append( '
  • %s
  • '%msg.strip()) def run(self, opts): from bzrlib import log, branch bzr_path = os.path.expanduser('~/work/calibre') b = branch.Branch.open(bzr_path) lf = UploadRss.ChangelogFormatter() log.show_log(b, lf) lf.rss.write_xml(open('/tmp/releases.xml', 'wb')) #subprocess.check_call('scp /tmp/releases.xml divok:/var/www/calibre.kovidgoyal.net/htdocs/downloads'.split())