scripts/buildstats-diff: move more code to lib/buildstats.py

More refactoring of buildstats-diff script. Move recipe version
comparison functionality to scripts/lib/buildstats.py. This patch also
compasses some wording changes, i.e. changing 'package' to 'recipe'.

[YOCTO #11382]

(From OE-Core rev: 2f8942d6830258fcbe1925f12ba1516def32d132)

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Markus Lehtonen 2017-09-15 16:04:39 +03:00 committed by Richard Purdie
parent 81aef784fd
commit a80f5e761c
2 changed files with 58 additions and 53 deletions

View File

@ -24,7 +24,7 @@ from operator import attrgetter
# Import oe libs # Import oe libs
scripts_path = os.path.dirname(os.path.realpath(__file__)) scripts_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(scripts_path, 'lib')) sys.path.append(os.path.join(scripts_path, 'lib'))
from buildstats import BuildStats, diff_buildstats, taskdiff_fields from buildstats import BuildStats, diff_buildstats, taskdiff_fields, BSVerDiff
# Setup logging # Setup logging
@ -76,72 +76,48 @@ def read_buildstats(path, multi):
def print_ver_diff(bs1, bs2): def print_ver_diff(bs1, bs2):
"""Print package version differences""" """Print package version differences"""
pkgs1 = set(bs1.keys())
pkgs2 = set(bs2.keys())
new_pkgs = pkgs2 - pkgs1
deleted_pkgs = pkgs1 - pkgs2
echanged = [] diff = BSVerDiff(bs1, bs2)
vchanged = []
rchanged = []
unchanged = []
common_pkgs = pkgs2.intersection(pkgs1)
if common_pkgs:
for pkg in common_pkgs:
if bs1[pkg].epoch != bs2[pkg].epoch:
echanged.append(pkg)
elif bs1[pkg].version != bs2[pkg].version:
vchanged.append(pkg)
elif bs1[pkg].revision != bs2[pkg].revision:
rchanged.append(pkg)
else:
unchanged.append(pkg)
maxlen = max([len(pkg) for pkg in pkgs1.union(pkgs2)]) maxlen = max([len(r) for r in set(bs1.keys()).union(set(bs2.keys()))])
fmt_str = " {:{maxlen}} ({})" fmt_str = " {:{maxlen}} ({})"
# if unchanged:
# print("\nUNCHANGED PACKAGES:")
# print("-------------------")
# maxlen = max([len(pkg) for pkg in unchanged])
# for pkg in sorted(unchanged):
# print(fmt_str.format(pkg, bs2[pkg]['nevr'], maxlen=maxlen))
if new_pkgs: if diff.new:
print("\nNEW PACKAGES:") print("\nNEW RECIPES:")
print("-------------") print("------------")
for pkg in sorted(new_pkgs): for name, val in sorted(diff.new.items()):
print(fmt_str.format(pkg, bs2[pkg].nevr, maxlen=maxlen)) print(fmt_str.format(name, val.nevr, maxlen=maxlen))
if deleted_pkgs: if diff.dropped:
print("\nDELETED PACKAGES:") print("\nDROPPED RECIPES:")
print("-----------------") print("----------------")
for pkg in sorted(deleted_pkgs): for name, val in sorted(diff.dropped.items()):
print(fmt_str.format(pkg, bs1[pkg].nevr, maxlen=maxlen)) print(fmt_str.format(name, val.nevr, maxlen=maxlen))
fmt_str = " {0:{maxlen}} {1:<20} ({2})" fmt_str = " {0:{maxlen}} {1:<20} ({2})"
if rchanged: if diff.rchanged:
print("\nREVISION CHANGED:") print("\nREVISION CHANGED:")
print("-----------------") print("-----------------")
for pkg in sorted(rchanged): for name, val in sorted(diff.rchanged.items()):
field1 = "{} -> {}".format(pkg, bs1[pkg].revision, bs2[pkg].revision) field1 = "{} -> {}".format(val.left.revision, val.right.revision)
field2 = "{} -> {}".format(bs1[pkg].nevr, bs2[pkg].nevr) field2 = "{} -> {}".format(val.left.nevr, val.right.nevr)
print(fmt_str.format(pkg, field1, field2, maxlen=maxlen)) print(fmt_str.format(name, field1, field2, maxlen=maxlen))
if vchanged: if diff.vchanged:
print("\nVERSION CHANGED:") print("\nVERSION CHANGED:")
print("----------------") print("----------------")
for pkg in sorted(vchanged): for name, val in sorted(diff.vchanged.items()):
field1 = "{} -> {}".format(bs1[pkg].version, bs2[pkg].version) field1 = "{} -> {}".format(val.left.version, val.right.version)
field2 = "{} -> {}".format(bs1[pkg].nevr, bs2[pkg].nevr) field2 = "{} -> {}".format(val.left.nevr, val.right.nevr)
print(fmt_str.format(pkg, field1, field2, maxlen=maxlen)) print(fmt_str.format(name, field1, field2, maxlen=maxlen))
if echanged: if diff.echanged:
print("\nEPOCH CHANGED:") print("\nEPOCH CHANGED:")
print("--------------") print("--------------")
for pkg in sorted(echanged): for name, val in sorted(diff.echanged.items()):
field1 = "{} -> {}".format(bs1[pkg].epoch, bs2[pkg].epoch) field1 = "{} -> {}".format(val.left.epoch, val.right.epoch)
field2 = "{} -> {}".format(bs1[pkg].nevr, bs2[pkg].nevr) field2 = "{} -> {}".format(val.left.nevr, val.right.nevr)
print(fmt_str.format(pkg, field1, field2, maxlen=maxlen)) print(fmt_str.format(name, field1, field2, maxlen=maxlen))
def print_task_diff(bs1, bs2, val_type, min_val=0, min_absdiff=0, sort_by=('absdiff',)): def print_task_diff(bs1, bs2, val_type, min_val=0, min_absdiff=0, sort_by=('absdiff',)):

View File

@ -15,7 +15,7 @@ import json
import logging import logging
import os import os
import re import re
from collections import namedtuple from collections import namedtuple,OrderedDict
from statistics import mean from statistics import mean
@ -307,3 +307,32 @@ def diff_buildstats(bs1, bs2, stat_attr, min_val=None, min_absdiff=None):
tasks_diff.append(TaskDiff(pkg, pkg_op, task, task_op, val1, val2, tasks_diff.append(TaskDiff(pkg, pkg_op, task, task_op, val1, val2,
val2-val1, reldiff)) val2-val1, reldiff))
return tasks_diff return tasks_diff
class BSVerDiff(object):
"""Class representing recipe version differences between two buildstats"""
def __init__(self, bs1, bs2):
RecipeVerDiff = namedtuple('RecipeVerDiff', 'left right')
recipes1 = set(bs1.keys())
recipes2 = set(bs2.keys())
self.new = dict([(r, bs2[r]) for r in sorted(recipes2 - recipes1)])
self.dropped = dict([(r, bs1[r]) for r in sorted(recipes1 - recipes2)])
self.echanged = {}
self.vchanged = {}
self.rchanged = {}
self.unchanged = {}
common = recipes2.intersection(recipes1)
if common:
for recipe in common:
rdiff = RecipeVerDiff(bs1[recipe], bs2[recipe])
if bs1[recipe].epoch != bs2[recipe].epoch:
self.echanged[recipe] = rdiff
elif bs1[recipe].version != bs2[recipe].version:
self.vchanged[recipe] = rdiff
elif bs1[recipe].revision != bs2[recipe].revision:
self.rchanged[recipe] = rdiff
else:
self.unchanged[recipe] = rdiff