pmtest: resolve path to scriptlet shell

In order to support a variety of values for the --with-scriptlet-shell
configure flag, pmtest has to be aware of what kind of path was passed,
be it an absolute path or a fragment for a path lookup. For absolute
paths, leave the path alone. For fragments, search the PATH environment
var for the resolved path to the binary. In both cases, join the
resultant path to the root directory defined for the test, not a
pre-determined bin directory.

Fixes FS#31552.

With-contribution-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Allan McRae 2012-09-20 23:09:29 +10:00
parent 993700bc6b
commit 4a8c2852a8
4 changed files with 26 additions and 3 deletions

View File

@ -28,6 +28,7 @@ check-local: test-pacman test-pacsort test-vercmp test-parseopts
test-pacman: test/pacman src/pacman test-pacman: test/pacman src/pacman
LC_ALL=C $(PYTHON) $(top_srcdir)/test/pacman/pactest.py --debug=1 \ LC_ALL=C $(PYTHON) $(top_srcdir)/test/pacman/pactest.py --debug=1 \
--test $(top_srcdir)/test/pacman/tests/*.py \ --test $(top_srcdir)/test/pacman/tests/*.py \
--scriptlet-shell $(SCRIPTLET_SHELL) \
-p $(top_builddir)/src/pacman/pacman -p $(top_builddir)/src/pacman/pacman
test-pacsort: test/util src/util test-pacsort: test/util src/util

View File

@ -3,6 +3,7 @@
# pactest : run automated testing on the pacman binary # pactest : run automated testing on the pacman binary
# #
# Copyright (c) 2006 by Aurelien Foret <orelien@chez.com> # Copyright (c) 2006 by Aurelien Foret <orelien@chez.com>
# Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org>
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -81,6 +82,9 @@ def create_parser():
parser.add_option("--manual-confirm", action = "store_true", parser.add_option("--manual-confirm", action = "store_true",
dest = "manualconfirm", default = False, dest = "manualconfirm", default = False,
help = "do not use --noconfirm for pacman calls") help = "do not use --noconfirm for pacman calls")
parser.add_option("--scriptlet-shell", type = "string",
dest = "scriptletshell", default = "sh",
help = "specify shell used for install scriptlets")
return parser return parser
@ -99,6 +103,7 @@ def create_parser():
env.pacman["gdb"] = opts.gdb env.pacman["gdb"] = opts.gdb
env.pacman["valgrind"] = opts.valgrind env.pacman["valgrind"] = opts.valgrind
env.pacman["manual-confirm"] = opts.manualconfirm env.pacman["manual-confirm"] = opts.manualconfirm
env.pacman["scriptlet-shell"] = opts.scriptletshell
if opts.testcases is None or len(opts.testcases) == 0: if opts.testcases is None or len(opts.testcases) == 0:
print "no tests defined, nothing to do" print "no tests defined, nothing to do"

View File

@ -66,7 +66,7 @@ def run(self):
print t.description print t.description
print "----------"*8 print "----------"*8
t.generate() t.generate(self.pacman)
t.run(self.pacman) t.run(self.pacman)

View File

@ -1,6 +1,7 @@
#! /usr/bin/python2 #! /usr/bin/python2
# #
# Copyright (c) 2006 by Aurelien Foret <orelien@chez.com> # Copyright (c) 2006 by Aurelien Foret <orelien@chez.com>
# Copyright (c) 2006-2012 Pacman Development Team <pacman-dev@archlinux.org>
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -102,7 +103,18 @@ def load(self):
else: else:
raise IOError("file %s does not exist!" % self.name) raise IOError("file %s does not exist!" % self.name)
def generate(self): def resolve_binary(self, binary):
if os.path.isabs(binary):
return binary
for path in os.environ["PATH"].split(':'):
resolved = os.path.join(path, binary)
if os.path.exists(resolved):
return resolved
return binary
def generate(self, pacman):
print "==> Generating test environment" print "==> Generating test environment"
# Cleanup leftover files from a previous test session # Cleanup leftover files from a previous test session
@ -120,13 +132,18 @@ def generate(self):
etcdir = os.path.join(self.root, os.path.dirname(util.PACCONF)) etcdir = os.path.join(self.root, os.path.dirname(util.PACCONF))
bindir = os.path.join(self.root, "bin") bindir = os.path.join(self.root, "bin")
sbindir = os.path.join(self.root, "sbin") sbindir = os.path.join(self.root, "sbin")
sys_dirs = [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir, bindir, sbindir] scriptlet_shell = self.resolve_binary(pacman["scriptlet-shell"])
shelldir = os.path.join(self.root, os.path.dirname(scriptlet_shell)[1:])
sys_dirs = [dbdir, cachedir, syncdir, tmpdir, logdir, etcdir, bindir,
sbindir, shelldir]
for sys_dir in sys_dirs: for sys_dir in sys_dirs:
if not os.path.isdir(sys_dir): if not os.path.isdir(sys_dir):
vprint("\t%s" % sys_dir[len(self.root)+1:]) vprint("\t%s" % sys_dir[len(self.root)+1:])
os.makedirs(sys_dir, 0755) os.makedirs(sys_dir, 0755)
# Only the dynamically linked binary is needed for fakechroot # Only the dynamically linked binary is needed for fakechroot
shutil.copy("/bin/sh", bindir) shutil.copy("/bin/sh", bindir)
if scriptlet_shell != "/bin/sh":
shutil.copy("/bin/sh", os.path.join(self.root, scriptlet_shell[1:]))
shutil.copy(os.path.join(util.SELFPATH, "ldconfig.stub"), shutil.copy(os.path.join(util.SELFPATH, "ldconfig.stub"),
os.path.join(sbindir, "ldconfig")) os.path.join(sbindir, "ldconfig"))
ld_so_conf = open(os.path.join(etcdir, "ld.so.conf"), "w") ld_so_conf = open(os.path.join(etcdir, "ld.so.conf"), "w")