mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00
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:
parent
81aef784fd
commit
a80f5e761c
|
@ -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',)):
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user