]> git.ipfire.org Git - pakfire.git/commitdiff
Automatically determine prerequires dependencies for scriptlets.
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 3 Apr 2012 14:22:40 +0000 (16:22 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 3 Apr 2012 14:22:40 +0000 (16:22 +0200)
python/pakfire/builder.py
python/pakfire/constants.py
python/pakfire/packages/make.py
python/pakfire/packages/packager.py
tools/Makefile
tools/find-prerequires [new file with mode: 0755]

index 81fe548889358d517308f78a65f6128081f2b8d5..40218bf56ab10226551296c7ee94a423e1637d79 100644 (file)
@@ -955,6 +955,12 @@ class Builder(object):
                return environ
 
        def do(self, command, shell=True, personality=None, cwd=None, *args, **kwargs):
+               try:
+                       logger = kwargs["logger"]
+               except KeyError:
+                       logger = logging.getLogger("pakfire")
+                       kwargs["logger"] = logger
+
                # Environment variables
                log.debug("Environment:")
                for k, v in sorted(self.environ.items()):
@@ -977,12 +983,26 @@ class Builder(object):
                        personality=personality,
                        shell=False,
                        env=self.environ,
-                       logger=logging.getLogger("pakfire"),
                        cwd=cwd,
                        *args,
                        **kwargs
                )
 
+       def run_script(self, script, *args):
+               if not script.startswith("/"):
+                       script = os.path.join(SCRIPT_DIR, script)
+
+               assert os.path.exists(script), "Script we should run does not exist: %s" % script
+
+               cmd = [script,]
+               for arg in args:
+                       cmd.append(arg)
+               cmd = " ".join(cmd)
+
+               # Returns the output of the command, but the output won't get
+               # logged.
+               return self.do(cmd, returnOutput=True, logger=None)
+
        def create_icecream_toolchain(self):
                try:
                        out = self.do("icecc --build-native 2>/dev/null", returnOutput=True, cwd="/tmp")
@@ -1091,6 +1111,14 @@ class Builder(object):
                        log.error(_("Extracting debuginfo did not complete with success. Aborting build."))
                        raise
 
+       def find_prerequires(self, scriptlet_file):
+               assert os.path.exists(scriptlet_file), "Scriptlet file does not exist: %s" % scriptlet_file
+
+               res = self.run_script("find-prerequires", scriptlet_file)
+               prerequires = set(res.splitlines())
+
+               return prerequires
+
        def cleanup(self):
                if os.path.exists(self.buildroot):
                        util.rm(self.buildroot)
index e3fe8cd0f54b45e72748f46785c8dd236f39a00e..9d4f34a2a954bdd1b058b6f3da80258632f8f901 100644 (file)
@@ -201,6 +201,13 @@ SCRIPTS = (
        "posttransup",
 )
 
+SCRIPTS_PREREQUIRES = (
+       "prein",
+       "postin",
+       "preup",
+       "postup",
+)
+
 LDCONFIG = "/sbin/ldconfig"
 
 CONFIG_FILE_SUFFIX_NEW  = ".paknew"
index 95e992776362b2905dffd1832d21eb3e72a7b2f5..46c0ec8e4521a128a2bb96c94c5728a002aef36f 100644 (file)
@@ -441,6 +441,15 @@ class MakefilePackage(MakefileBase):
                                self._dependencies[key], self.lexer.get_var("filter_%s" % key)
                        )
 
+       def update_prerequires(self, prerequires):
+               if not prerequires:
+                       return
+
+               _prerequires = self._dependencies.get("prerequires", [])
+               _prerequires = set(_prerequires + prerequires)
+
+               self._dependencies["prerequires"] = list(prerequires)
+
        @staticmethod
        def filter_deps(deps, filters):
                if not filters:
index 386a5ddf35108a6b13f82203048b222acf4fe569..53879d1e519c3ca7f2f3b62de3773be8f1049c08 100644 (file)
@@ -425,6 +425,9 @@ class BinaryPackager(Packager):
        def create_scriptlets(self):
                scriptlets = []
 
+               # Collect all prerequires for the scriptlets.
+               prerequires = []
+
                for scriptlet_name in SCRIPTS:
                        scriptlet = self.pkg.get_scriptlet(scriptlet_name)
 
@@ -463,12 +466,19 @@ class BinaryPackager(Packager):
 
                                s.close()
 
+                               if scriptlet_name in SCRIPTS_PREREQUIRES:
+                                       # Shell scripts require a shell to be executed.
+                                       prerequires.append("/bin/sh")
+
+                                       prerequires += self.builder.find_prerequires(scriptlet_file)
+
                        else:
                                raise Exception, "Unknown scriptlet language: %s" % scriptlet["lang"]
 
                        scriptlets.append((scriptlet_name, scriptlet_file))
 
-               # XXX scan for script dependencies
+               # Cleanup prerequires.
+               self.pkg.update_prerequires(prerequires)
 
                return scriptlets
 
index 4448b69f5ca7f406dfb07e5b0d586d51111ced1e..d7cbf709a2c6762da4b0965378dec3b5df32fa9d 100644 (file)
@@ -20,6 +20,7 @@ SCRIPTS_SHELL = \
        compress-man-pages \
        extract-debuginfo \
        find-common \
+       find-prerequires \
        find-provides \
        find-requires \
        pakfire-multicall.py \
diff --git a/tools/find-prerequires b/tools/find-prerequires
new file mode 100755 (executable)
index 0000000..d4b39d0
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+if [ -z "${1}" ]; then
+       echo >&2 "No input file passed!"
+       exit 1
+fi
+
+prereqs=$(bash --rpm-requires < ${1} | sort | uniq | sed -e 's/^bash(//' -e 's/)$//' -e 's/^executable(//' -e 's/)$//')
+[ -z "${prereqs}" ] && exit 0
+
+for prereq in ${prereqs}; do
+       case "${prereq}" in
+               /*)
+                       echo ${prereq}
+                       ;;
+               *)
+                       which ${prereq} 2>/dev/null
+                       ;;
+       esac
+done | sort | uniq