diff options
| -rw-r--r-- | meta/classes/package_rpm.bbclass | 18 | ||||
| -rwxr-xr-x | scripts/rpm-createsolvedb.py | 63 | 
2 files changed, 67 insertions, 14 deletions
| diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass index d90976b65d..623069e377 100644 --- a/meta/classes/package_rpm.bbclass +++ b/meta/classes/package_rpm.bbclass @@ -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 index 0000000000..0d5f2198a9 --- /dev/null +++ b/scripts/rpm-createsolvedb.py @@ -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") + | 
