Patchwork [3/4] buildhistory_analysis: improve field handling robustness

login
register
mail settings
Submitter Paul Eggleton
Date Jan. 19, 2012, 10:32 a.m.
Message ID <450aed411ccbc07fc52203df8053135d9f1cacc0.1326968802.git.paul.eggleton@linux.intel.com>
Download mbox | patch
Permalink /patch/19765/
State Accepted
Commit 255d4bbf4d1e430d45f5fafb7d1c77d9ea67e174
Headers show

Comments

Paul Eggleton - Jan. 19, 2012, 10:32 a.m.
Avoid errors when comparing changes for KEY = value files (package info
files and image-info.txt):

* Handle keys appearing and disappearing - this will help to handle PE
  in package info files (which is only written when it is not blank) and
  when we add additional fields in future.
* Handle when old value is 0 for numeric field (avoid division by zero)
* Report when numeric field was empty or missing rather than 0 (but
  still treat it as 0 for comparison purposes)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
---
 meta/lib/oe/buildhistory_analysis.py |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)

Patch

diff --git a/meta/lib/oe/buildhistory_analysis.py b/meta/lib/oe/buildhistory_analysis.py
index a2fa643..627467c 100644
--- a/meta/lib/oe/buildhistory_analysis.py
+++ b/meta/lib/oe/buildhistory_analysis.py
@@ -40,10 +40,13 @@  class ChangeRecord:
             added = list(set(bitems) - set(aitems))
             return '%s: %s:%s%s' % (self.path, self.fieldname, ' removed "%s"' % ' '.join(removed) if removed else '', ' added "%s"' % ' '.join(added) if added else '')
         elif self.fieldname in numeric_fields:
-            aval = int(self.oldvalue)
-            bval = int(self.newvalue)
-            percentchg = ((bval - aval) / float(aval)) * 100
-            return '%s: %s changed from %d to %d (%s%d%%)' % (self.path, self.fieldname, aval, bval, '+' if percentchg > 0 else '', percentchg)
+            aval = int(self.oldvalue or 0)
+            bval = int(self.newvalue or 0)
+            if aval != 0:
+                percentchg = ((bval - aval) / float(aval)) * 100
+            else:
+                percentchg = 100
+            return '%s: %s changed from %s to %s (%s%d%%)' % (self.path, self.fieldname, self.oldvalue or "''", self.newvalue or "''", '+' if percentchg > 0 else '', percentchg)
         elif self.fieldname in img_monitor_files:
             out = 'Changes to %s (%s):\n  ' % (self.path, self.fieldname)
             if self.filechanges:
@@ -194,16 +197,22 @@  def compare_dict_blobs(path, ablob, bblob, report_all):
     bdict = blob_to_dict(bblob)
 
     changes = []
-    for key in adict:
+    keys = list(set(adict.keys()) | set(bdict.keys()))
+    for key in keys:
         if report_all or key in monitor_fields:
-            if adict[key] != bdict[key]:
+            astr = adict.get(key, '')
+            bstr = bdict.get(key, '')
+            if astr != bstr:
                 if (not report_all) and key in numeric_fields:
-                    aval = int(adict[key])
-                    bval = int(bdict[key])
-                    percentchg = ((bval - aval) / float(aval)) * 100
+                    aval = int(astr or 0)
+                    bval = int(bstr or 0)
+                    if aval != 0:
+                        percentchg = ((bval - aval) / float(aval)) * 100
+                    else:
+                        percentchg = 100
                     if percentchg < monitor_numeric_threshold:
                         continue
-                chg = ChangeRecord(path, key, adict[key], bdict[key])
+                chg = ChangeRecord(path, key, astr, bstr)
                 changes.append(chg)
     return changes