+#---------- registration, installation etc. of .deb's: Binaries
+
+def determine_package(act):
+ cmd = 'dpkg-deb --info --'.split(' ')+[act.path.read(),'control']
+ running = Popen(cmd, stdout=PIPE)
+ output = running.communicate()[0]
+ rc = running.wait()
+ if rc: badpkg('failed to parse binary package, code %d' % rc)
+ re = regexp.compile('^\s*Package\s*:\s*([0-9a-z][-+.0-9a-z]*)\s*$')
+ act.pkg = None
+ for l in '\n'.split(output):
+ m = re.match(output)
+ if not m: continue
+ if act.pkg: badpkg('two Package: lines in control file')
+ act.pkg = m.groups
+ if not act.pkg: badpkg('no good Package: line in control file')
+
+class Binaries:
+ def __init__(b):
+ b.dir = tmpdir+'/binaries'
+
+ if opts.gnupghome is None:
+ opts.gnupghome = tmpdir+'/gnupg'
+
+ try:
+ for x in ['pubring','secring']:
+ os.stat(opts.gnupghome + '/' + x + '.gpg')
+ except IOError, oe:
+ if oe.errno != errno.ENOENT: raise
+
+ try: os.mkdir(opts.gnupghome, 0700)
+ except IOError, oe: if oe.errno != errno.EEXIST: raise
+ script = '
+ cd "$1"
+ exec >key-gen-log 2>&1
+ cat <<"END" >key-gen-params
+Key-Type: DSA
+Key-Length: 1024
+Key-Usage: sign
+Name-Real: autopkgtest per-run key
+Name-Comment: do not trust this key
+Name-Email: autopkgtest@example.com
+END
+ set -x
+ gpg --homedir="$1" --batch --gen-key key-gen-params
+ '
+ cmdl = ['sh','-ec',script,'x',opts.gnupghome]
+ rc = subprocess.call(cmdl)
+ if rc:
+ try:
+ f = open(opts.gnupghome+'/key-gen-log')
+ tp = file.read()
+ except IOError, e: tp = e
+ print >>sys.stderr, tp
+ bomb('key generation failed, code %d' % rc)
+
+ def reset(b):
+ shutil.rmtree(b.dir)
+ os.mkdir(b.dir)
+ b.tbpath = testbed.scratch.append('/binaries')
+ b.install = []
+ b.blamed = []
+
+ def register(b, act, pkg, path, forwhat, blamed):
+ if act.ah['deb_'+forwhat] == 'ignore': return
+
+ b.blamed += testbed.blamed
+
+ here = path.read()
+ leafname = pkg+'.deb'
+ dest = b.dir+'/'+leafname
+
+ try: os.remove(dest)
+ except IOError, oe:
+ if oe.errno != errno.ENOENT: raise e
+
+ try: os.link(here, dest)
+ except IOError, oe:
+ if oe.errno != errno.EXDEV: raise e
+ shutil.copy(here, dest)
+
+ if act.ah['deb_'+forwhat] == 'install':
+ b.install.append(pkg)
+
+ def publish(b):
+ script = '
+ cd "$1"
+ apt-ftparchive packages . >Packages
+ gzip -f Packages
+ apt-ftparchive release . >Release
+ gpg --homedir="$2" --batch --detach-sign --armour -o Release.gpg Release
+ gpg --homedir="$2" --batch --export >archive-key.pgp
+ '
+ cmdl = ['sh','-ec',script,'x',b.dir,opts.gnupghome]
+ rc = subprocess.call(cmd)
+ if rc: bomb('apt-ftparchive or signature failed, code %d' % rc)
+
+ tbp = b.tbpath.write(True)
+ testbed.command('copydown', (b.dir+'/', tbp+'/'))
+
+ se = TemporaryPath('%s-aptkey-stderr' % act.what)
+ script = '
+ apt-key add archive-key.pgp
+ echo "deb file:///'+tbp+'/ /" >/etc/apt/sources.list.d/autopkgtest
+ '
+ rc = testbed.commandr1(['execute',
+ ','.join(map(urllib.quote, ['sh','-ec','script']))],
+ '/dev/null', '/dev/null', se.write(True), tbp)
+ if rc: bomb('apt setup failed with exit code %d' % rc, se)
+
+ testbed.blamed += b.blamed
+
+ for pkg in b.install:
+ testbed.blame(pkg)
+ se = TemporaryPath('%s-install-%s-stderr' % (act.what,pkg))
+ rc = testbed.commandr1('execute','apt-get,-qy,install,'+pkg,
+ '/dev/null','/dev/null',se.ontb(),
+ tb.scratch.read(True))
+ if rc:
+ badpkg("installation of %s failed, exit code %d"
+ % (pkg, rc), se)
+
+#---------- processing of sources (building)
+