X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=runner%2Fadt-run;h=47036edbc912f9cb8703b79363cfdb2b2d6270c7;hb=0d693f4a2c42db70ba563a2b1100aa2744e23492;hp=25529884af9a0676379b21d71749214b7ca95c3a;hpb=363bf8a19ae0c5d1090664708d577b3ac618a6f7;p=autopkgtest.git diff --git a/runner/adt-run b/runner/adt-run index 2552988..47036ed 100755 --- a/runner/adt-run +++ b/runner/adt-run @@ -1,4 +1,4 @@ -#!/usr/bin/python2.4 +#!/usr/bin/python2.6 # # adt-run is part of autopkgtest # autopkgtest is a tool for testing Debian binary packages @@ -40,14 +40,23 @@ import copy from optparse import OptionParser signal.signal(signal.SIGINT, signal.SIG_DFL) # undo stupid Python SIGINT thing +try: our_base = os.environ['AUTOPKGTEST_BASE']+'/lib' +except KeyError: our_base = '/usr/share/autopkgtest/python'; +sys.path.insert(1, our_base) + +from Autopkgtest import * + #---------- global variables -tmpdir = None # pathstring on host +tmp = None # pathstring on host testbed = None # Testbed errorcode = 0 # exit status that we are going to use -timeouts = { 'short':10, 'install':900, 'test':600, 'build':3000 } +timeouts = { 'short':100, 'install':3000, 'test':10000, 'build':100000 } binaries = None # Binaries (.debs we have registered) build_essential = ["build-essential"] +paths = [] +os.putenv("APT_LISTBUGS_FRONTEND", "none") # do not consider using apt-listbugs +os.putenv("APT_LISTCHANGES_FRONTEND", "none") # do not consider using apt-listchanges #---------- output handling # @@ -188,7 +197,9 @@ def mkdir_okexist(pathname, mode=02755): def rmtree(what, pathname): debug('/ %s rmtree %s' % (what, pathname), 2) - shutil.rmtree(pathname) + try: shutil.rmtree(pathname) + except (IOError,OSError), oe: + if oe.errno != errno.EEXIST: raise def debug_subprocess(what, cmdl=None, script=None): o = '$ '+what+':' @@ -215,6 +226,7 @@ class AutoFile: # p.what # p.path[tb] None or path not None => path known # p.file[tb] None or path not None => file exists + # p.ephem[tb] boolean True => destroyed by tb reset # p.spec string or None # p.spec_tbp True or False, or not set if spec is None # p.dir '' or '/' @@ -223,7 +235,9 @@ class AutoFile: p.what = what p.path = [None,None] p.file = [None,None] + p.ephem = [False,False] p.spec = None + p.spec_tbp = None p.dir = '' def __repr__(p): @@ -249,7 +263,7 @@ class AutoFile: xtra = '' if p.spec is not None: xtra = ' spec[%s]=%s' % (p.spec, getattr(p,'spec_tb',None)) - raise ("internal error: %s (%s)" % (how, str(p))) + raise Exception("internal error: %s (%s)" % (how, str(p))) def _ensure_path(p, tbp): if p.path[tbp] is None: @@ -257,8 +271,9 @@ class AutoFile: p._debug('tmp-parent %s...' % 'HT'[tbp]) TemporaryDir(os.path.dirname(p.what)).write(tbp) if not tbp: - p.path[tbp] = tmpdir+'/'+p.what + p.path[tbp] = tmp+'/'+p.what else: + p.ephem[tbp] = True p.path[tbp] = testbed.scratch.path[True]+'/'+p.what def write(p, tbp=False): @@ -297,8 +312,15 @@ class AutoFile: return p.file[tbp] + p.dir def invalidate(p, tbp=False): + if p.path[tbp] is not None: + p._debug('invalidating %s' % 'HT'[tbp]) p.file[tbp] = None - p._debug('invalidated %s' % 'HT'[tbp]) + if p.spec_tbp != tbp or p.spec is None: + p.path[tbp] = None + + def invalidate_ephem(p, tbp=False): + if p.ephem[tbp]: + p.invalidate(tbp) def _debug(p, m): debug('/ %s#%x: %s' % (p.what, id(p), m), 3) @@ -306,6 +328,7 @@ class AutoFile: def _constructed(p): p._debug('constructed: '+str(p)) p._check() + paths.append(p) def _check(p): for tbp in [False,True]: @@ -331,6 +354,7 @@ class AutoFile: if sibling: trim = os.path.dirname else: trim = lambda x: x for tbp in [False,True]: + p.ephem[tbp] = parent.ephem[tbp] if parent.path[tbp] is None: continue trimmed = trim(parent.path[tbp]) if trimmed: trimmed += '/' @@ -371,6 +395,12 @@ class OutputDir(OutputFile): p.dir = '/' p._constructed() +class RelativeInputDir(AutoFile): + def __init__(p, what, parent, leaf, onlyon_tbp=None, sibling=False): + p._relative_init(what, parent, leaf, onlyon_tbp, True, sibling) + p.dir = '/' + p._constructed() + class RelativeInputFile(AutoFile): def __init__(p, what, parent, leaf, onlyon_tbp=None, sibling=False): p._relative_init(what, parent, leaf, onlyon_tbp, True, sibling) @@ -406,7 +436,7 @@ class Action: return "" % (a.kind, a.what, `a.af`) def parse_args(): - global opts + global opts, timeouts global n_non_actions # argh, stupid python scoping rules usage = "%prog --- ..." parser = OptionParser(usage=usage) @@ -419,7 +449,8 @@ def parse_args(): 'deb_forbuilds': 'auto', 'deb_fortests': 'auto', 'tb': False, - 'override_control': None + 'override_control': None, + 'set_lang': 'C' } initial_arghandling = arghandling.copy() n_non_actions = 0 @@ -507,7 +538,6 @@ def parse_args(): ' according to most recent --binaries-* settings') pa_setah('--no-built-binaries', ['dsc_filter'], '_', help='from subsequent sources, do not use any binaries') - #---- binary package processing settings: def pa_setahbins(long,toset,how): @@ -541,8 +571,13 @@ def parse_args(): pa_path('output-dir', OutputDir, dir=True, help='write stderr/out files in PATH') - pa('','--tmp-dir', type='string', dest='tmpdir', - help='write temporary files to TMPDIR, emptying it' + pa('--leave-lang', dest='set_lang', action='store_false', + help="leave LANG on testbed set to testbed's default") + pa('--set-lang', dest='set_lang', action='store', metavar='LANGVAL', + help='set LANG on testbed to LANGVAL', default='C') + + pa('','--tmp-dir', type='string', dest='tmp', + help='write temporary files to TMP, emptying it' ' beforehand and leaving it behind at the end') pa('','--log-file', type='string', dest='logfile', help='write the log LOGFILE, emptying it beforehand,' @@ -551,11 +586,18 @@ def parse_args(): help='write a summary report to SUMMARY,' ' emptying it beforehand') + for k in timeouts.keys(): + pa('','--timeout-'+k, type='int', dest='timeout_'+k, + metavar='T', help='set %s timeout to T') + pa('','--timeout-factor', type='float', dest='timeout_factor', + metavar='FACTOR', default=1.0, + help='multiply all default timeouts by FACTOR') + pa('','--user', type='string', dest='user', help='run tests as USER (needs root on testbed)') pa('','--gain-root', type='string', dest='gainroot', help='prefix debian/rules binary with GAINROOT') - pa('-q', '--quiet', action='store_false', dest='quiet', default=False); + pa('-q', '--quiet', action='store_true', dest='quiet', default=False); pa('-d', '--debug', action='count', dest='debuglevel', default=0); pa('','--gnupg-home', type='string', dest='gnupghome', default='~/.autopkgtest/gpg', @@ -587,6 +629,11 @@ def parse_args(): if n_non_actions >= len(parser.largs): parser.error('nothing to do specified') + for k in timeouts.keys(): + t = getattr(opts,'timeout_'+k) + if t is None: t = timeouts[k] * opts.timeout_factor + timeouts[k] = int(t) + arghandling = initial_arghandling opts.actions = [] ix = 0 @@ -599,7 +646,7 @@ def parse_args(): elif type(act) == str: act = (act,act) else: - raise ("unknown action in list `%s' having" + raise Exception("unknown action in list `%s' having" " type `%s'" % (act, type(act))) (pathstr, kindpath) = act @@ -627,27 +674,27 @@ def parse_args(): opts.actions.append(Action(kind, af, arghandling, what)) def setup_trace(): - global trace_stream, tmpdir, summary_stream + global trace_stream, tmp, summary_stream - if opts.tmpdir is not None: - rmtree('tmpdir(specified)',opts.tmpdir) - mkdir_okexist(opts.tmpdir, 0700) - tmpdir = opts.tmpdir + if opts.tmp is not None: + rmtree('tmp(specified)',opts.tmp) + mkdir_okexist(opts.tmp, 0700) + tmp = opts.tmp else: - assert(tmpdir is None) - tmpdir = tempfile.mkdtemp() + assert(tmp is None) + tmp = tempfile.mkdtemp() if opts.logfile is None: if opts.output_dir is not None and opts.output_dir.spec_tbp: opts.logfile = opts.output_dir.spec + '/log' - elif opts.tmpdir is not None: - opts.logfile = opts.tmpdir + '/log' + elif opts.tmp is not None: + opts.logfile = opts.tmp + '/log' if opts.logfile is not None: trace_stream = open(opts.logfile, 'w', 0) if opts.summary is not None: summary_stream = open(opts.summary, 'w', 0) - debug('options: '+`opts`, 1) + debug('options: '+`opts`+'; timeouts: '+`timeouts`, 1) def finalise_options(): global opts, tb, build_essential @@ -702,7 +749,6 @@ class Testbed: tb.scratch = None tb.modified = False tb.blamed = [] - tb._ephemeral = [] tb._debug('init') tb._need_reset_apt = False def _debug(tb, m, minlevel=0): @@ -733,8 +779,32 @@ class Testbed: tb._debug('open, scratch=%s' % tb.scratch) if tb.scratch is not None: return pl = tb.commandr('open') + tb._opened(pl) + def _opened(tb, pl): tb.scratch = InputDir('tb-scratch', pl[0], True) tb.deps_processed = [] + for af in paths: af.invalidate_ephem(True) + tb._auxverbscript_make() + def _auxverbscript_make(tb): + pec = tb.commandr('print-auxverb-command') + if len(pec) < 1: tb.bomb('too few results from print-execute-command') + cmdl = map(urllib.unquote, pec[0].split(',')) + + tb._debug('cmdl = %s' % (`cmdl`)) + + tb.ec_auxverbscript = TemporaryFile('satdep-auxverb') + print >>open(tb.ec_auxverbscript.write(),'w'), ( +'''#!/bin/sh +set -e +if [ $# = 2 ] && [ "x$1" = xdpkg-architecture ] && [ "x$2" = x-qDEB_HOST_ARCH ]; then + # This is a pretty nasty hack. Hopefully it can go away + # eventually. See #635763. + set -- dpkg --print-architecture +fi +exec '''+shellquote_cmdl(cmdl)+' "$@"'+"\n" + ) + os.chmod(tb.ec_auxverbscript.write(), 0755) + def mungeing_apt(tb): if not 'revert' in tb.caps: tb._need_reset_apt = True @@ -746,6 +816,14 @@ class Testbed: if rc: pstderr("\n" "warning: failed to restore" " testbed apt cache, exit code %d" % rc) + what = 'aptconf-reset' + cmdl = ['rm','-f','/etc/apt/apt.conf.d/90autopkgtest', + '/etc/apt/sources.list.d/autopkgtest.list', + '/etc/apt/preferences.d/90autopkgtest'] + rc = tb.execute(what, cmdl, kind='install') + if rc: + pstderr("\n" "warning: failed to reset changes" + " made to testbed apt configuration, exit code %d" % rc) tb._need_reset_apt = False def close(tb): tb._debug('close, scratch=%s' % tb.scratch) @@ -758,11 +836,10 @@ class Testbed: (tb.modified, tb.deps_processed, deps_new), 1) if 'revert' in tb.caps and (tb.modified or [d for d in tb.deps_processed if d not in deps_new]): - for af in tb._ephemeral: af.read(False) + for af in paths: af.read(False) tb._debug('reset **') - tb.command('revert') - tb.blamed = [] - for af in tb._ephemeral: af.invalidate(True) + pl = tb.commandr('revert') + tb._opened(pl) tb.modified = False def prepare2(tb, deps_new): tb._debug('prepare2, deps_new=%s' % deps_new, 1) @@ -771,24 +848,11 @@ class Testbed: def prepare(tb, deps_new): tb.prepare1(deps_new) tb.prepare2(deps_new) - def register_ephemeral(tb, af): - tb._ephemeral.append(af) def _install_deps(tb, deps_new): tb._debug(' installing dependencies '+`deps_new`, 1) tb.deps_processed = deps_new if not deps_new: return - dstr = ', '.join(deps_new) - script = binaries.apt_pkg_gdebi_script( - dstr, [[ - 'from GDebi.DebPackage import DebPackage', - 'd = DebPackage(cache)', - 'res = d.satisfyDependsStr(arg)', - ]]) - cmdl = ['python','-c',script] - what = 'install-deps' - rc = testbed.execute(what+'-debinstall', cmdl, script=script, - kind='install') - if rc: badpkg('dependency install failed, exit code %d' % rc) + tb.satisfy_dependencies_string(', '.join(deps_new), 'install-deps') def needs_reset(tb): tb._debug('needs_reset, previously=%s' % tb.modified, 1) tb.modified = True @@ -835,9 +899,9 @@ class Testbed: if nresults is not None and len(ll) != nresults: tb.bomb("sent `%s', got `%s' (%d result parameters)," " expected %d result parameters" % - (string, l, len(ll), nresults)) + (tb.lastsend, l, len(ll), nresults)) return ll - def commandr(tb, cmd, args=(), nresults=None): + def commandr(tb, cmd, args=(), nresults=None, unquote=True): # pass args=[None,...] or =(None,...) to avoid more url quoting if type(cmd) is str: cmd = [cmd] if len(args) and args[0] is None: args = args[1:] @@ -845,8 +909,8 @@ class Testbed: al = cmd + args tb.send(string.join(al)) ll = tb.expect('ok', nresults) - rl = map(urllib.unquote, ll) - return rl + if unquote: ll = map(urllib.unquote, ll) + return ll def command(tb, cmd, args=()): tb.commandr(cmd, args, 0) def commandr1(tb, cmd, args=()): @@ -854,7 +918,7 @@ class Testbed: return rl[0] def execute(tb, what, cmdl, si='/dev/null', so='/dev/null', se=None, cwd=None, - script=False, tmpdir=None, kind='short'): + script=False, xenv=[], kind='short'): # Options for script: # False - do not call debug_subprocess, no synch. reporting required # None or string - call debug_subprocess with that value, @@ -889,8 +953,10 @@ class Testbed: cmdl.append('timeout=%d' % timeout) if xdump is not None and 'execute-debug' in tb.caps: cmdl += [xdump] - if tmpdir is not None: cmdl.append('env=TMPDIR=%s' % tmpdir) + for e in xenv: cmdl.append('env=%s' % e) if kind=='install': cmdl.append('env=DEBIAN_FRONTEND=noninteractive') + if opts.set_lang is not False: + cmdl.append('env=LANG=%s' % opts.set_lang) rc = tb.commandr1('execute', cmdl) try: rc = int(rc) @@ -904,6 +970,28 @@ class Testbed: return rc + def satisfy_dependencies_string(tb, deps, what): + # Must have called Binaries.configure_apt + debug('dependencies: %s: satisfying %s' % (what,deps)) + dsc = TemporaryFile('deps.dsc') + print >>open(dsc.write(),'w'), 'Build-Depends: ', deps, '\n\n' + # pbuilder-satisfydepends has a bug where it ignores the + # Build-Depends if it's the last line in the dsc (#635696) + tb.satisfy_dependencies_dsc(dsc, what) + + def satisfy_dependencies_dsc(tb, dsc, what): + # Must have called Binaries.configure_apt + cmdl = [ '/usr/lib/pbuilder/pbuilder-satisfydepends-classic', + '--binary-all', # --check-key + '--internal-chrootexec',tb.ec_auxverbscript.read(), + '-c',dsc.read() + ] + # The --internal-chrootexec option is really handy but + # perhaps we are not supposed to use it ? See also #635697. + debug('dependencies: %s: running %s' % (what,`cmdl`)) + rc = subprocess.call(cmdl, stdout=None, stderr=None) + if rc: badpkg('dependency install failed, exit code %d' % rc) + #---------- representation of test control files: Field*, Test, etc. class FieldBase: @@ -935,15 +1023,16 @@ class Restriction: def __init__(r,rname,base): pass class Restriction_rw_build_tree(Restriction): pass +class Restriction_build_needed(Restriction): pass class Restriction_breaks_testbed(Restriction): def __init__(r, rname, base): - if 'revert' not in testbed.caps: - raise Unsupported(f.lno, - 'Test breaks testbed but testbed cannot revert') + if 'revert-full-system' not in testbed.caps: + raise Unsupported(-1, + 'Test breaks testbed but testbed does not advertise revert-full-system') class Restriction_needs_root(Restriction): def __init__(r, rname, base): if 'root-on-testbed' not in testbed.caps: - raise Unsupported(f.lno, + raise Unsupported(-1, 'Test needs root on testbed which is not available') class Field_Restrictions(FieldBase): @@ -973,7 +1062,7 @@ class Field_Tests(FieldIgnore): pass class Field_Depends(FieldBase): def parse(f): - print >>sys.stderr, "Field_Depends:", `f.stz`, `f.base`, `f.tnames`, `f.vl` + debug("Field_DependS: %s %s %s %s" % (f.stz, f.base, f.tnames, f.vl), 2) dl = map(lambda x: x.strip(), flatten(map(lambda (lno, v): v.split(','), f.vl))) re = regexp.compile('[^-.+:~0-9a-z()<>=*@]') @@ -1037,9 +1126,9 @@ class Test: dn.append(d) else: for (pkg,bin) in t.act.binaries: - d = d.replace('@',pkg) - t._debug(' synthesised dependency '+d) - dn.append(d) + dp = d.replace('@',pkg) + t._debug(' synthesised dependency '+dp) + dn.append(dp) testbed.prepare(dn) def run(t, tree): t._debug('[----------------------------------------') @@ -1059,28 +1148,30 @@ class Test: se = stdouterr('stderr') tf = af.read(True) - tmpdir = None + xenv = [] rc = testbed.execute('testchmod-'+t.what, ['chmod','+x','--',tf]) if rc: bomb('failed to chmod +x %s' % tf) if 'needs-root' not in t.restriction_names and opts.user is not None: tfl = ['su',opts.user,'-c',tf] - tmpdir = '%s%s-tmpdir' % (testbed.scratch.read(True), t.what) + testtmp = '%s%s-testtmp' % (testbed.scratch.read(True), t.what) script = 'rm -rf -- "$1"; mkdir -- "$1"' - if opts.user: script += '; chown %s "$1"' % opts.user - if 'rw-build-tree' in t.restriction_names: - script += '; chown -R %s "$2"' % opts.user + if opts.user: + script += '; chown %s "$1"' % opts.user + if 'rw-build-tree' in t.restriction_names: + script += '; chown -R %s "$2"' % opts.user + xenv.append('TMPDIR=%s' % testtmp) rc = testbed.execute('mktmpdir-'+t.what, - ['sh','-xec',script,'x',tmpdir,tree.read(True)]) - if rc: bomb("could not create test tmpdir `%s', exit code %d" - % (tmpdir, rc)) + ['sh','-xec',script,'x',xenv=xenv,tree.read(True)]) + if rc: bomb("could not create test tmp `%s', exit code %d" + % (testtmp, rc)) else: tfl = [tf] rc = testbed.execute('test-'+t.what, tfl, so=so.write(True), se=se.write(True), cwd=tree.read(True), - tmpdir=tmpdir, kind='test') + xenv=xenv, kind='test') so_read = so.read() se_read = se.read() @@ -1124,19 +1215,22 @@ def read_control(act, tree, control_override): return [] lno = 0 - def badctrl(m): act.bomb('tests/control line %d: %s' % (lno, m)) - stz = None # stz[field_name][index] = (lno, value) + def badctrl(m): testbed.bomb('tests/control line %d: %s' % (lno, m)) + stz = { } # stz[field_name][index] = (lno, value) # special field names: # stz[' lno'] = number # stz[' tests'] = list of Test objects + # empty dictionary means we're between stanzas + def in_stanza(stz): + return stz.has_key(' lno') def end_stanza(stz): - if stz is None: return + if not in_stanza(stz): return stz[' errs'] = 0 - stanzas.append(stz) - stz = None + stanzas.append(stz.copy()) + stz.clear() hcurrent = None - initre = regexp.compile('([A-Z][-0-9a-z]*)\s*\:\s*(.*)$') + initre = regexp.compile('([A-Z][-0-9a-zA-Z]*)\s*\:\s*(.*)$') while 1: l = control.readline() if not l: break @@ -1148,7 +1242,7 @@ def read_control(act, tree, control_override): if initmat: (fname, l) = initmat.groups() fname = string.capwords(fname) - if stz is None: + if not in_stanza(stz): stz = { ' lno': lno, ' tests': [] } if not stz.has_key(fname): stz[fname] = [ ] hcurrent = stz[fname] @@ -1219,8 +1313,8 @@ def cleanup(): if testbed is not None: testbed.reset_apt() testbed.stop() - if opts.tmpdir is None and tmpdir is not None: - rmtree('tmpdir', tmpdir) + if opts.tmp is None and tmp is not None: + rmtree('tmp', tmp) if trace_stream is not None: trace_stream.close() trace_stream = None @@ -1245,13 +1339,13 @@ def determine_package(act): if not act.pkg: badpkg('no good Package: line in control file') class Binaries: - def __init__(b): + def __init__(b, tb): b.dir = TemporaryDir('binaries') b.dir.write() ok = False if opts.gnupghome is None: - opts.gnupghome = tmpdir+'/gnupg' + opts.gnupghome = tmp+'/gnupg' b._debug('initialising') try: @@ -1293,37 +1387,32 @@ END def apt_configs(b): return { - "Dir::Etc::sourcelist": b.dir.read(True)+'sources.list', + "Debug::pkgProblemResolver": "true", + "APT::Get::force-yes" : "true", + "APT::Get::Assume-Yes" : "true", + "quiet" : "true", } - def apt_pkg_gdebi_script(b, arg, middle): - script = [ - 'import apt_pkg', - 'import urllib', - 'arg = urllib.unquote("%s")' % urllib.quote(arg), - ] + def _configure_apt(b, tb): + config = OutputFile('apt-config','/etc/apt/apt.conf.d/90autopkgtest', + True) + f = open(config.write(),'w') for (k,v) in b.apt_configs().iteritems(): - v = urllib.quote(v) - script.append('apt_pkg.Config.Set("%s",urllib.unquote("%s"))' - % (k, v)) - script += [ - 'from GDebi.Cache import Cache', - 'cache = Cache()', - ] - for m in middle: - script += m + [ - 'print res', - 'print d.missingDeps', - 'print d.requiredChanges', - 'if not res: raise "gdebi failed (%s, %s, %s): %s" % '+ - ' (`res`, `d.missingDeps`, `d.requiredChanges`, '+ - 'd._failureString)', - 'cache.commit()', - '' - ] - return '\n'.join(script) - def apt_get(b): - ag = ['apt-get','-qy'] + print >>f, '%s { "%s"; };' % (k, v) + f.close() + config.read(True) + + prefs = OutputFile('apt-prefs','/etc/apt/preferences.d/90autopkgtest', + True) + print >>open(prefs.write(),'w'), ''' +Package: * +Pin: origin "" +Pin-Priority: 1002 +''' + prefs.read(True) + + def _apt_get(b): + ag = ['apt-get','-q'] for kv in b.apt_configs().iteritems(): ag += ['-o', '%s=%s' % kv] return ' '.join(ag) @@ -1365,6 +1454,8 @@ END def publish(b): b._debug('publish') + b._configure_apt(testbed) + script = ''' exec >&2 cd "$1" @@ -1386,12 +1477,11 @@ END script = ''' exec 3>&1 >&2 apt-key add archive-key.pgp - echo "deb file://'''+apt_source+''' /" >sources.list - cat /etc/apt/sources.list >>sources.list + echo "deb file://'''+apt_source+''' /" >/etc/apt/sources.list.d/autopkgtest.list if [ "x`ls /var/lib/dpkg/updates`" != x ]; then echo >&2 "/var/lib/dpkg/updates contains some files, aargh"; exit 1 fi - '''+ b.apt_get() +''' update >&2 + '''+ b._apt_get() +''' update >&2 cat /var/lib/dpkg/status >&3 ''' testbed.mungeing_apt() @@ -1416,7 +1506,7 @@ END if pkgs_reinstall: for pkg in pkgs_reinstall: testbed.blame(pkg) what = 'apt-get-reinstall' - cmdl = (b.apt_get() + ' --reinstall install '+ + cmdl = (b._apt_get() + ' --reinstall install '+ ' '.join([pkg for pkg in pkgs_reinstall])+' >&2') cmdl = ['sh','-c',cmdl] rc = testbed.execute(what, cmdl, script=None, kind='install') @@ -1427,7 +1517,7 @@ END for pkg in b.install: what = 'apt-get-install-%s' % pkg testbed.blame(pkg) - cmdl = b.apt_get() + ' install ' + pkg + ' >&2' + cmdl = b._apt_get() + ' install ' + pkg + ' >&2' cmdl = ['sh','-c',cmdl] rc = testbed.execute(what, cmdl, script=None, kind='install') if rc: badpkg("installation of %s failed, exit code %d" @@ -1508,15 +1598,8 @@ def build_source(act, control_override): if act.kind == 'dsc': testbed.prepare2([]) - script = binaries.apt_pkg_gdebi_script('', [[ - 'from GDebi.DebPackage import DebPackage', - 'd = DebPackage(cache)', - 'res = d.satisfyDependsStr("dpkg-dev")', - ]]) - cmdl = ['python','-c',script] - whatp = what+'-dpkgsource' - rc = testbed.execute(what, cmdl, script=script, kind='install') - if rc: badpkg('dpkg-source install failed, exit code %d' % rc) + testbed.satisfy_dependencies_string('dpkg-dev', + 'install dpkg-dev') work = TemporaryDir(what+'-build') act.work = work @@ -1561,7 +1644,7 @@ def build_source(act, control_override): [ create_command ]) script += [ - 'cd */.', + 'cd [a-z0-9]*-*/.', 'pwd >&3', 'set +e; test -f debian/tests/control; echo $? >&3' ] @@ -1596,12 +1679,8 @@ def build_source(act, control_override): stanzas = read_control(act, result_pwd_af, control_override) for stanza in stanzas: for t in stanza[' tests']: - if 'no-build-needed' not in t.feature_names: + if 'build-needed' in t.restriction_names: build_needed('test %s' % t.tname) - for d in t.depends: - if '@' in d: - build_needed('test %s ' - 'dependency %s' % (t.tname,d)) debug_b('build not needed') built = False @@ -1611,24 +1690,9 @@ def build_source(act, control_override): if act.kind != 'dsc': testbed.prepare2([]) - script = binaries.apt_pkg_gdebi_script( - dsc.read(True), [[ - 'from GDebi.DscSrcPackage import DscSrcPackage', - 'd = DscSrcPackage(cache, arg)', - 'res = d.checkDeb()', - ],[ - 'from GDebi.DebPackage import DebPackage', - 'd = DebPackage(cache)', - 'res = d.satisfyDependsStr("'+ - ','.join(build_essential)+ - '")', - ]]) - - cmdl = ['python','-c',script] - whatp = what+'-builddeps' - rc = testbed.execute(what, cmdl, script=script, kind='install') - if rc: badpkg('build-depends install failed,' - ' exit code %d' % rc) + testbed.satisfy_dependencies_string('build-essential', + 'install build-essential') + testbed.satisfy_dependencies_dsc(dsc, 'build dependencies') script = tmpdir_script + [ 'cd "$2"', @@ -1644,12 +1708,9 @@ def build_source(act, control_override): built = True - act.tests_tree = InputDir(what+'-tests-tree', - work.read(True)+os.path.basename(result_pwd), + act.tests_tree = RelativeInputDir(what+'-tests-tree', + work, os.path.basename(result_pwd), True) - if act.ah['dsc_tests']: - testbed.register_ephemeral(act.work) - testbed.register_ephemeral(act.tests_tree) if not built: act.blamed = [] @@ -1660,7 +1721,7 @@ def build_source(act, control_override): debug_b('filter=%s' % filter) if filter != '_': script = tmpdir_script + [ - 'cd '+work.write(True)+'/*/.', + 'cd '+work.write(True)+'/[a-z0-9]*-*/.', opts.user_wrap(opts.gainroot+' debian/rules binary'), 'cd ..', 'echo *.deb >&3', @@ -1668,7 +1729,7 @@ def build_source(act, control_override): result_debs = source_rules_command(act,script,what, 'binary',work,work.write(True), results_lines=1, xargs=['x',tmpdir]) - if result_debs == '*': debs = [] + if result_debs == '*.deb': debs = [] else: debs = result_debs.split(' ') debug_b('debs='+`debs`) re = regexp.compile('^([-+.0-9a-z]+)_[^_/]+(?:_[^_/]+)\.deb$') @@ -1703,11 +1764,7 @@ def process_actions(): debug_a1('starting') testbed.open() - binaries = Binaries() - - for act in opts.actions: - if act.af is not None and not act.af.spec_tbp: - testbed.register_ephemeral(act.af) + binaries = Binaries(testbed) binaries.reset() control_override = None @@ -1774,7 +1831,7 @@ def process_actions(): def main(): global testbed - global tmpdir + global tmp try: parse_args() except SystemExit, se: