]> code.ossystems Code Review - openembedded-core.git/commitdiff
package_rpm: Only rebuild the indexes if the packages have changed
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 9 Feb 2012 14:09:18 +0000 (14:09 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 27 Apr 2012 15:21:22 +0000 (16:21 +0100)
This change farms the solvedb creation out to a separate script which
handles creation of the index, only if mtime of any of the packages
has changed.

For a core-image-minimal set of rpm's this saves ~20s of a 45s rootfs
build. For core-image-sato it saves 1 minute of a 5 minute rootfs build.
The more packages in the system, the bigger the saving will be.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/package_rpm.bbclass
scripts/rpm-createsolvedb.py [new file with mode: 0755]

index d90976b65dc6e8d0f6b492be59682f9a5cff080c..623069e3775cba4436473b2b37ed6edd94b77816 100644 (file)
@@ -40,12 +40,13 @@ package_update_index_rpm_common () {
        rpmconf_base="$1"
        shift
 
+        createdirs=""
        for archvar in "$@"; do
                eval archs=\${${archvar}}
                packagedirs=""
                for arch in $archs; do
                        packagedirs="${DEPLOY_DIR_RPM}/$arch $packagedirs"
-                       rm -rf ${DEPLOY_DIR_RPM}/$arch/solvedb
+                       rm -rf ${DEPLOY_DIR_RPM}/$arch/solvedb.done
                done
 
                cat /dev/null > ${rpmconf_base}-${archvar}.conf
@@ -53,22 +54,11 @@ package_update_index_rpm_common () {
                        if [ -e $pkgdir/ ]; then
                                echo "Generating solve db for $pkgdir..."
                                echo $pkgdir/solvedb >> ${rpmconf_base}-${archvar}.conf
-                               if [ -d $pkgdir/solvedb ]; then
-                                       # We've already processed this and it's a duplicate
-                                       continue
-                               fi
-                               mkdir -p $pkgdir/solvedb
-                               echo "# Dynamically generated solve manifest" >> $pkgdir/solvedb/manifest
-                               find $pkgdir -maxdepth 1 -type f >> $pkgdir/solvedb/manifest
-                               ${RPM} -i --replacepkgs --replacefiles --oldpackage \
-                                       -D "_dbpath $pkgdir/solvedb" --justdb \
-                                       --noaid --nodeps --noorder --noscripts --notriggers --noparentdirs --nolinktos --stats \
-                                       --ignoresize --nosignature --nodigest \
-                                       -D "__dbi_txn create nofsync" \
-                                       $pkgdir/solvedb/manifest
+                                createdirs="$createdirs $pkgdir"
                        fi
                done
        done
+       rpm-createsolvedb.py "${RPM}" $createdirs
 }
 
 #
diff --git a/scripts/rpm-createsolvedb.py b/scripts/rpm-createsolvedb.py
new file mode 100755 (executable)
index 0000000..0d5f219
--- /dev/null
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+#
+# This script generates a solution database for a directory containing rpm packages
+# but tries to be efficient about this, only doing so when the packages have changed
+# in some way.
+#
+# It is assumed something already went through and removed all the solvedb.done stamp files
+# in advance.
+#
+# First argument - the rpm binary to use
+# Subsequent arguments - paths to process solution databases for
+#
+
+import sys, os
+import hashlib
+import stat
+
+if len(sys.argv) < 1:
+    print("Error, rpm command not specified")
+    sys.exit(1)
+
+if len(sys.argv) < 2:
+    print("Error, no paths specified")
+    sys.exit(1)
+
+paths = sys.argv[2:]
+
+for path in paths:
+    if os.path.exists(path + "/solvedb.done"):
+        continue
+    data = ""
+    manifest = []
+    for root, dirs, files in os.walk(path):
+        for file in files:
+            f = os.path.join(root, file)
+            if f.startswith(path + "/" + "solvedb"):
+                continue
+            data = data + str(os.stat(f)[stat.ST_MTIME])
+            manifest.append(f)
+    checksum = hashlib.md5(data).hexdigest()
+
+    if os.path.exists(path + "/solvedb.checksum") and open(path + "/solvedb.checksum", "r").read() == checksum:
+        open(path + "/solvedb.done", "w")
+        continue
+
+    if os.path.exists(path + "/solvedb"):
+        os.system("rm -rf %s" % (path + "/solvedb"))
+    os.mkdir(path + "/solvedb")
+    m = open(path + "/solvedb/manifest", "w")
+    m.write("# Dynamically generated solve manifest\n")
+    for f in manifest:
+        m.write(f + "\n")
+    m.close()
+
+    cmd = sys.argv[1] + ' -i --replacepkgs --replacefiles --oldpackage -D "_dbpath ' + path + '/solvedb" --justdb \
+                       --noaid --nodeps --noorder --noscripts --notriggers --noparentdirs --nolinktos --stats \
+                       --ignoresize --nosignature --nodigest -D "__dbi_txn create nofsync" \
+                       ' + path + '/solvedb/manifest'
+    os.system(cmd)
+
+    open(path + "/solvedb.checksum", "w").write(checksum)
+    open(path + "/solvedb.done", "w")
+