2009-03-02 15:03:06 +01:00
|
|
|
# Copyright (C) 2006 Novell Inc. All rights reserved.
|
2006-07-14 19:39:46 +02:00
|
|
|
# This program is free software; it may be used, copied, modified
|
|
|
|
# and distributed under the terms of the GNU General Public Licence,
|
|
|
|
# either version 2, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
2008-03-11 16:18:02 +01:00
|
|
|
import re
|
2006-07-14 19:39:46 +02:00
|
|
|
import sys
|
2010-07-13 12:13:25 +02:00
|
|
|
import shutil
|
2011-03-15 18:45:36 +01:00
|
|
|
import urlparse
|
2010-06-24 10:51:38 +02:00
|
|
|
from tempfile import NamedTemporaryFile, mkdtemp
|
2006-07-14 19:39:46 +02:00
|
|
|
from osc.fetch import *
|
2010-02-09 16:35:48 +01:00
|
|
|
from osc.core import get_buildinfo, store_read_apiurl, store_read_project, store_read_package, meta_exists, quote_plus, get_buildconfig, is_package_dir
|
2010-06-24 10:51:38 +02:00
|
|
|
from osc.core import get_binarylist, get_binary_file
|
2012-04-03 15:59:42 +02:00
|
|
|
from osc.util import rpmquery, debquery, archquery
|
2006-10-10 16:04:34 +02:00
|
|
|
import osc.conf
|
2008-06-20 15:37:49 +02:00
|
|
|
import oscerr
|
2008-10-11 22:26:45 +02:00
|
|
|
import subprocess
|
2007-03-12 21:00:47 +01:00
|
|
|
try:
|
|
|
|
from xml.etree import cElementTree as ET
|
|
|
|
except ImportError:
|
|
|
|
import cElementTree as ET
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-02-28 16:56:32 +01:00
|
|
|
from conf import config, cookiejar
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
change_personality = {
|
2008-11-22 17:38:40 +01:00
|
|
|
'i686': 'linux32',
|
|
|
|
'i586': 'linux32',
|
|
|
|
'i386': 'linux32',
|
|
|
|
'ppc': 'powerpc32',
|
|
|
|
's390': 's390',
|
2010-06-26 12:32:58 +02:00
|
|
|
'sparc': 'linux32',
|
|
|
|
'sparcv8': 'linux32',
|
2008-11-22 17:38:40 +01:00
|
|
|
}
|
|
|
|
|
2012-02-09 15:13:04 +01:00
|
|
|
# FIXME: qemu_can_build should not be needed anymore since OBS 2.3
|
2012-01-12 13:47:31 +01:00
|
|
|
qemu_can_build = [ 'armv4l', 'armv5el', 'armv5l', 'armv6l', 'armv7l', 'armv6el', 'armv7el', 'armv7hl', 'armv8el',
|
|
|
|
'sh4', 'mips', 'mipsel',
|
|
|
|
'ppc', 'ppc64',
|
|
|
|
's390', 's390x',
|
|
|
|
'sparc64v', 'sparcv9v', 'sparcv9', 'sparcv8', 'sparc',
|
2013-02-03 13:25:32 +01:00
|
|
|
'hppa',
|
2012-01-12 13:47:31 +01:00
|
|
|
]
|
|
|
|
|
2009-10-20 16:30:15 +02:00
|
|
|
can_also_build = {
|
2013-02-03 13:25:32 +01:00
|
|
|
'aarch64':['aarch64'],
|
2010-04-10 16:50:15 +02:00
|
|
|
'armv4l': [ 'armv4l' ],
|
2011-10-09 11:21:53 +02:00
|
|
|
'armv6l' :[ 'armv4l', 'armv5l', 'armv6l', 'armv5el', 'armv6el' ],
|
|
|
|
'armv7l' :[ 'armv4l', 'armv5l', 'armv6l', 'armv7l', 'armv5el', 'armv6el', 'armv7el' ],
|
|
|
|
'armv5el':[ 'armv4l', 'armv5l', 'armv5el' ], # not existing arch, just for compatibility
|
|
|
|
'armv6el':[ 'armv4l', 'armv5l', 'armv6l', 'armv5el', 'armv6el' ], # not existing arch, just for compatibility
|
|
|
|
'armv7el':[ 'armv4l', 'armv5l', 'armv6l', 'armv7l', 'armv5el', 'armv6el', 'armv7el' ], # not existing arch, just for compatibility
|
|
|
|
'armv7hl':[ 'armv7hl' ], # not existing arch, just for compatibility
|
|
|
|
'armv8el':[ 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el' ], # not existing arch, just for compatibility
|
|
|
|
'armv8l' :[ 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el' ], # not existing arch, just for compatibility
|
2011-09-28 15:32:57 +02:00
|
|
|
'armv5tel':[ 'armv4l', 'armv5el', 'armv5tel' ],
|
2010-04-10 16:50:15 +02:00
|
|
|
's390x': ['s390' ],
|
|
|
|
'ppc64': [ 'ppc', 'ppc64' ],
|
|
|
|
'sh4': [ 'sh4' ],
|
2012-01-12 13:47:31 +01:00
|
|
|
'i586': [ 'i386' ],
|
|
|
|
'i686': [ 'i586', 'i386' ],
|
|
|
|
'x86_64': ['i686', 'i586', 'i386' ],
|
2010-06-26 12:32:58 +02:00
|
|
|
'sparc64': ['sparc64v', 'sparcv9v', 'sparcv9', 'sparcv8', 'sparc'],
|
2010-09-06 10:40:24 +02:00
|
|
|
'parisc': ['hppa'],
|
2012-01-12 13:47:31 +01:00
|
|
|
}
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2006-07-17 15:53:17 +02:00
|
|
|
# real arch of this machine
|
2006-07-14 19:39:46 +02:00
|
|
|
hostarch = os.uname()[4]
|
|
|
|
if hostarch == 'i686': # FIXME
|
|
|
|
hostarch = 'i586'
|
|
|
|
|
2010-09-06 10:40:24 +02:00
|
|
|
if hostarch == 'parisc':
|
|
|
|
hostarch = 'hppa'
|
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
class Buildinfo:
|
|
|
|
"""represent the contents of a buildinfo file"""
|
|
|
|
|
2009-09-10 14:18:07 +02:00
|
|
|
def __init__(self, filename, apiurl, buildtype = 'spec', localpkgs = []):
|
2006-10-10 16:04:34 +02:00
|
|
|
try:
|
|
|
|
tree = ET.parse(filename)
|
|
|
|
except:
|
2008-07-04 14:56:32 +02:00
|
|
|
print >>sys.stderr, 'could not parse the buildinfo:'
|
2007-04-25 23:10:49 +02:00
|
|
|
print >>sys.stderr, open(filename).read()
|
2006-10-10 16:04:34 +02:00
|
|
|
sys.exit(1)
|
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
root = tree.getroot()
|
|
|
|
|
2010-02-24 20:02:52 +01:00
|
|
|
self.apiurl = apiurl
|
2009-06-16 14:46:02 +02:00
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
if root.find('error') != None:
|
2008-01-11 17:44:08 +01:00
|
|
|
sys.stderr.write('buildinfo is broken... it says:\n')
|
2006-07-14 19:39:46 +02:00
|
|
|
error = root.find('error').text
|
|
|
|
sys.stderr.write(error + '\n')
|
|
|
|
sys.exit(1)
|
|
|
|
|
2009-02-24 00:29:32 +01:00
|
|
|
if not (apiurl.startswith('https://') or apiurl.startswith('http://')):
|
|
|
|
raise urllib2.URLError('invalid protocol for the apiurl: \'%s\'' % apiurl)
|
2008-01-23 20:37:44 +01:00
|
|
|
|
2009-08-04 18:01:02 +02:00
|
|
|
self.buildtype = buildtype
|
2010-02-12 10:17:34 +01:00
|
|
|
self.apiurl = apiurl
|
2009-08-04 18:01:02 +02:00
|
|
|
|
|
|
|
# are we building .rpm or .deb?
|
2008-11-13 00:51:43 +01:00
|
|
|
# XXX: shouldn't we deliver the type via the buildinfo?
|
2006-07-14 19:39:46 +02:00
|
|
|
self.pacsuffix = 'rpm'
|
2009-08-04 18:01:02 +02:00
|
|
|
if self.buildtype == 'dsc':
|
|
|
|
self.pacsuffix = 'deb'
|
2012-04-03 15:59:42 +02:00
|
|
|
if self.buildtype == 'arch':
|
|
|
|
self.pacsuffix = 'arch'
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
self.buildarch = root.find('arch').text
|
2012-02-09 15:13:04 +01:00
|
|
|
if root.find('hostarch') != None:
|
|
|
|
self.hostarch = root.find('hostarch').text
|
|
|
|
else:
|
|
|
|
self.hostarch = None
|
2009-08-20 12:45:39 +02:00
|
|
|
if root.find('release') != None:
|
2009-10-20 16:30:15 +02:00
|
|
|
self.release = root.find('release').text
|
2009-12-01 14:36:11 +01:00
|
|
|
else:
|
|
|
|
self.release = None
|
2009-02-20 10:36:20 +01:00
|
|
|
self.downloadurl = root.get('downloadurl')
|
2008-12-10 23:38:00 +01:00
|
|
|
self.debuginfo = 0
|
2008-10-31 16:41:19 +01:00
|
|
|
if root.find('debuginfo') != None:
|
2008-12-10 23:38:00 +01:00
|
|
|
try:
|
2009-03-12 17:35:40 +01:00
|
|
|
self.debuginfo = int(root.find('debuginfo').text)
|
2008-12-10 23:38:00 +01:00
|
|
|
except ValueError:
|
|
|
|
pass
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
self.deps = []
|
2009-06-16 14:46:02 +02:00
|
|
|
self.projects = {}
|
|
|
|
self.keys = []
|
2009-11-11 15:48:25 +01:00
|
|
|
self.prjkeys = []
|
2006-07-14 19:39:46 +02:00
|
|
|
for node in root.findall('bdep'):
|
2009-09-10 14:18:07 +02:00
|
|
|
p = Pac(node, self.buildarch, self.pacsuffix,
|
|
|
|
apiurl, localpkgs)
|
2009-06-16 14:46:02 +02:00
|
|
|
if p.project:
|
|
|
|
self.projects[p.project] = 1
|
2006-07-14 19:39:46 +02:00
|
|
|
self.deps.append(p)
|
|
|
|
|
2009-02-20 14:45:00 +01:00
|
|
|
self.vminstall_list = [ dep.name for dep in self.deps if dep.vminstall ]
|
2010-04-27 20:09:01 +02:00
|
|
|
self.cbinstall_list = [ dep.name for dep in self.deps if dep.cbinstall ]
|
|
|
|
self.cbpreinstall_list = [ dep.name for dep in self.deps if dep.cbpreinstall ]
|
2007-03-29 01:37:34 +02:00
|
|
|
self.preinstall_list = [ dep.name for dep in self.deps if dep.preinstall ]
|
|
|
|
self.runscripts_list = [ dep.name for dep in self.deps if dep.runscripts ]
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2008-11-22 11:55:33 +01:00
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
def has_dep(self, name):
|
|
|
|
for i in self.deps:
|
|
|
|
if i.name == name:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
def remove_dep(self, name):
|
2010-08-19 14:43:20 +02:00
|
|
|
# we need to iterate over all deps because if this a
|
|
|
|
# kiwi build the same package might appear multiple times
|
2012-11-08 09:01:19 +01:00
|
|
|
# NOTE: do not loop and remove items, the second same one would not get catched
|
|
|
|
self.deps = [i for i in self.deps if not i.name == name]
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Pac:
|
2008-11-22 11:55:33 +01:00
|
|
|
"""represent a package to be downloaded
|
|
|
|
|
|
|
|
We build a map that's later used to fill our URL templates
|
|
|
|
"""
|
2009-09-10 14:18:07 +02:00
|
|
|
def __init__(self, node, buildarch, pacsuffix, apiurl, localpkgs = []):
|
2008-11-22 11:55:33 +01:00
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
self.mp = {}
|
2012-02-22 11:33:34 +01:00
|
|
|
for i in ['binary', 'package',
|
2009-10-20 16:30:15 +02:00
|
|
|
'version', 'release',
|
|
|
|
'project', 'repository',
|
2009-02-20 14:45:00 +01:00
|
|
|
'preinstall', 'vminstall', 'noinstall', 'runscripts',
|
2011-01-30 21:31:58 +01:00
|
|
|
'cbinstall', 'cbpreinstall',
|
2008-11-22 11:55:33 +01:00
|
|
|
]:
|
|
|
|
self.mp[i] = node.get(i)
|
|
|
|
|
|
|
|
self.mp['buildarch'] = buildarch
|
|
|
|
self.mp['pacsuffix'] = pacsuffix
|
|
|
|
|
2009-03-13 16:58:55 +01:00
|
|
|
self.mp['arch'] = node.get('arch') or self.mp['buildarch']
|
2012-02-22 11:33:34 +01:00
|
|
|
self.mp['name'] = node.get('name') or self.mp['binary']
|
2008-11-22 11:55:33 +01:00
|
|
|
|
2009-09-10 14:18:07 +02:00
|
|
|
# this is not the ideal place to check if the package is a localdep or not
|
2012-11-08 09:01:19 +01:00
|
|
|
localdep = self.mp['name'] in localpkgs # and not self.mp['noinstall']
|
2009-09-10 14:18:07 +02:00
|
|
|
if not localdep and not (node.get('project') and node.get('repository')):
|
|
|
|
raise oscerr.APIError('incomplete information for package %s, may be caused by a broken project configuration.'
|
2009-09-09 10:17:13 +02:00
|
|
|
% self.mp['name'] )
|
|
|
|
|
2009-09-10 14:18:07 +02:00
|
|
|
if not localdep:
|
|
|
|
self.mp['extproject'] = node.get('project').replace(':', ':/')
|
|
|
|
self.mp['extrepository'] = node.get('repository').replace(':', ':/')
|
2009-02-20 16:01:16 +01:00
|
|
|
self.mp['repopackage'] = node.get('package') or '_repository'
|
2009-08-09 20:10:13 +02:00
|
|
|
self.mp['repoarch'] = node.get('repoarch') or self.mp['buildarch']
|
2008-11-22 11:55:33 +01:00
|
|
|
|
2009-06-16 14:15:41 +02:00
|
|
|
if pacsuffix == 'deb' and not (self.mp['name'] and self.mp['arch'] and self.mp['version']):
|
2008-11-22 11:55:33 +01:00
|
|
|
raise oscerr.APIError(
|
2009-10-20 16:30:15 +02:00
|
|
|
"buildinfo for package %s/%s/%s is incomplete"
|
2008-11-22 11:55:33 +01:00
|
|
|
% (self.mp['name'], self.mp['arch'], self.mp['version']))
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-02-24 00:29:32 +01:00
|
|
|
self.mp['apiurl'] = apiurl
|
2007-04-25 13:22:40 +02:00
|
|
|
|
2010-03-24 13:20:09 +01:00
|
|
|
if pacsuffix == 'deb':
|
2012-02-22 14:12:06 +01:00
|
|
|
filename = debquery.DebQuery.filename(self.mp['name'], self.mp['version'], self.mp['release'], self.mp['arch'])
|
2012-04-03 15:59:42 +02:00
|
|
|
elif pacsuffix == 'arch':
|
|
|
|
filename = archquery.ArchQuery.filename(self.mp['name'], self.mp['version'], self.mp['release'], self.mp['arch'])
|
2009-09-13 18:57:40 +02:00
|
|
|
else:
|
2012-02-22 14:12:06 +01:00
|
|
|
filename = rpmquery.RpmQuery.filename(self.mp['name'], self.mp['version'], self.mp['release'], self.mp['arch'])
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2012-02-22 14:12:06 +01:00
|
|
|
self.mp['filename'] = node.get('binary') or filename
|
2009-07-15 21:48:16 +02:00
|
|
|
if self.mp['repopackage'] == '_repository':
|
2009-09-03 21:00:09 +02:00
|
|
|
self.mp['repofilename'] = self.mp['name']
|
2009-07-15 21:48:16 +02:00
|
|
|
else:
|
2012-02-22 11:33:34 +01:00
|
|
|
# OBS 2.3 puts binary into product bdeps (noinstall ones)
|
2012-02-22 14:12:06 +01:00
|
|
|
self.mp['repofilename'] = self.mp['filename']
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2008-11-22 11:55:33 +01:00
|
|
|
# make the content of the dictionary accessible as class attributes
|
|
|
|
self.__dict__.update(self.mp)
|
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
def makeurls(self, cachedir, urllist):
|
|
|
|
|
|
|
|
self.urllist = []
|
|
|
|
|
|
|
|
# build up local URL
|
|
|
|
# by using the urlgrabber with local urls, we basically build up a cache.
|
|
|
|
# the cache has no validation, since the package servers don't support etags,
|
|
|
|
# or if-modified-since, so the caching is simply name-based (on the assumption
|
|
|
|
# that the filename is suitable as identifier)
|
|
|
|
self.localdir = '%s/%s/%s/%s' % (cachedir, self.project, self.repository, self.arch)
|
2009-07-15 21:48:16 +02:00
|
|
|
self.fullfilename = os.path.join(self.localdir, self.filename)
|
2010-04-07 03:06:03 +02:00
|
|
|
self.url_local = 'file://%s' % self.fullfilename
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-10-20 16:30:15 +02:00
|
|
|
# first, add the local URL
|
2006-07-14 19:39:46 +02:00
|
|
|
self.urllist.append(self.url_local)
|
|
|
|
|
|
|
|
# remote URLs
|
|
|
|
for url in urllist:
|
|
|
|
self.urllist.append(url % self.mp)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
def __repr__(self):
|
|
|
|
return "%s" % self.name
|
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
|
|
|
|
def get_built_files(pacdir, pactype):
|
|
|
|
if pactype == 'rpm':
|
2009-10-20 16:30:15 +02:00
|
|
|
b_built = subprocess.Popen(['find', os.path.join(pacdir, 'RPMS'),
|
2008-11-14 23:32:39 +01:00
|
|
|
'-name', '*.rpm'],
|
|
|
|
stdout=subprocess.PIPE).stdout.read().strip()
|
2009-10-20 16:30:15 +02:00
|
|
|
s_built = subprocess.Popen(['find', os.path.join(pacdir, 'SRPMS'),
|
2008-11-14 23:32:39 +01:00
|
|
|
'-name', '*.rpm'],
|
|
|
|
stdout=subprocess.PIPE).stdout.read().strip()
|
2009-04-20 15:07:43 +02:00
|
|
|
elif pactype == 'kiwi':
|
2009-10-20 16:30:15 +02:00
|
|
|
b_built = subprocess.Popen(['find', os.path.join(pacdir, 'KIWI'),
|
2009-04-20 15:07:43 +02:00
|
|
|
'-type', 'f'],
|
|
|
|
stdout=subprocess.PIPE).stdout.read().strip()
|
2012-08-13 12:54:38 +02:00
|
|
|
elif pactype == 'deb':
|
2008-11-14 23:32:39 +01:00
|
|
|
b_built = subprocess.Popen(['find', os.path.join(pacdir, 'DEBS'),
|
|
|
|
'-name', '*.deb'],
|
|
|
|
stdout=subprocess.PIPE).stdout.read().strip()
|
2009-10-20 16:30:15 +02:00
|
|
|
s_built = subprocess.Popen(['find', os.path.join(pacdir, 'SOURCES.DEB'),
|
2009-04-27 13:44:38 +02:00
|
|
|
'-type', 'f'],
|
|
|
|
stdout=subprocess.PIPE).stdout.read().strip()
|
2012-08-13 12:54:38 +02:00
|
|
|
elif pactype == 'arch':
|
|
|
|
b_built = subprocess.Popen(['find', os.path.join(pacdir, 'ARCHPKGS'),
|
|
|
|
'-name', '*.pkg.tar*'],
|
|
|
|
stdout=subprocess.PIPE).stdout.read().strip()
|
|
|
|
s_built = []
|
|
|
|
else:
|
2012-09-27 21:43:45 +02:00
|
|
|
print >>sys.stderr, 'WARNING: Unknown package type \'%s\'.' % pactype
|
2012-08-13 12:54:38 +02:00
|
|
|
b_built = []
|
|
|
|
s_built = []
|
2006-07-14 19:39:46 +02:00
|
|
|
return s_built, b_built
|
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
def get_repo(path):
|
|
|
|
"""Walks up path looking for any repodata directories.
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
@param path path to a directory
|
|
|
|
@return str path to repository directory containing repodata directory
|
|
|
|
"""
|
|
|
|
oldDirectory = None
|
|
|
|
currentDirectory = os.path.abspath(path)
|
|
|
|
repositoryDirectory = None
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
# while there are still parent directories
|
|
|
|
while currentDirectory != oldDirectory:
|
|
|
|
children = os.listdir(currentDirectory)
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
if "repodata" in children:
|
|
|
|
repositoryDirectory = currentDirectory
|
|
|
|
break
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
# ascend
|
|
|
|
oldDirectory = currentDirectory
|
|
|
|
currentDirectory = os.path.abspath(os.path.join(oldDirectory,
|
|
|
|
os.pardir))
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
return repositoryDirectory
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-09-13 01:55:56 +02:00
|
|
|
def get_prefer_pkgs(dirs, wanted_arch, type):
|
2007-05-02 15:49:57 +02:00
|
|
|
import glob
|
2010-01-18 16:12:10 +01:00
|
|
|
from util import repodata, packagequery, cpio
|
2007-05-02 15:49:57 +02:00
|
|
|
paths = []
|
2010-02-05 15:14:48 +01:00
|
|
|
repositories = []
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2009-09-13 01:55:56 +02:00
|
|
|
suffix = '*.rpm'
|
|
|
|
if type == 'dsc':
|
|
|
|
suffix = '*.deb'
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
for dir in dirs:
|
2010-01-18 16:12:10 +01:00
|
|
|
# check for repodata
|
|
|
|
repository = get_repo(dir)
|
|
|
|
if repository is None:
|
|
|
|
paths += glob.glob(os.path.join(os.path.abspath(dir), suffix))
|
|
|
|
else:
|
|
|
|
repositories.append(repository)
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-02-05 15:14:48 +01:00
|
|
|
packageQueries = packagequery.PackageQueries(wanted_arch)
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
for repository in repositories:
|
2010-02-05 15:14:48 +01:00
|
|
|
repodataPackageQueries = repodata.queries(repository)
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
for packageQuery in repodataPackageQueries:
|
|
|
|
packageQueries.add(packageQuery)
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
for path in paths:
|
|
|
|
if path.endswith('src.rpm'):
|
|
|
|
continue
|
|
|
|
if path.find('-debuginfo-') > 0:
|
|
|
|
continue
|
2010-01-18 16:12:10 +01:00
|
|
|
packageQuery = packagequery.PackageQuery.query(path)
|
|
|
|
packageQueries.add(packageQuery)
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
prefer_pkgs = dict((name, packageQuery.path())
|
2010-02-05 15:14:48 +01:00
|
|
|
for name, packageQuery in packageQueries.iteritems())
|
2010-02-28 02:30:13 +01:00
|
|
|
|
2010-01-18 16:12:10 +01:00
|
|
|
depfile = create_deps(packageQueries.values())
|
2009-09-10 14:18:07 +02:00
|
|
|
cpio = cpio.CpioWrite()
|
|
|
|
cpio.add('deps', '\n'.join(depfile))
|
2009-09-21 19:29:20 +02:00
|
|
|
return prefer_pkgs, cpio
|
2009-09-10 14:18:07 +02:00
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
|
2009-09-10 14:18:07 +02:00
|
|
|
def create_deps(pkgqs):
|
|
|
|
"""
|
|
|
|
creates a list of requires/provides which corresponds to build's internal
|
|
|
|
dependency file format
|
|
|
|
"""
|
|
|
|
depfile = []
|
|
|
|
for p in pkgqs:
|
|
|
|
id = '%s.%s-0/0/0: ' % (p.name(), p.arch())
|
|
|
|
depfile.append('R:%s%s' % (id, ' '.join(p.requires())))
|
|
|
|
depfile.append('P:%s%s' % (id, ' '.join(p.provides())))
|
|
|
|
return depfile
|
2007-05-02 15:49:57 +02:00
|
|
|
|
|
|
|
|
2010-06-23 14:40:55 +02:00
|
|
|
trustprompt = """Would you like to ...
|
|
|
|
0 - quit (default)
|
|
|
|
1 - trust packages from '%(project)s' always
|
|
|
|
2 - trust them just this time
|
|
|
|
? """
|
|
|
|
def check_trusted_projects(apiurl, projects):
|
|
|
|
trusted = config['api_host_options'][apiurl]['trusted_prj']
|
|
|
|
tlen = len(trusted)
|
|
|
|
for prj in projects:
|
|
|
|
if not prj in trusted:
|
|
|
|
print "\nThe build root needs packages from project '%s'." % prj
|
|
|
|
print "Note that malicious packages can compromise the build result or even your system."
|
|
|
|
r = raw_input(trustprompt % { 'project':prj })
|
|
|
|
if r == '1':
|
2010-06-29 15:32:53 +02:00
|
|
|
print "adding '%s' to ~/.oscrc: ['%s']['trusted_prj']" % (prj,apiurl)
|
2010-06-23 14:40:55 +02:00
|
|
|
trusted.append(prj)
|
|
|
|
elif r != '2':
|
|
|
|
print "Well, good good bye then :-)"
|
|
|
|
raise oscerr.UserAbort()
|
|
|
|
|
|
|
|
if tlen != len(trusted):
|
|
|
|
config['api_host_options'][apiurl]['trusted_prj'] = trusted
|
|
|
|
conf.config_set_option(apiurl, 'trusted_prj', ' '.join(trusted))
|
|
|
|
|
2010-06-30 13:37:26 +02:00
|
|
|
def main(apiurl, opts, argv):
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2007-04-25 13:22:40 +02:00
|
|
|
repo = argv[0]
|
|
|
|
arch = argv[1]
|
2008-11-22 11:55:33 +01:00
|
|
|
build_descr = argv[2]
|
2008-12-11 12:36:07 +01:00
|
|
|
xp = []
|
2009-11-23 14:53:59 +01:00
|
|
|
build_root = None
|
2011-04-14 21:54:00 +02:00
|
|
|
cache_dir = None
|
2010-06-24 10:51:38 +02:00
|
|
|
build_uid=''
|
2010-04-29 14:27:07 +02:00
|
|
|
vm_type = config['build-type']
|
2008-11-22 11:55:33 +01:00
|
|
|
|
2010-01-09 14:25:41 +01:00
|
|
|
build_descr = os.path.abspath(build_descr)
|
2008-11-22 11:55:33 +01:00
|
|
|
build_type = os.path.splitext(build_descr)[1][1:]
|
2012-04-03 15:59:42 +02:00
|
|
|
if os.path.basename(build_descr) == 'PKGBUILD':
|
|
|
|
build_type = 'arch'
|
|
|
|
if build_type not in ['spec', 'dsc', 'kiwi', 'arch']:
|
2008-11-22 11:55:33 +01:00
|
|
|
raise oscerr.WrongArgs(
|
2010-01-09 14:25:41 +01:00
|
|
|
'Unknown build type: \'%s\'. Build description should end in .spec, .dsc or .kiwi.' \
|
2008-11-22 11:55:33 +01:00
|
|
|
% build_type)
|
2010-01-09 14:25:41 +01:00
|
|
|
if not os.path.isfile(build_descr):
|
|
|
|
raise oscerr.WrongArgs('Error: build description file named \'%s\' does not exist.' % build_descr)
|
2007-05-02 15:49:57 +02:00
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
buildargs = []
|
2007-05-14 10:29:50 +02:00
|
|
|
if not opts.userootforbuild:
|
|
|
|
buildargs.append('--norootforbuild')
|
2007-04-25 13:22:40 +02:00
|
|
|
if opts.clean:
|
|
|
|
buildargs.append('--clean')
|
|
|
|
if opts.noinit:
|
|
|
|
buildargs.append('--noinit')
|
2008-07-23 22:05:09 +02:00
|
|
|
if opts.nochecks:
|
|
|
|
buildargs.append('--no-checks')
|
2007-09-03 12:25:18 +02:00
|
|
|
if not opts.no_changelog:
|
2007-08-14 13:26:13 +02:00
|
|
|
buildargs.append('--changelog')
|
2009-11-23 14:53:59 +01:00
|
|
|
if opts.root:
|
|
|
|
build_root = opts.root
|
2013-02-06 17:12:52 +01:00
|
|
|
if opts.target:
|
|
|
|
buildargs.append('--target=%s' % opts.target)
|
2008-04-24 11:00:23 +02:00
|
|
|
if opts.jobs:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--jobs=%s' % opts.jobs)
|
2010-02-12 11:55:09 +01:00
|
|
|
elif config['build-jobs'] > 1:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--jobs=%s' % config['build-jobs'])
|
2010-02-18 18:57:11 +01:00
|
|
|
if opts.icecream or config['icecream'] != '0':
|
2010-02-11 13:47:32 +01:00
|
|
|
if opts.icecream:
|
|
|
|
num = opts.icecream
|
|
|
|
else:
|
|
|
|
num = config['icecream']
|
|
|
|
|
2010-02-18 18:49:22 +01:00
|
|
|
if int(num) > 0:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--icecream=%s' % num)
|
2010-02-12 11:55:09 +01:00
|
|
|
xp.append('icecream')
|
|
|
|
xp.append('gcc-c++')
|
2008-12-11 12:36:07 +01:00
|
|
|
if opts.ccache:
|
|
|
|
buildargs.append('--ccache')
|
|
|
|
xp.append('ccache')
|
2009-12-09 06:53:27 +01:00
|
|
|
if opts.linksources:
|
|
|
|
buildargs.append('--linksources')
|
2008-05-08 14:21:57 +02:00
|
|
|
if opts.baselibs:
|
|
|
|
buildargs.append('--baselibs')
|
2008-09-24 15:13:33 +02:00
|
|
|
if opts.debuginfo:
|
|
|
|
buildargs.append('--debug')
|
2008-12-11 12:36:07 +01:00
|
|
|
if opts._with:
|
2009-11-24 10:49:26 +01:00
|
|
|
for o in opts._with:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--with=%s' % o)
|
2008-12-11 12:36:07 +01:00
|
|
|
if opts.without:
|
2009-11-24 10:49:26 +01:00
|
|
|
for o in opts.without:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--without=%s' % o)
|
|
|
|
if opts.define:
|
2010-12-21 16:10:50 +01:00
|
|
|
for o in opts.define:
|
|
|
|
buildargs.append('--define=%s' % o)
|
2010-02-12 22:54:39 +01:00
|
|
|
if config['build-uid']:
|
|
|
|
build_uid = config['build-uid']
|
|
|
|
if opts.build_uid:
|
|
|
|
build_uid = opts.build_uid
|
|
|
|
if build_uid:
|
|
|
|
buildidre = re.compile('^[0-9]{1,5}:[0-9]{1,5}$')
|
|
|
|
if build_uid == 'caller':
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--uid=%s:%s' % (os.getuid(), os.getgid()))
|
2010-02-12 22:54:39 +01:00
|
|
|
elif buildidre.match(build_uid):
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--uid=%s' % build_uid)
|
2010-02-12 22:54:39 +01:00
|
|
|
else:
|
|
|
|
print >>sys.stderr, 'Error: build-uid arg must be 2 colon separated numerics: "uid:gid" or "caller"'
|
|
|
|
return 1
|
2010-04-29 14:27:29 +02:00
|
|
|
if opts.vm_type:
|
|
|
|
vm_type = opts.vm_type
|
2008-01-07 15:54:31 +01:00
|
|
|
if opts.alternative_project:
|
|
|
|
prj = opts.alternative_project
|
|
|
|
pac = '_repository'
|
2008-10-14 12:38:22 +02:00
|
|
|
else:
|
|
|
|
prj = store_read_project(os.curdir)
|
2009-03-09 00:43:26 +01:00
|
|
|
if opts.local_package:
|
|
|
|
pac = '_repository'
|
|
|
|
else:
|
|
|
|
pac = store_read_package(os.curdir)
|
2010-06-24 10:51:55 +02:00
|
|
|
if opts.shell:
|
|
|
|
buildargs.append("--shell")
|
2007-05-02 15:49:57 +02:00
|
|
|
|
2006-10-10 16:04:34 +02:00
|
|
|
# make it possible to override configuration of the rc file
|
2009-10-20 16:30:15 +02:00
|
|
|
for var in ['OSC_PACKAGECACHEDIR', 'OSC_SU_WRAPPER', 'OSC_BUILD_ROOT']:
|
2006-10-10 16:04:34 +02:00
|
|
|
val = os.getenv(var)
|
|
|
|
if val:
|
|
|
|
if var.startswith('OSC_'): var = var[4:]
|
|
|
|
var = var.lower().replace('_', '-')
|
|
|
|
if config.has_key(var):
|
|
|
|
print 'Overriding config value for %s=\'%s\' with \'%s\'' % (var, config[var], val)
|
|
|
|
config[var] = val
|
|
|
|
|
2009-11-17 18:23:30 +01:00
|
|
|
pacname = pac
|
|
|
|
if pacname == '_repository':
|
2010-04-22 09:35:58 +02:00
|
|
|
if not opts.local_package:
|
|
|
|
try:
|
|
|
|
pacname = store_read_package(os.curdir)
|
|
|
|
except oscerr.NoWorkingCopy:
|
|
|
|
opts.local_package = True
|
2010-01-30 00:08:28 +01:00
|
|
|
if opts.local_package:
|
|
|
|
pacname = os.path.splitext(build_descr)[0]
|
2011-04-28 23:55:22 +02:00
|
|
|
apihost = urlparse.urlsplit(apiurl)[1]
|
2009-11-23 14:53:59 +01:00
|
|
|
if not build_root:
|
2011-03-15 18:45:36 +01:00
|
|
|
build_root = config['build-root'] % {'repo': repo, 'arch': arch,
|
|
|
|
'project': prj, 'package': pacname, 'apihost': apihost}
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2011-04-14 21:54:00 +02:00
|
|
|
cache_dir = config['packagecachedir'] % {'apihost': apihost}
|
|
|
|
|
2009-11-13 14:24:33 +01:00
|
|
|
extra_pkgs = []
|
2008-07-12 14:06:23 +02:00
|
|
|
if not opts.extra_pkgs:
|
|
|
|
extra_pkgs = config['extra-pkgs']
|
2009-11-13 14:24:33 +01:00
|
|
|
elif opts.extra_pkgs != ['']:
|
2008-07-12 14:06:23 +02:00
|
|
|
extra_pkgs = opts.extra_pkgs
|
|
|
|
|
2008-12-11 12:36:07 +01:00
|
|
|
if xp:
|
|
|
|
extra_pkgs += xp
|
|
|
|
|
2009-09-10 14:18:07 +02:00
|
|
|
prefer_pkgs = {}
|
|
|
|
build_descr_data = open(build_descr).read()
|
2009-11-24 10:49:53 +01:00
|
|
|
|
|
|
|
# XXX: dirty hack but there's no api to provide custom defines
|
|
|
|
if opts.without:
|
|
|
|
s = ''
|
|
|
|
for i in opts.without:
|
|
|
|
s += "%%define _without_%s 1\n" % i
|
|
|
|
s += "%%define _with_%s 0\n" % i
|
|
|
|
build_descr_data = s + build_descr_data
|
|
|
|
if opts._with:
|
|
|
|
s = ''
|
|
|
|
for i in opts._with:
|
|
|
|
s += "%%define _without_%s 0\n" % i
|
|
|
|
s += "%%define _with_%s 1\n" % i
|
|
|
|
build_descr_data = s + build_descr_data
|
2010-12-21 16:10:50 +01:00
|
|
|
if opts.define:
|
|
|
|
s = ''
|
|
|
|
for i in opts.define:
|
|
|
|
s += "%%define %s\n" % i
|
|
|
|
build_descr_data = s + build_descr_data
|
2009-11-24 10:49:53 +01:00
|
|
|
|
2009-09-10 14:18:07 +02:00
|
|
|
if opts.prefer_pkgs:
|
|
|
|
print 'Scanning the following dirs for local packages: %s' % ', '.join(opts.prefer_pkgs)
|
2009-09-13 01:55:56 +02:00
|
|
|
prefer_pkgs, cpio = get_prefer_pkgs(opts.prefer_pkgs, arch, build_type)
|
2009-09-10 14:18:07 +02:00
|
|
|
cpio.add(os.path.basename(build_descr), build_descr_data)
|
|
|
|
build_descr_data = cpio.get()
|
2008-12-11 12:36:07 +01:00
|
|
|
|
2010-01-09 14:25:41 +01:00
|
|
|
# special handling for overlay and rsync-src/dest
|
2010-12-07 16:07:20 +01:00
|
|
|
specialcmdopts = []
|
2010-01-09 14:25:41 +01:00
|
|
|
if opts.rsyncsrc or opts.rsyncdest :
|
|
|
|
if not opts.rsyncsrc or not opts.rsyncdest:
|
|
|
|
raise oscerr.WrongOptions('When using --rsync-{src,dest} both parameters have to be specified.')
|
|
|
|
myrsyncsrc = os.path.abspath(os.path.expanduser(os.path.expandvars(opts.rsyncsrc)))
|
|
|
|
if not os.path.isdir(myrsyncsrc):
|
|
|
|
raise oscerr.WrongOptions('--rsync-src %s is no valid directory!' % opts.rsyncsrc)
|
|
|
|
# can't check destination - its in the target chroot ;) - but we can check for sanity
|
|
|
|
myrsyncdest = os.path.expandvars(opts.rsyncdest)
|
|
|
|
if not os.path.isabs(myrsyncdest):
|
|
|
|
raise oscerr.WrongOptions('--rsync-dest %s is no absolute path (starting with \'/\')!' % opts.rsyncdest)
|
2010-12-07 16:07:20 +01:00
|
|
|
specialcmdopts = ['--rsync-src='+myrsyncsrc, '--rsync-dest='+myrsyncdest]
|
2010-01-09 14:25:41 +01:00
|
|
|
if opts.overlay:
|
|
|
|
myoverlay = os.path.abspath(os.path.expanduser(os.path.expandvars(opts.overlay)))
|
|
|
|
if not os.path.isdir(myoverlay):
|
|
|
|
raise oscerr.WrongOptions('--overlay %s is no valid directory!' % opts.overlay)
|
2010-12-07 16:07:20 +01:00
|
|
|
specialcmdopts += ['--overlay='+myoverlay]
|
2010-01-09 14:25:41 +01:00
|
|
|
|
2009-11-26 10:52:26 +01:00
|
|
|
bi_file = None
|
|
|
|
bc_file = None
|
2010-02-09 16:35:48 +01:00
|
|
|
bi_filename = '_buildinfo-%s-%s.xml' % (repo, arch)
|
|
|
|
bc_filename = '_buildconfig-%s-%s' % (repo, arch)
|
|
|
|
if is_package_dir('.') and os.access(osc.core.store, os.W_OK):
|
2009-11-26 10:52:26 +01:00
|
|
|
bi_filename = os.path.join(os.getcwd(), osc.core.store, bi_filename)
|
|
|
|
bc_filename = os.path.join(os.getcwd(), osc.core.store, bc_filename)
|
|
|
|
elif not os.access('.', os.W_OK):
|
|
|
|
bi_file = NamedTemporaryFile(prefix=bi_filename)
|
|
|
|
bi_filename = bi_file.name
|
|
|
|
bc_file = NamedTemporaryFile(prefix=bc_filename)
|
|
|
|
bc_filename = bc_file.name
|
2010-02-09 16:35:48 +01:00
|
|
|
else:
|
|
|
|
bi_filename = os.path.abspath(bi_filename)
|
|
|
|
bc_filename = os.path.abspath(bc_filename)
|
2009-11-26 10:52:26 +01:00
|
|
|
|
2007-05-09 11:36:55 +02:00
|
|
|
try:
|
2009-10-20 10:43:52 +02:00
|
|
|
if opts.noinit:
|
2009-10-24 14:13:40 +02:00
|
|
|
if not os.path.isfile(bi_filename):
|
2010-01-09 14:25:41 +01:00
|
|
|
raise oscerr.WrongOptions('--noinit is not possible, no local buildinfo file')
|
2009-10-24 14:13:40 +02:00
|
|
|
print 'Use local \'%s\' file as buildinfo' % bi_filename
|
|
|
|
if not os.path.isfile(bc_filename):
|
2010-01-09 14:25:41 +01:00
|
|
|
raise oscerr.WrongOptions('--noinit is not possible, no local buildconfig file')
|
2009-10-24 14:13:40 +02:00
|
|
|
print 'Use local \'%s\' file as buildconfig' % bc_filename
|
2010-04-17 10:53:53 +02:00
|
|
|
elif opts.offline:
|
|
|
|
if not os.path.isfile(bi_filename):
|
|
|
|
raise oscerr.WrongOptions('--offline is not possible, no local buildinfo file')
|
|
|
|
print 'Use local \'%s\' file as buildinfo' % bi_filename
|
|
|
|
if not os.path.isfile(bc_filename):
|
|
|
|
raise oscerr.WrongOptions('--offline is not possible, no local buildconfig file')
|
2009-10-20 10:43:52 +02:00
|
|
|
else:
|
2009-10-24 14:13:40 +02:00
|
|
|
print 'Getting buildinfo from server and store to %s' % bi_filename
|
2009-10-20 16:30:15 +02:00
|
|
|
bi_text = ''.join(get_buildinfo(apiurl,
|
|
|
|
prj,
|
|
|
|
pac,
|
|
|
|
repo,
|
|
|
|
arch,
|
|
|
|
specfile=build_descr_data,
|
|
|
|
addlist=extra_pkgs))
|
2011-01-20 20:54:38 +01:00
|
|
|
if not bi_file:
|
|
|
|
bi_file = open(bi_filename, 'w')
|
|
|
|
# maybe we should check for errors before saving the file
|
2009-10-20 16:30:15 +02:00
|
|
|
bi_file.write(bi_text)
|
2009-11-26 10:52:26 +01:00
|
|
|
bi_file.flush()
|
2009-10-24 14:13:40 +02:00
|
|
|
print 'Getting buildconfig from server and store to %s' % bc_filename
|
2011-01-20 20:54:38 +01:00
|
|
|
bc = get_buildconfig(apiurl, prj, repo)
|
2009-11-26 10:52:26 +01:00
|
|
|
if not bc_file:
|
|
|
|
bc_file = open(bc_filename, 'w')
|
2011-01-20 20:54:38 +01:00
|
|
|
bc_file.write(bc)
|
2009-11-26 10:52:26 +01:00
|
|
|
bc_file.flush()
|
2008-01-07 15:54:31 +01:00
|
|
|
except urllib2.HTTPError, e:
|
|
|
|
if e.code == 404:
|
2010-03-07 23:07:03 +01:00
|
|
|
# check what caused the 404
|
2008-01-07 15:54:31 +01:00
|
|
|
if meta_exists(metatype='prj', path_args=(quote_plus(prj), ),
|
2009-09-13 01:58:56 +02:00
|
|
|
template_args=None, create_new=False, apiurl=apiurl):
|
2010-03-07 23:07:03 +01:00
|
|
|
pkg_meta_e = None
|
|
|
|
try:
|
|
|
|
# take care, not to run into double trouble.
|
|
|
|
pkg_meta_e = meta_exists(metatype='pkg', path_args=(quote_plus(prj),
|
|
|
|
quote_plus(pac)), template_args=None, create_new=False,
|
|
|
|
apiurl=apiurl)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
|
2011-10-09 11:21:53 +02:00
|
|
|
if pkg_meta_e:
|
2009-11-04 23:06:38 +01:00
|
|
|
print >>sys.stderr, 'ERROR: Either wrong repo/arch as parameter or a parse error of .spec/.dsc/.kiwi file due to syntax error'
|
2008-01-07 15:54:31 +01:00
|
|
|
else:
|
|
|
|
print >>sys.stderr, 'The package \'%s\' does not exists - please ' \
|
|
|
|
'rerun with \'--local-package\'' % pac
|
|
|
|
else:
|
|
|
|
print >>sys.stderr, 'The project \'%s\' does not exists - please ' \
|
|
|
|
'rerun with \'--alternative-project <alternative_project>\'' % prj
|
2009-10-24 14:13:40 +02:00
|
|
|
sys.exit(1)
|
2008-06-12 14:12:29 +02:00
|
|
|
else:
|
|
|
|
raise
|
2007-05-09 11:36:55 +02:00
|
|
|
|
2009-10-24 14:13:40 +02:00
|
|
|
bi = Buildinfo(bi_filename, apiurl, build_type, prefer_pkgs.keys())
|
2009-12-01 14:36:11 +01:00
|
|
|
|
2010-02-18 14:36:41 +01:00
|
|
|
if bi.debuginfo and not (opts.disable_debuginfo or '--debug' in buildargs):
|
2008-10-31 16:41:19 +01:00
|
|
|
buildargs.append('--debug')
|
2009-12-01 14:36:11 +01:00
|
|
|
|
|
|
|
if opts.release:
|
|
|
|
bi.release = opts.release
|
|
|
|
|
|
|
|
if bi.release:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--release=%s' % bi.release)
|
2009-12-01 14:36:11 +01:00
|
|
|
|
2009-10-20 16:30:15 +02:00
|
|
|
# real arch of this machine
|
2008-08-15 16:04:27 +02:00
|
|
|
# vs.
|
|
|
|
# arch we are supposed to build for
|
2012-02-09 15:13:04 +01:00
|
|
|
if bi.hostarch != None:
|
2012-10-17 15:20:47 +02:00
|
|
|
if hostarch != bi.hostarch and not bi.hostarch in can_also_build.get(hostarch, []):
|
2012-02-09 15:13:04 +01:00
|
|
|
print >>sys.stderr, 'Error: hostarch \'%s\' is required.' % (bi.hostarch)
|
|
|
|
return 1
|
|
|
|
elif hostarch != bi.buildarch:
|
2008-08-15 16:04:27 +02:00
|
|
|
if not bi.buildarch in can_also_build.get(hostarch, []):
|
2012-02-09 15:13:04 +01:00
|
|
|
# OBSOLETE: qemu_can_build should not be needed anymore since OBS 2.3
|
2013-02-11 15:35:15 +01:00
|
|
|
if vm_type != "emulator" and not bi.buildarch in qemu_can_build:
|
2012-01-12 13:47:31 +01:00
|
|
|
print >>sys.stderr, 'Error: hostarch \'%s\' cannot build \'%s\'.' % (hostarch, bi.buildarch)
|
|
|
|
return 1
|
2012-02-09 15:13:04 +01:00
|
|
|
print >>sys.stderr, 'WARNING: It is guessed to build on hostarch \'%s\' for \'%s\' via QEMU.' % (hostarch, bi.buildarch)
|
2008-08-15 16:04:27 +02:00
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
rpmlist_prefers = []
|
2009-09-10 14:18:07 +02:00
|
|
|
if prefer_pkgs:
|
2007-05-02 15:49:57 +02:00
|
|
|
print 'Evaluating preferred packages'
|
2007-05-03 17:54:40 +02:00
|
|
|
for name, path in prefer_pkgs.iteritems():
|
2007-05-02 15:49:57 +02:00
|
|
|
if bi.has_dep(name):
|
2008-01-07 15:54:31 +01:00
|
|
|
# We remove a preferred package from the buildinfo, so that the
|
|
|
|
# fetcher doesn't take care about them.
|
|
|
|
# Instead, we put it in a list which is appended to the rpmlist later.
|
|
|
|
# At the same time, this will make sure that these packages are
|
|
|
|
# not verified.
|
|
|
|
bi.remove_dep(name)
|
|
|
|
rpmlist_prefers.append((name, path))
|
|
|
|
print ' - %s (%s)' % (name, path)
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
print 'Updating cache of required packages'
|
2009-02-20 10:36:20 +01:00
|
|
|
|
|
|
|
urllist = []
|
2010-01-20 09:15:17 +01:00
|
|
|
if not opts.download_api_only:
|
|
|
|
# transform 'url1, url2, url3' form into a list
|
|
|
|
if 'urllist' in config:
|
|
|
|
if type(config['urllist']) == str:
|
|
|
|
re_clist = re.compile('[, ]+')
|
|
|
|
urllist = [ i.strip() for i in re_clist.split(config['urllist'].strip()) ]
|
|
|
|
else:
|
|
|
|
urllist = config['urllist']
|
2009-04-14 13:33:45 +02:00
|
|
|
|
2010-01-20 09:15:17 +01:00
|
|
|
# OBS 1.5 and before has no downloadurl defined in buildinfo
|
|
|
|
if bi.downloadurl:
|
|
|
|
urllist.append(bi.downloadurl + '/%(extproject)s/%(extrepository)s/%(arch)s/%(filename)s')
|
2010-09-07 16:08:05 +02:00
|
|
|
if opts.disable_cpio_bulk_download:
|
2010-02-18 20:16:23 +01:00
|
|
|
urllist.append( '%(apiurl)s/build/%(project)s/%(repository)s/%(repoarch)s/%(repopackage)s/%(repofilename)s' )
|
2009-02-20 10:36:20 +01:00
|
|
|
|
2011-04-14 21:54:00 +02:00
|
|
|
fetcher = Fetcher(cache_dir,
|
2009-02-20 10:36:20 +01:00
|
|
|
urllist = urllist,
|
2008-08-20 11:45:49 +02:00
|
|
|
api_host_options = config['api_host_options'],
|
2010-04-17 15:29:03 +02:00
|
|
|
offline = opts.noinit or opts.offline,
|
2009-02-28 16:56:32 +01:00
|
|
|
http_debug = config['http_debug'],
|
2010-09-07 16:08:05 +02:00
|
|
|
enable_cpio = not opts.disable_cpio_bulk_download,
|
2009-02-28 16:56:32 +01:00
|
|
|
cookiejar=cookiejar)
|
2007-05-02 15:49:57 +02:00
|
|
|
|
2010-06-28 10:55:03 +02:00
|
|
|
# implicitly trust the project we are building for
|
|
|
|
check_trusted_projects(apiurl, [ i for i in bi.projects.keys() if not i == prj ])
|
2010-06-23 14:40:55 +02:00
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
# now update the package cache
|
|
|
|
fetcher.run(bi)
|
|
|
|
|
2010-06-24 10:51:38 +02:00
|
|
|
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]
|
|
|
|
|
2011-04-14 21:54:00 +02:00
|
|
|
destdir = os.path.join(cache_dir, data[0], data[2], data[3])
|
2010-06-24 10:51:38 +02:00
|
|
|
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):
|
2010-07-13 12:13:25 +02:00
|
|
|
shutil.rmtree(self.name)
|
2010-06-24 10:51:38 +02:00
|
|
|
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:
|
2010-12-07 16:07:20 +01:00
|
|
|
buildargs.append('--oldpackages=%s' % old_pkg_dir)
|
2010-06-24 10:51:38 +02:00
|
|
|
|
2009-06-03 13:35:03 +02:00
|
|
|
# Make packages from buildinfo available as repos for kiwi
|
2009-06-03 12:10:51 +02:00
|
|
|
if build_type == 'kiwi':
|
|
|
|
if not os.path.exists('repos'):
|
|
|
|
os.mkdir('repos')
|
|
|
|
else:
|
2010-07-13 12:13:25 +02:00
|
|
|
shutil.rmtree('repos')
|
2009-06-03 12:10:51 +02:00
|
|
|
os.mkdir('repos')
|
|
|
|
for i in bi.deps:
|
2012-11-08 09:01:19 +01:00
|
|
|
if not i.extproject:
|
|
|
|
# remove
|
|
|
|
bi.deps.remove(i)
|
|
|
|
continue
|
2009-06-03 12:10:51 +02:00
|
|
|
# project
|
|
|
|
pdir = str(i.extproject).replace(':/', ':')
|
|
|
|
# repo
|
|
|
|
rdir = str(i.extrepository).replace(':/', ':')
|
|
|
|
# arch
|
|
|
|
adir = i.repoarch
|
|
|
|
# project/repo
|
|
|
|
prdir = "repos/"+pdir+"/"+rdir
|
|
|
|
# project/repo/arch
|
|
|
|
pradir = prdir+"/"+adir
|
|
|
|
# source fullfilename
|
|
|
|
sffn = i.fullfilename
|
2012-11-08 09:01:19 +01:00
|
|
|
filename=sffn.split("/")[-1]
|
2009-06-03 12:10:51 +02:00
|
|
|
# target fullfilename
|
2012-11-08 09:01:19 +01:00
|
|
|
tffn = pradir+"/"+filename
|
2009-06-03 12:10:51 +02:00
|
|
|
if not os.path.exists(os.path.join(pradir)):
|
|
|
|
os.makedirs(os.path.join(pradir))
|
|
|
|
if not os.path.exists(tffn):
|
2012-11-08 09:01:19 +01:00
|
|
|
print "Using package: "+sffn
|
2009-12-09 06:53:27 +01:00
|
|
|
if opts.linksources:
|
2010-02-27 20:11:15 +01:00
|
|
|
os.link(sffn, tffn)
|
2009-12-09 06:53:27 +01:00
|
|
|
else:
|
2010-02-27 20:11:15 +01:00
|
|
|
os.symlink(sffn, tffn)
|
2012-11-08 09:01:19 +01:00
|
|
|
if prefer_pkgs:
|
|
|
|
for name, path in prefer_pkgs.iteritems():
|
|
|
|
if name == filename:
|
|
|
|
print "Using prefered package: " + path + "/" + filename
|
|
|
|
os.unlink(tffn)
|
|
|
|
if opts.linksources:
|
|
|
|
os.link(path + "/" + filename, tffn)
|
|
|
|
else:
|
|
|
|
os.symlink(path + "/" + filename, tffn)
|
2008-11-22 11:55:33 +01:00
|
|
|
|
2013-02-03 19:07:17 +01:00
|
|
|
if vm_type == "xen" or vm_type == "kvm" or vm_type == "lxc":
|
|
|
|
print 'Skipping verification of package signatures due to secure VM build'
|
|
|
|
elif bi.pacsuffix == 'rpm':
|
2010-06-23 14:40:55 +02:00
|
|
|
if opts.no_verify:
|
2008-01-24 19:06:45 +01:00
|
|
|
print 'Skipping verification of package signatures'
|
|
|
|
else:
|
|
|
|
print 'Verifying integrity of cached packages'
|
2010-08-04 15:14:37 +02:00
|
|
|
verify_pacs(bi)
|
2009-11-05 10:11:00 +01:00
|
|
|
elif bi.pacsuffix == 'deb':
|
2013-02-03 19:07:17 +01:00
|
|
|
if opts.no_verify or opts.noinit:
|
2009-11-06 17:08:20 +01:00
|
|
|
print 'Skipping verification of package signatures'
|
2009-11-05 10:11:00 +01:00
|
|
|
else:
|
|
|
|
print 'WARNING: deb packages get not verified, they can compromise your system !'
|
|
|
|
else:
|
2010-02-27 20:11:15 +01:00
|
|
|
print 'WARNING: unknown packages get not verified, they can compromise your system !'
|
2006-07-14 19:39:46 +02:00
|
|
|
|
|
|
|
print 'Writing build configuration'
|
|
|
|
|
2008-11-22 11:55:33 +01:00
|
|
|
rpmlist = [ '%s %s\n' % (i.name, i.fullfilename) for i in bi.deps if not i.noinstall ]
|
2007-05-02 15:49:57 +02:00
|
|
|
rpmlist += [ '%s %s\n' % (i[0], i[1]) for i in rpmlist_prefers ]
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2007-05-02 15:49:57 +02:00
|
|
|
rpmlist.append('preinstall: ' + ' '.join(bi.preinstall_list) + '\n')
|
2009-02-20 14:45:00 +01:00
|
|
|
rpmlist.append('vminstall: ' + ' '.join(bi.vminstall_list) + '\n')
|
2010-04-27 20:09:01 +02:00
|
|
|
rpmlist.append('cbinstall: ' + ' '.join(bi.cbinstall_list) + '\n')
|
|
|
|
rpmlist.append('cbpreinstall: ' + ' '.join(bi.cbpreinstall_list) + '\n')
|
2007-05-02 15:49:57 +02:00
|
|
|
rpmlist.append('runscripts: ' + ' '.join(bi.runscripts_list) + '\n')
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-10-24 14:47:21 +02:00
|
|
|
rpmlist_file = NamedTemporaryFile(prefix='rpmlist.')
|
2009-10-24 14:13:40 +02:00
|
|
|
rpmlist_filename = rpmlist_file.name
|
2007-05-02 15:49:57 +02:00
|
|
|
rpmlist_file.writelines(rpmlist)
|
2009-10-24 14:21:30 +02:00
|
|
|
rpmlist_file.flush()
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2010-03-30 11:06:56 +02:00
|
|
|
subst = { 'repo': repo, 'arch': arch, 'project' : prj, 'package' : pacname }
|
2010-12-07 16:07:20 +01:00
|
|
|
vm_options = []
|
2010-03-17 16:48:41 +01:00
|
|
|
# XXX check if build-device present
|
|
|
|
my_build_device = ''
|
|
|
|
if config['build-device']:
|
2010-03-30 11:06:56 +02:00
|
|
|
my_build_device = config['build-device'] % subst
|
|
|
|
else:
|
|
|
|
# obs worker uses /root here but that collides with the
|
|
|
|
# /root directory if the build root was used without vm
|
|
|
|
# before
|
|
|
|
my_build_device = build_root + '/img'
|
|
|
|
|
2010-03-30 11:08:54 +02:00
|
|
|
need_root = True
|
2010-04-29 14:27:07 +02:00
|
|
|
if vm_type:
|
2010-03-30 11:06:56 +02:00
|
|
|
if config['build-swap']:
|
|
|
|
my_build_swap = config['build-swap'] % subst
|
|
|
|
else:
|
|
|
|
my_build_swap = build_root + '/swap'
|
|
|
|
|
2010-12-07 16:07:20 +01:00
|
|
|
vm_options = [ '--vm-type=%s'%vm_type ]
|
2013-02-03 19:07:17 +01:00
|
|
|
if vm_type != 'lxc' and vm_type != 'emulator':
|
2010-12-07 16:07:20 +01:00
|
|
|
vm_options += [ '--vm-disk=' + my_build_device ]
|
|
|
|
vm_options += [ '--vm-swap=' + my_build_swap ]
|
|
|
|
vm_options += [ '--logfile=%s/.build.log' % build_root ]
|
2010-04-29 14:27:07 +02:00
|
|
|
if vm_type == 'kvm':
|
2010-03-30 11:08:54 +02:00
|
|
|
if os.access(build_root, os.W_OK) and os.access('/dev/kvm', os.W_OK):
|
|
|
|
# so let's hope there's also an fstab entry
|
|
|
|
need_root = False
|
2010-03-30 11:06:56 +02:00
|
|
|
build_root += '/.mount'
|
2010-03-17 16:48:41 +01:00
|
|
|
|
2009-10-20 16:30:15 +02:00
|
|
|
if config['build-memory']:
|
2010-12-07 16:07:20 +01:00
|
|
|
vm_options += [ '--memory=' + config['build-memory'] ]
|
2010-03-30 11:06:56 +02:00
|
|
|
if config['build-vmdisk-rootsize']:
|
2010-12-07 16:07:20 +01:00
|
|
|
vm_options += [ '--vmdisk-rootsize=' + config['build-vmdisk-rootsize'] ]
|
2010-03-30 11:06:56 +02:00
|
|
|
if config['build-vmdisk-swapsize']:
|
2010-12-07 16:07:20 +01:00
|
|
|
vm_options += [ '--vmdisk-swapsize=' + config['build-vmdisk-swapsize'] ]
|
2012-02-04 17:02:18 +01:00
|
|
|
if config['build-vmdisk-filesystem']:
|
|
|
|
vm_options += [ '--vmdisk-filesystem=' + config['build-vmdisk-filesystem'] ]
|
|
|
|
|
2009-10-20 16:30:15 +02:00
|
|
|
|
2010-04-17 10:53:53 +02:00
|
|
|
if opts.preload:
|
|
|
|
print "Preload done for selected repo/arch."
|
|
|
|
sys.exit(0)
|
|
|
|
|
2006-07-14 19:39:46 +02:00
|
|
|
print 'Running build'
|
2010-12-07 16:07:20 +01:00
|
|
|
cmd = [ config['build-cmd'], '--root='+build_root,
|
|
|
|
'--rpmlist='+rpmlist_filename,
|
|
|
|
'--dist='+bc_filename,
|
|
|
|
'--arch='+bi.buildarch ]
|
|
|
|
cmd += specialcmdopts + vm_options + buildargs
|
|
|
|
cmd += [ build_descr ]
|
2010-03-30 11:06:56 +02:00
|
|
|
|
2010-03-30 11:08:54 +02:00
|
|
|
if need_root:
|
2010-12-07 16:07:20 +01:00
|
|
|
sucmd = config['su-wrapper'].split()
|
|
|
|
if sucmd[0] == 'su':
|
2010-12-31 16:56:35 +01:00
|
|
|
if sucmd[-1] == '-c':
|
|
|
|
sucmd.pop()
|
2010-12-07 16:07:20 +01:00
|
|
|
cmd = sucmd + ['-s', cmd[0], 'root', '--' ] + cmd[1:]
|
2010-03-30 11:08:54 +02:00
|
|
|
else:
|
2010-12-07 16:07:20 +01:00
|
|
|
cmd = sucmd + cmd
|
2008-11-22 17:38:40 +01:00
|
|
|
|
2008-08-15 16:04:27 +02:00
|
|
|
# change personality, if needed
|
2010-12-07 16:07:20 +01:00
|
|
|
if hostarch != bi.buildarch and bi.buildarch in change_personality:
|
|
|
|
cmd = [ change_personality[bi.buildarch] ] + cmd;
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2010-06-24 10:51:55 +02:00
|
|
|
try:
|
2010-12-07 16:07:20 +01:00
|
|
|
rc = subprocess.call(cmd)
|
2010-06-24 10:51:55 +02:00
|
|
|
if rc:
|
|
|
|
print
|
|
|
|
print 'The buildroot was:', build_root
|
|
|
|
sys.exit(rc)
|
|
|
|
except KeyboardInterrupt, i:
|
|
|
|
print "keyboard interrupt, killing build ..."
|
2010-12-07 16:07:20 +01:00
|
|
|
subprocess.call(cmd + ["--kill"])
|
2010-06-24 10:51:55 +02:00
|
|
|
raise i
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-11-23 14:53:59 +01:00
|
|
|
pacdir = os.path.join(build_root, '.build.packages')
|
2009-04-20 15:07:43 +02:00
|
|
|
if os.path.islink(pacdir):
|
|
|
|
pacdir = os.readlink(pacdir)
|
2009-11-23 14:53:59 +01:00
|
|
|
pacdir = os.path.join(build_root, pacdir)
|
2006-07-14 20:31:35 +02:00
|
|
|
|
2009-04-20 15:07:43 +02:00
|
|
|
if os.path.exists(pacdir):
|
|
|
|
(s_built, b_built) = get_built_files(pacdir, bi.pacsuffix)
|
2009-10-20 16:30:15 +02:00
|
|
|
|
2009-04-20 15:07:43 +02:00
|
|
|
print
|
|
|
|
if s_built: print s_built
|
|
|
|
print
|
|
|
|
print b_built
|
2006-07-14 19:39:46 +02:00
|
|
|
|
2009-04-20 15:07:43 +02:00
|
|
|
if opts.keep_pkgs:
|
|
|
|
for i in b_built.splitlines() + s_built.splitlines():
|
|
|
|
shutil.copy2(i, os.path.join(opts.keep_pkgs, os.path.basename(i)))
|
2009-11-26 10:52:26 +01:00
|
|
|
|
|
|
|
if bi_file:
|
|
|
|
bi_file.close()
|
|
|
|
if bc_file:
|
|
|
|
bc_file.close()
|
|
|
|
rpmlist_file.close()
|
2010-02-25 09:52:47 +01:00
|
|
|
|
|
|
|
# vim: sw=4 et
|