116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
|
|
from __future__ import print_function
|
|
|
|
import rpm
|
|
import sys
|
|
|
|
|
|
def nevr(header):
|
|
return (header[rpm.RPMTAG_NAME],
|
|
header[rpm.RPMTAG_EPOCH],
|
|
header[rpm.RPMTAG_VERSION],
|
|
header[rpm.RPMTAG_RELEASE])
|
|
|
|
def read_lists(arg):
|
|
return frozenset(nevr(h)
|
|
for filename in arg.split(',')
|
|
for h in rpm.readHeaderListFromFile(filename))
|
|
|
|
|
|
|
|
COLOR_LEGEND = {
|
|
"RED": "totally missing",
|
|
"GREEN": "same NEVR in both repositories",
|
|
"EXTRA": "present in new repo only (distro-specific or not yet deleted)",
|
|
"ORANGE": "EV is different (we need the latest version)",
|
|
"YELLOW": "EV is the same, release is smaller (we need the latest build)",
|
|
"SLATE": "EV is the same, release is larger (we need to push the fixes"
|
|
}
|
|
|
|
|
|
def print_totals(label, name_set):
|
|
print("%10s:%6s // %s" % (label, len(name_set), COLOR_LEGEND[label]))
|
|
|
|
def format_version(versions, name):
|
|
try:
|
|
e, v, r = versions[name]
|
|
except KeyError:
|
|
return 'MISSING'
|
|
se = str(e) + ':' if e is not None else ''
|
|
return '%s%s-%s' % (se, v, r)
|
|
|
|
|
|
def print_names(label, names, base_labels, new_labels):
|
|
print("\n\n%s (%s):" % (label, COLOR_LEGEND[label]))
|
|
for n in sorted(names):
|
|
print("\t%s\t%s -> %s" % (
|
|
n, format_version(new_labels, n), format_version(base_labels, n)))
|
|
|
|
|
|
def evr_cmp(name, evr1, evr2):
|
|
# rpm module reads epoch as int, requires string for comparison
|
|
label1 = tuple(str(x) for x in evr1)
|
|
label2 = tuple(str(x) for x in evr2)
|
|
try:
|
|
return rpm.labelCompare(label1, label2)
|
|
except BaseException as ex:
|
|
raise ValueError(
|
|
"Failed to compare EVRs for %s: %s %s: %s: %s"
|
|
% (name, evr1, evr2, type(ex).__name__, str(ex)))
|
|
|
|
|
|
def main(base_arch_paths, new_arch_paths):
|
|
base_nevrs = read_lists(base_arch_paths)
|
|
new_nevrs = read_lists(new_arch_paths)
|
|
|
|
print("Base repo size:", len(base_nevrs))
|
|
print("New repo size:", len(new_nevrs))
|
|
|
|
base_versions = dict((n, (e,v)) for n,e,v,r in base_nevrs)
|
|
new_versions = dict((n, (e,v)) for n,e,v,r in new_nevrs)
|
|
|
|
base_labels = dict((n, (e,v,r)) for n,e,v,r in base_nevrs)
|
|
new_labels = dict((n, (e,v,r)) for n,e,v,r in new_nevrs)
|
|
|
|
|
|
# RED
|
|
base_names = frozenset(t[0] for t in base_nevrs)
|
|
new_names = frozenset(t[0] for t in new_nevrs)
|
|
red_names = base_names - new_names
|
|
|
|
# GREEN
|
|
green_nevrs = base_nevrs & new_nevrs
|
|
green_names = frozenset(t[0] for t in green_nevrs)
|
|
|
|
# EXTRA
|
|
extra_names = new_names - base_names
|
|
|
|
# OTHER: same name, different EVR
|
|
other_names = new_names - green_names - extra_names
|
|
|
|
orange_names = frozenset(n for n in other_names
|
|
if base_versions[n] != new_versions[n])
|
|
yellow_names = frozenset(n for n in other_names
|
|
if base_versions[n] == new_versions[n]
|
|
and evr_cmp(n, base_labels[n], new_labels[n]) < 0)
|
|
slate_names = other_names - yellow_names - orange_names
|
|
|
|
print("Statistics:")
|
|
print_totals('RED', red_names)
|
|
print_totals('ORANGE', orange_names)
|
|
print_totals('YELLOW', yellow_names)
|
|
print_totals('SLATE', slate_names)
|
|
print_totals('GREEN', green_names)
|
|
print_totals('EXTRA', extra_names)
|
|
|
|
print_names('RED', red_names, base_labels, new_labels)
|
|
print_names('ORANGE', orange_names, base_labels, new_labels)
|
|
print_names('YELLOW', yellow_names, base_labels, new_labels)
|
|
print_names('SLATE', slate_names, base_labels, new_labels)
|
|
print_names('GREEN', green_names, base_labels, new_labels)
|
|
print_names('EXTRA', extra_names, base_labels, new_labels)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(*sys.argv[1:]))
|