from __future__ import with_statement from shutil import copyfileobj from os.path import join, abspath from os import listdir, getcwd, walk from subprocess import Popen from base.base import log from base.module import Module from base.util import pwd, copy, symlink, move from base.exceptions import ExecutionException from base.vars import FEDORA_DIR from modules.package import Package class Build(Module): def __init__(self, name=None, target_dir=None): log.debug('name is %s' % name) self.name = name self.pkg = Package(name) self.target_dir = target_dir def setup_source(self, target_dir=None): if not target_dir: if self.target_dir: target_dir = self.target_dir else: raise ExecutionException(None, 'no Target Dir specified') log.debug('target dir is %s' % target_dir) with pwd(self.pkg.code_dir): symlink(self.name + '.spec', join(self.target_dir, 'SPECS', self.name + '.spec')) sball = self.pkg.pkg_cfg['sourceball'] symlink(sball, join(self.target_dir, 'SOURCES', sball)) patches = [f for f in listdir(getcwd()) if f.endswith('.patch')] for p in patches: symlink(patch, join(self.target_dir, 'SOURCES', p)) def build_quick_rpm(self, target_dir=None): self.rpmbuild('-ba', target_dir) def build_source_rpm(self, target_dir=None): self.rpmbuild('-bs', target_dir) def rpmbuild(self, param, target_dir=None): if not target_dir: if self.target_dir: target_dir = self.target_dir else: raise ExecutionException(None, 'no Target Dir specified') with pwd(self.pkg.code_dir): rpm_out = file('rpmbuild.log', 'w') with pwd(join(target_dir, 'SPECS')): p = Popen(['rpmbuild', param, self.name + '.spec'], stdout=rpm_out, stderr=rpm_out) log.info('quick compiling %s... please wait' % self.name) p.wait() rpm_out.close() def fetch_rpms(self, target_dir=None): if not target_dir: if self.target_dir: target_dir = self.target_dir else: raise ExecutionException(None, 'no Target Dir specified') with pwd(target_dir): for path, dirs, files in walk('.'): for f in files: if f.endswith('.rpm'): move(join(path, f), join(FEDORA_DIR, f)) def fetch_build(self, target_dir=None): if not target_dir: if self.target_dir: target_dir = self.target_dir else: raise ExecutionException(None, 'no Target Dir specified') with pwd(target_dir): source = self.pkg.pkg_cfg['source'] move(join('BUILD', source), join(self.pkg.code_dir, 'results')) def close(self): self.pkg.close()