From cee6a3708c0e71f928aa12f72ad22eda6029488b Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Tue, 23 Feb 2010 15:08:24 -0500 Subject: [fedpkg-pull-build-chain] Much closer to working --- fedpkg-pull-build-chain | 69 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 12 deletions(-) mode change 100644 => 100755 fedpkg-pull-build-chain diff --git a/fedpkg-pull-build-chain b/fedpkg-pull-build-chain old mode 100644 new mode 100755 index 47f4ba7..4c943b3 --- a/fedpkg-pull-build-chain +++ b/fedpkg-pull-build-chain @@ -13,19 +13,28 @@ import getopt import os import sys import subprocess +import shutil + +def check_call_verbose(*args, **kwargs): + print "Running: %r" % (args[0], ) + subprocess.check_call(*args, **kwargs) def main(): try: - opts, args = getopt.getopt(sys.argv[1:], '', ['release', 'arch']) + opts, args = getopt.getopt(sys.argv[1:], '', ['release=', 'arch=', 'resultdir=', 'force']) except getopt.GetoptError, e: + print unicode(e) print "Usage: fedpkg-pull-build-chain --release=F-12 --resultdir=/path/to/repo rpm1 rpm2 ..." sys.exit(1) + force = False release = None resultdir = None architectures = [] for o, a in opts: - if o in ('--release', ): + if o in ('--force', ): + force = True + elif o in ('--release', ): release = a elif o in ('--arch', ): architectures.append(a) @@ -40,13 +49,40 @@ def main(): sys.exit(1) if len(architectures) == 0: - architectures.append(subprocess.check_call(['uname', '-m'], stdout=subprocess.PIPE).communicate()[0]) + architectures.append(subprocess.Popen(['uname', '-m'], stdout=subprocess.PIPE).communicate()[0].strip()) + + if not os.path.exists(resultdir): + print "Creating repository in %r" % (resultdir, ) + os.mkdir(resultdir) + check_call_verbose(['createrepo', '.'], cwd=resultdir) + + try: + os.mkdir('_build') + except OSError, e: + pass + + mockreleases = [] + for f in ('site-defaults.cfg', 'logging.ini'): + shutil.copy2('/etc/mock/' + f, '_build') + + for architecture in architectures: + # FIXME do this better + mockrelease = 'fedora-' + release[2:].lower() + '-' + architecture + f_in = open(os.path.join('/etc', 'mock', mockrelease + '.cfg')) + new_mockrelease_path = os.path.join('_build', mockrelease + '.cfg') + f_out = open(new_mockrelease_path, 'w') + for line in f_in: + f_out.write(line) + f_in.close() + f_out.write('config_opts[\'yum.conf\'] += """[buildchain]\nname=buildchain\nbaseurl=file://%s\n"""' % (os.path.abspath(resultdir), )) + f_out.close() + mockreleases.append(mockrelease) failed = [] for arg in args: if not os.path.isdir(arg): print "Checking out %r from fedora-cvs" % (arg, ) - subprocess.check_call(['fedora-cvs', arg], stdout=sys.stdout, stderr=sys.stderr) + check_call_verbose(['fedora-cvs', arg], stdout=sys.stdout, stderr=sys.stderr) release_dir = os.path.join(arg, release) for filename in os.listdir(release_dir): fpath = os.path.join(release_dir, filename) @@ -54,8 +90,11 @@ def main(): print "Deleting old srpm: " + fpath os.unlink(fpath) print "Running fedpkg-make-pull" + args = ['fedpkg-make-pull'] + if force: + args.append('--force') try: - subprocess.check_call(['fedpkg-make-pull'], stdout=sys.stdout, stderr=sys.stderr) + check_call_verbose(args, stdout=sys.stdout, stderr=sys.stderr, cwd=release_dir) except subprocess.CalledProcessError, e: print "Failed: " + unicode(e) failed.append(arg) @@ -72,26 +111,32 @@ def main(): mock_resultdir = os.path.join('_build', arg) try: - os.mkdir(mock_resultdir) + os.makedirs(mock_resultdir) except OSError, e: # assume EEXIST, and clean out old results for filename in os.listdir(mock_resultdir): os.unlink(os.path.join(mock_resultdir, filename)) - for architecture in architectures: - # FIXME do this better - mockrelease = 'fedora-' + release[2:].lower() + '-' + architecture + + current_failed = False + for mockrelease in mockreleases: try: - subprocess.check_call(['mock', '-r', mockrelease, '--resultdir=' + mock_resultdir, 'rebuild', srpm], stdout=sys.stdout, stderr=sys.stderr) + check_call_verbose(['mock', '--configdir=_build', '-r', mockrelease, '--resultdir=' + mock_resultdir, 'rebuild', srpm], stdout=sys.stdout, stderr=sys.stderr) except subprocess.CalledProcessError, e: print "Failed: " + unicode(e) + current_failed = True failed.append(arg) - continue + break + if current_failed: + continue for filename in os.listdir(mock_resultdir): if not filename.endswith('.rpm'): continue - os.link(os.path.join(resultdir, filename), os.path.join(mock_resultdir, filename)) + src = os.path.join(mock_resultdir, filename) + linkname = os.path.join(resultdir, filename) + print "Linking %r to %r" % (src, linkname) + os.link(src, linkname) if len(failed) > 0: sys.exit(1) -- cgit