1
0
mirror of https://github.com/openSUSE/osc.git synced 2024-12-28 10:46:15 +01:00

add support for --oldpackages

This commit is contained in:
Ludwig Nussel 2010-06-24 10:51:38 +02:00
parent c303735ab1
commit 377ee28887
3 changed files with 74 additions and 13 deletions

View File

@ -165,10 +165,6 @@ def run(prg):
print >>sys.stderr, e print >>sys.stderr, e
return 1 return 1
except OSError, e:
print >>sys.stderr, e
return 1
except CpioError, e: except CpioError, e:
print >>sys.stderr, e print >>sys.stderr, e
return 1 return 1

View File

@ -8,10 +8,11 @@
import os import os
import re import re
import sys import sys
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile, mkdtemp
from shutil import rmtree from shutil import rmtree
from osc.fetch import * from osc.fetch import *
from osc.core import get_buildinfo, store_read_apiurl, store_read_project, store_read_package, meta_exists, quote_plus, get_buildconfig, is_package_dir from osc.core import get_buildinfo, store_read_apiurl, store_read_project, store_read_package, meta_exists, quote_plus, get_buildconfig, is_package_dir
from osc.core import get_binarylist, get_binary_file
from osc.util import rpmquery, debquery from osc.util import rpmquery, debquery
import osc.conf import osc.conf
import oscerr import oscerr
@ -347,6 +348,7 @@ def main(opts, argv):
build_descr = argv[2] build_descr = argv[2]
xp = [] xp = []
build_root = None build_root = None
build_uid=''
vm_type = config['build-type'] vm_type = config['build-type']
build_descr = os.path.abspath(build_descr) build_descr = os.path.abspath(build_descr)
@ -400,7 +402,9 @@ def main(opts, argv):
if opts.without: if opts.without:
for o in opts.without: for o in opts.without:
buildargs.append('--without %s' % o) buildargs.append('--without %s' % o)
build_uid='' # FIXME: quoting
# if opts.define:
# buildargs.append('--define "%s"' % opts.define)
if config['build-uid']: if config['build-uid']:
build_uid = config['build-uid'] build_uid = config['build-uid']
if opts.build_uid: if opts.build_uid:
@ -414,9 +418,6 @@ def main(opts, argv):
else: else:
print >>sys.stderr, 'Error: build-uid arg must be 2 colon separated numerics: "uid:gid" or "caller"' print >>sys.stderr, 'Error: build-uid arg must be 2 colon separated numerics: "uid:gid" or "caller"'
return 1 return 1
# FIXME: quoting
# if opts.define:
# buildargs.append('--define "%s"' % opts.define)
if opts.vm_type: if opts.vm_type:
vm_type = opts.vm_type vm_type = opts.vm_type
if opts.alternative_project: if opts.alternative_project:
@ -590,8 +591,6 @@ def main(opts, argv):
if bi.release: if bi.release:
buildargs.append('--release %s' % bi.release) buildargs.append('--release %s' % bi.release)
buildargs = ' '.join(buildargs)
# real arch of this machine # real arch of this machine
# vs. # vs.
# arch we are supposed to build for # arch we are supposed to build for
@ -646,6 +645,71 @@ def main(opts, argv):
# now update the package cache # now update the package cache
fetcher.run(bi) fetcher.run(bi)
old_pkg_dir = None
if opts.oldpackages:
old_pkg_dir = opts.oldpackages
if not old_pkg_dir.startswith('/') and not opts.offline:
data = [ prj, pacname, repo, arch]
if old_pkg_dir == '_link':
p = osc.core.findpacs(os.curdir)[0]
if not p.islink():
raise oscerr.WrongOptions('package is not a link')
data[0] = p.linkinfo.project
data[1] = p.linkinfo.package
repos = osc.core.get_repositories_of_project(apiurl, data[0])
# hack for links to e.g. Factory
if not data[2] in repos and 'standard' in repos:
data[2] = 'standard'
elif old_pkg_dir != '' and old_pkg_dir != '_self':
a = old_pkg_dir.split('/')
for i in range(0, len(a)):
data[i] = a[i]
destdir = os.path.join(config['packagecachedir'], data[0], data[2], data[3])
old_pkg_dir = None
try:
print "Downloading previous build from %s ..." % '/'.join(data)
binaries = get_binarylist(apiurl, data[0], data[2], data[3], package=data[1], verbose=True)
except Exception, e:
print "Error: failed to get binaries: %s" % str(e)
binaries = []
if binaries:
class mytmpdir:
""" temporary directory that removes itself"""
def __init__(self, *args, **kwargs):
self.name = mkdtemp(*args, **kwargs)
def cleanup(self):
rmtree(self.name)
def __del__(self):
self.cleanup()
def __exit__(self):
self.cleanup()
def __str__(self):
return self.name
old_pkg_dir = mytmpdir(prefix='.build.oldpackages', dir=os.path.abspath(os.curdir))
if not os.path.exists(destdir):
os.makedirs(destdir)
for i in binaries:
fname = os.path.join(destdir, i.name)
os.symlink(fname, os.path.join(str(old_pkg_dir), i.name))
if os.path.exists(fname):
st = os.stat(fname)
if st.st_mtime == i.mtime and st.st_size == i.size:
continue
get_binary_file(apiurl,
data[0],
data[2], data[3],
i.name,
package = data[1],
target_filename = fname,
target_mtime = i.mtime,
progress_meter = True)
if old_pkg_dir != None:
buildargs.append('--oldpackages %s' % old_pkg_dir)
# Make packages from buildinfo available as repos for kiwi # Make packages from buildinfo available as repos for kiwi
if build_type == 'kiwi': if build_type == 'kiwi':
if not os.path.exists('repos'): if not os.path.exists('repos'):
@ -760,7 +824,7 @@ def main(opts, argv):
specialcmdopts, specialcmdopts,
bi.buildarch, bi.buildarch,
vm_options, vm_options,
buildargs, ' '.join(buildargs),
build_descr) build_descr)
if need_root: if need_root:
@ -796,7 +860,6 @@ def main(opts, argv):
if opts.keep_pkgs: if opts.keep_pkgs:
for i in b_built.splitlines() + s_built.splitlines(): for i in b_built.splitlines() + s_built.splitlines():
import shutil
shutil.copy2(i, os.path.join(opts.keep_pkgs, os.path.basename(i))) shutil.copy2(i, os.path.join(opts.keep_pkgs, os.path.basename(i)))
if bi_file: if bi_file:

View File

@ -3904,6 +3904,8 @@ Please submit there instead, or use --nodevelproject to force direct submission.
help='enable downloading packages as cpio archive from api') help='enable downloading packages as cpio archive from api')
@cmdln.option('--download-api-only', action='store_true', @cmdln.option('--download-api-only', action='store_true',
help=SUPPRESS_HELP) help=SUPPRESS_HELP)
@cmdln.option('--oldpackages', metavar='DIR',
help='take previous build from DIR (special values: _self, _link)')
def do_build(self, subcmd, opts, *args): def do_build(self, subcmd, opts, *args):
"""${cmd_name}: Build a package on your local machine """${cmd_name}: Build a package on your local machine