mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-22 06:50:47 -04:00
159 lines
5.4 KiB
Python
159 lines
5.4 KiB
Python
#!/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 <kovid@kovidgoyal.net>'
|
|
__docformat__ = 'restructuredtext en'
|
|
|
|
import subprocess, tempfile, os, time
|
|
|
|
from setup import Command, installer_name
|
|
from setup.build_environment import HOST, PROJECT
|
|
|
|
BASE_RSYNC = ['rsync', '-avz', '--delete']
|
|
EXCLUDES = []
|
|
for x in [
|
|
'src/calibre/plugins', 'src/calibre/manual', 'src/calibre/trac',
|
|
'.bzr', '.build', '.svn', 'build', 'dist', 'imgsrc', '*.pyc', '*.pyo', '*.swp',
|
|
'*.swo', 'format_docs']:
|
|
EXCLUDES.extend(['--exclude', x])
|
|
SAFE_EXCLUDES = ['"%s"'%x if '*' in x else x for x in EXCLUDES]
|
|
|
|
class Rsync(Command):
|
|
|
|
description = 'Sync source tree from development machine'
|
|
|
|
SYNC_CMD = ' '.join(BASE_RSYNC+SAFE_EXCLUDES+
|
|
['rsync://{host}/work/{project}', '..'])
|
|
|
|
def run(self, opts):
|
|
cmd = self.SYNC_CMD.format(host=HOST, project=PROJECT)
|
|
self.info(cmd)
|
|
subprocess.check_call(cmd, shell=True)
|
|
|
|
|
|
class Push(Command):
|
|
|
|
description = 'Push code to another host'
|
|
|
|
def run(self, opts):
|
|
from threading import Thread
|
|
threads = []
|
|
for host in (
|
|
r'Owner@winxp:/cygdrive/c/Documents\ and\ Settings/Owner/calibre',
|
|
'kovid@ox:calibre',
|
|
r'kovid@win7:/cygdrive/c/Users/kovid/calibre',
|
|
):
|
|
rcmd = BASE_RSYNC + EXCLUDES + ['.', host]
|
|
print '\n\nPushing to:', host, '\n'
|
|
threads.append(Thread(target=subprocess.check_call, args=(rcmd,)))
|
|
threads[-1].start()
|
|
for thread in threads:
|
|
thread.join()
|
|
|
|
|
|
|
|
class VMInstaller(Command):
|
|
|
|
EXTRA_SLEEP = 5
|
|
|
|
INSTALLER_EXT = None
|
|
VM = None
|
|
VM_NAME = None
|
|
FREEZE_COMMAND = None
|
|
FREEZE_TEMPLATE = 'python setup.py {freeze_command}'
|
|
SHUTDOWN_CMD = ['sudo', 'poweroff']
|
|
IS_64_BIT = False
|
|
|
|
BUILD_CMD = 'ssh -t %s bash build-calibre'
|
|
BUILD_PREFIX = ['#!/bin/bash', 'export CALIBRE_BUILDBOT=1']
|
|
BUILD_RSYNC = [r'cd ~/build/{project}', Rsync.SYNC_CMD]
|
|
BUILD_CLEAN = ['rm -rf dist/* build/* src/calibre/plugins/*']
|
|
BUILD_BUILD = ['python setup.py build',]
|
|
|
|
def add_options(self, parser):
|
|
if not parser.has_option('--dont-shutdown'):
|
|
parser.add_option('-s', '--dont-shutdown', default=False,
|
|
action='store_true', help='Dont shutdown the VM after building')
|
|
if not parser.has_option('--vm'):
|
|
parser.add_option('--vm', help='Path to VM launcher script')
|
|
|
|
|
|
def get_build_script(self):
|
|
ans = '\n'.join(self.BUILD_PREFIX)+'\n\n'
|
|
ans += ' && \\\n'.join(self.BUILD_RSYNC) + ' && \\\n'
|
|
ans += ' && \\\n'.join(self.BUILD_CLEAN) + ' && \\\n'
|
|
ans += ' && \\\n'.join(self.BUILD_BUILD) + ' && \\\n'
|
|
ans += self.FREEZE_TEMPLATE.format(freeze_command=self.FREEZE_COMMAND) + '\n'
|
|
ans = ans.format(project=PROJECT, host=HOST)
|
|
return ans
|
|
|
|
def vmware_started(self):
|
|
return 'started' in subprocess.Popen('/etc/init.d/vmware status', shell=True, stdout=subprocess.PIPE).stdout.read()
|
|
|
|
def start_vmware(self):
|
|
if not self.vmware_started():
|
|
if os.path.exists('/dev/kvm'):
|
|
subprocess.check_call('sudo rmmod -w kvm-intel kvm', shell=True)
|
|
subprocess.Popen('sudo /etc/init.d/vmware start', shell=True)
|
|
|
|
def stop_vmware(self):
|
|
while True:
|
|
try:
|
|
subprocess.check_call('sudo /etc/init.d/vmware stop', shell=True)
|
|
break
|
|
except:
|
|
pass
|
|
while 'vmblock' in open('/proc/modules').read():
|
|
subprocess.check_call('sudo rmmod -f vmblock')
|
|
|
|
|
|
def run_vm(self):
|
|
self.__p = subprocess.Popen([self.vm])
|
|
|
|
def start_vm(self, sleep=75):
|
|
ssh_host = self.VM_NAME
|
|
self.run_vm()
|
|
build_script = self.get_build_script()
|
|
t = tempfile.NamedTemporaryFile(suffix='.sh')
|
|
t.write(build_script)
|
|
t.flush()
|
|
print 'Waiting for VM to startup'
|
|
while subprocess.call('ping -q -c1 '+ssh_host, shell=True,
|
|
stdout=open('/dev/null', 'w')) != 0:
|
|
time.sleep(5)
|
|
time.sleep(self.EXTRA_SLEEP)
|
|
print 'Trying to SSH into VM'
|
|
subprocess.check_call(('scp', t.name, ssh_host+':build-calibre'))
|
|
subprocess.check_call(self.BUILD_CMD%ssh_host, shell=True)
|
|
|
|
def installer(self):
|
|
return installer_name(self.INSTALLER_EXT, self.IS_64_BIT)
|
|
|
|
def run(self, opts):
|
|
for x in ('dont_shutdown', 'vm'):
|
|
setattr(self, x, getattr(opts, x))
|
|
if self.vm is None:
|
|
self.vm = self.VM
|
|
if not self.vmware_started():
|
|
self.start_vmware()
|
|
subprocess.call(['chmod', '-R', '+r', 'recipes'])
|
|
self.start_vm()
|
|
self.download_installer()
|
|
if not self.dont_shutdown:
|
|
subprocess.call(['ssh', self.VM_NAME]+self.SHUTDOWN_CMD)
|
|
|
|
def download_installer(self):
|
|
installer = self.installer()
|
|
subprocess.check_call(['scp',
|
|
self.VM_NAME+':build/calibre/'+installer, 'dist'])
|
|
if not os.path.exists(installer):
|
|
self.warn('Failed to download installer: '+installer)
|
|
raise SystemExit(1)
|
|
|
|
def clean(self):
|
|
installer = self.installer()
|
|
if os.path.exists(installer):
|
|
os.remove(installer)
|