diff --git a/contrib/yum-dnf-compare/README b/contrib/yum-dnf-compare/README new file mode 100644 index 00000000..eabbf24b --- /dev/null +++ b/contrib/yum-dnf-compare/README @@ -0,0 +1,19 @@ +This directory contains scripts to compare YUM and DNF based gathering code in +Pungi. + +There are two scripts to help re-run the depsolving on existing code. As input +they need .conf and .log file from an existing compose. They collect correct +command line options from them and run the respective tool. + +Run: + + $ run-dnf.sh Server.x86_64.conf + $ run-yum.sh Server.x86_64.conf + +The results are stored in a file with .log.dnf or .log.yum extensions. When +--interactive is used as second argument of the scripts, the output is printed +to terminal (useful for running in debugger). + +To compare the RPM package lists, run: + + $ ./pungi-compare-depsolving Server.x86_64.log.yum Server.x86_64.log.dnf diff --git a/contrib/yum-dnf-compare/pungi-compare-depsolving b/contrib/yum-dnf-compare/pungi-compare-depsolving new file mode 100755 index 00000000..ef4b8dff --- /dev/null +++ b/contrib/yum-dnf-compare/pungi-compare-depsolving @@ -0,0 +1,62 @@ +#!/usr/bin/python + +from __future__ import print_function + + +import argparse +import os +import sys + +here = sys.path[0] +if here != '/usr/bin': + # Git checkout + sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) + +from kobo.rpmlib import parse_nvra, make_nvra +from pungi.wrappers.pungi import PungiWrapper + + +def read_rpms(fn): + pw = PungiWrapper() + data = pw.get_packages(open(fn, "r").read()) + result = set() + for i in data["rpm"]: + nvra = parse_nvra(i["path"]) + result.add(make_nvra(nvra, add_rpm=True)) + + return result + + +parser = argparse.ArgumentParser() +parser.add_argument('old', metavar='OLD', default='pungi-yum.log') +parser.add_argument('new', metavar='NEW', default='pungi-dnf.log') + +args = parser.parse_args() + +yum_rpms = read_rpms(args.old) +dnf_rpms = read_rpms(args.new) + +removed = yum_rpms - dnf_rpms +added = dnf_rpms - yum_rpms + + +print("ADDED: %s" % len(added)) +for i in sorted(added): + print(" %s" % i) + +print() + +print("REMOVED: %s" % len(removed)) +for i in sorted(removed): + print(" %s" % i) + +print() + +print("ADDED: %6s" % len(added)) +print("REMOVED: %6s" % len(removed)) +print("YUM RPMS: %6s" % len(yum_rpms)) +print("DNF RPMS: %6s" % len(dnf_rpms)) +print("ALL RPMS: %6s" % len(yum_rpms | dnf_rpms)) + +if added or removed: + sys.exit(1) diff --git a/contrib/yum-dnf-compare/run-dnf.sh b/contrib/yum-dnf-compare/run-dnf.sh new file mode 100755 index 00000000..326c2e0e --- /dev/null +++ b/contrib/yum-dnf-compare/run-dnf.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +set -e +set -u +set -o pipefail + +HERE=$(dirname "$0") +PATH=$HERE/../../bin:$PATH +PYTHONPATH=$HERE/../../:${PYTHONPATH:-} +export PATH PYTHONPATH + +CONF=$1 +LOG=${CONF%%.conf}.log +ARCH=$(head -n1 "$LOG" | tr ' ' '\n' | grep -- '--arch=') + +CMD=(pungi-gather "--config=$CONF" "$ARCH" $(head -n1 "$LOG" | tr ' ' '\n' | grep '^--\(selfhosting\|fulltree\|greedy\|multilib\)')) + +echo "${CMD[@]}" +if [ $# -le 1 ] || [ "$2" != "--interactive" ]; then + exec >"$LOG.dnf" +fi +exec 2>&1 + +exec "${CMD[@]}" diff --git a/contrib/yum-dnf-compare/run-yum.sh b/contrib/yum-dnf-compare/run-yum.sh new file mode 100755 index 00000000..87efe76d --- /dev/null +++ b/contrib/yum-dnf-compare/run-yum.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e +set -o pipefail +set -u + +export LANG=C + +HERE=$(dirname "$0") +PATH=$HERE/../../bin:$PATH +PYTHONPATH=$HERE/../../ +export PATH PYTHONPATH + +CONF="$1" +LOG=${CONF%%.conf}.log + +tempdir=$(mktemp -d) +trap 'rm -rf $tempdir' EXIT + +cmd=$(head -n1 "$LOG" | cut -d' ' -f2- | sed "s@--\(destdir\|cachedir\)=\(/[^/ ]*\)*@--\1=$tempdir/\1@g" | sed 's/^pungi3/pungi/' | sed "s@--config=/\([^/]*/\)*work/[^/]*/pungi/\([^ ]*\)@--config=$1@g") + +echo "$cmd" +if [ $# -le 1 ] || [ "$2" != "--interactive" ]; then + exec >"$LOG.yum" +fi +exec 2>&1 + +$cmd diff --git a/pungi.spec b/pungi.spec index 380f12a1..4b83b558 100644 --- a/pungi.spec +++ b/pungi.spec @@ -85,6 +85,7 @@ rm -rf %{buildroot} %{_bindir}/%{name}-config-validate %{_bindir}/%{name}-fedmsg-notification %{_bindir}/%{name}-patch-iso +%{_bindir}/%{name}-compare-depsolving %check nosetests --exe diff --git a/setup.py b/setup.py index d22e61dc..f12c1c79 100755 --- a/setup.py +++ b/setup.py @@ -42,6 +42,8 @@ setup( 'bin/pungi-koji', 'bin/pungi-make-ostree', 'bin/pungi-patch-iso', + + 'contrib/yum-dnf-compare/pungi-compare-depsolving', ], data_files = [ ('/usr/share/pungi', glob.glob('share/*.xsl')),