diff options
| author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2013-10-17 14:15:15 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-10-26 15:59:13 +0100 |
| commit | f995febd2ebd43774cb1cc5917f3f3c46a744519 (patch) | |
| tree | a37c415ca70079414f7c2aef271175b2880d68ff | |
| parent | bc77ea96adef9977a39704e2bf5caddde0225d63 (diff) | |
| download | poky-f995febd2ebd43774cb1cc5917f3f3c46a744519.tar.gz | |
buildhistory-diff: add ability to report version changes
Add a -v/--report-ver option to report changes in PKGE/PKGV/PKGR even
if the value is the same as the default from PE/PV/PR.
Also add a -a/--report-all option to report all changes instead of just
the default significant ones.
Addresses [YOCTO #5263].
(From OE-Core rev: b7de1eaac9eed559b2d68058f5de67de74a6cb58)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | meta/lib/oe/buildhistory_analysis.py | 41 | ||||
| -rwxr-xr-x | scripts/buildhistory-diff | 8 |
2 files changed, 29 insertions, 20 deletions
diff --git a/meta/lib/oe/buildhistory_analysis.py b/meta/lib/oe/buildhistory_analysis.py index 86b5a12347..dd17dd5645 100644 --- a/meta/lib/oe/buildhistory_analysis.py +++ b/meta/lib/oe/buildhistory_analysis.py | |||
| @@ -19,10 +19,11 @@ import bb.utils | |||
| 19 | # How to display fields | 19 | # How to display fields |
| 20 | list_fields = ['DEPENDS', 'RPROVIDES', 'RDEPENDS', 'RRECOMMENDS', 'RSUGGESTS', 'RREPLACES', 'RCONFLICTS', 'FILES', 'FILELIST', 'USER_CLASSES', 'IMAGE_CLASSES', 'IMAGE_FEATURES', 'IMAGE_LINGUAS', 'IMAGE_INSTALL', 'BAD_RECOMMENDATIONS'] | 20 | list_fields = ['DEPENDS', 'RPROVIDES', 'RDEPENDS', 'RRECOMMENDS', 'RSUGGESTS', 'RREPLACES', 'RCONFLICTS', 'FILES', 'FILELIST', 'USER_CLASSES', 'IMAGE_CLASSES', 'IMAGE_FEATURES', 'IMAGE_LINGUAS', 'IMAGE_INSTALL', 'BAD_RECOMMENDATIONS'] |
| 21 | list_order_fields = ['PACKAGES'] | 21 | list_order_fields = ['PACKAGES'] |
| 22 | defaultval_fields = ['PKG', 'PKGE', 'PKGV', 'PKGR'] | 22 | defaultval_map = {'PKG': 'PKG', 'PKGE': 'PE', 'PKGV': 'PV', 'PKGR': 'PR'} |
| 23 | numeric_fields = ['PKGSIZE', 'IMAGESIZE'] | 23 | numeric_fields = ['PKGSIZE', 'IMAGESIZE'] |
| 24 | # Fields to monitor | 24 | # Fields to monitor |
| 25 | monitor_fields = ['RPROVIDES', 'RDEPENDS', 'RRECOMMENDS', 'RREPLACES', 'RCONFLICTS', 'PACKAGES', 'FILELIST', 'PKGSIZE', 'IMAGESIZE', 'PKG', 'PKGE', 'PKGV', 'PKGR'] | 25 | monitor_fields = ['RPROVIDES', 'RDEPENDS', 'RRECOMMENDS', 'RREPLACES', 'RCONFLICTS', 'PACKAGES', 'FILELIST', 'PKGSIZE', 'IMAGESIZE', 'PKG'] |
| 26 | ver_monitor_fields = ['PKGE', 'PKGV', 'PKGR'] | ||
| 26 | # Percentage change to alert for numeric fields | 27 | # Percentage change to alert for numeric fields |
| 27 | monitor_numeric_threshold = 10 | 28 | monitor_numeric_threshold = 10 |
| 28 | # Image files to monitor (note that image-info.txt is handled separately) | 29 | # Image files to monitor (note that image-info.txt is handled separately) |
| @@ -94,7 +95,7 @@ class ChangeRecord: | |||
| 94 | else: | 95 | else: |
| 95 | percentchg = 100 | 96 | percentchg = 100 |
| 96 | out = '%s changed from %s to %s (%s%d%%)' % (self.fieldname, self.oldvalue or "''", self.newvalue or "''", '+' if percentchg > 0 else '', percentchg) | 97 | out = '%s changed from %s to %s (%s%d%%)' % (self.fieldname, self.oldvalue or "''", self.newvalue or "''", '+' if percentchg > 0 else '', percentchg) |
| 97 | elif self.fieldname in defaultval_fields: | 98 | elif self.fieldname in defaultval_map: |
| 98 | out = '%s changed from %s to %s' % (self.fieldname, self.oldvalue, self.newvalue) | 99 | out = '%s changed from %s to %s' % (self.fieldname, self.oldvalue, self.newvalue) |
| 99 | if self.fieldname == 'PKG' and '[default]' in self.newvalue: | 100 | if self.fieldname == 'PKG' and '[default]' in self.newvalue: |
| 100 | out += ' - may indicate debian renaming failure' | 101 | out += ' - may indicate debian renaming failure' |
| @@ -305,24 +306,32 @@ def compare_pkg_lists(astr, bstr): | |||
| 305 | return (depvera, depverb) | 306 | return (depvera, depverb) |
| 306 | 307 | ||
| 307 | 308 | ||
| 308 | def compare_dict_blobs(path, ablob, bblob, report_all): | 309 | def compare_dict_blobs(path, ablob, bblob, report_all, report_ver): |
| 309 | adict = blob_to_dict(ablob) | 310 | adict = blob_to_dict(ablob) |
| 310 | bdict = blob_to_dict(bblob) | 311 | bdict = blob_to_dict(bblob) |
| 311 | 312 | ||
| 312 | pkgname = os.path.basename(path) | 313 | pkgname = os.path.basename(path) |
| 314 | |||
| 313 | defaultvals = {} | 315 | defaultvals = {} |
| 314 | defaultvals['PKG'] = pkgname | 316 | defaultvals['PKG'] = pkgname |
| 315 | defaultvals['PKGE'] = adict.get('PE', '0') | 317 | defaultvals['PKGE'] = '0' |
| 316 | defaultvals['PKGV'] = adict.get('PV', '') | ||
| 317 | defaultvals['PKGR'] = adict.get('PR', '') | ||
| 318 | for key in defaultvals: | ||
| 319 | defaultvals[key] = '%s [default]' % defaultvals[key] | ||
| 320 | 318 | ||
| 321 | changes = [] | 319 | changes = [] |
| 322 | keys = list(set(adict.keys()) | set(bdict.keys())) | 320 | keys = list(set(adict.keys()) | set(bdict.keys()) | set(defaultval_map.keys())) |
| 323 | for key in keys: | 321 | for key in keys: |
| 324 | astr = adict.get(key, '') | 322 | astr = adict.get(key, '') |
| 325 | bstr = bdict.get(key, '') | 323 | bstr = bdict.get(key, '') |
| 324 | if key in ver_monitor_fields: | ||
| 325 | monitored = report_ver or astr or bstr | ||
| 326 | else: | ||
| 327 | monitored = key in monitor_fields | ||
| 328 | mapped_key = defaultval_map.get(key, '') | ||
| 329 | if mapped_key: | ||
| 330 | if not astr: | ||
| 331 | astr = '%s [default]' % adict.get(mapped_key, defaultvals.get(key, '')) | ||
| 332 | if not bstr: | ||
| 333 | bstr = '%s [default]' % bdict.get(mapped_key, defaultvals.get(key, '')) | ||
| 334 | |||
| 326 | if astr != bstr: | 335 | if astr != bstr: |
| 327 | if (not report_all) and key in numeric_fields: | 336 | if (not report_all) and key in numeric_fields: |
| 328 | aval = int(astr or 0) | 337 | aval = int(astr or 0) |
| @@ -350,18 +359,12 @@ def compare_dict_blobs(path, ablob, bblob, report_all): | |||
| 350 | if ' '.join(alist) == ' '.join(blist): | 359 | if ' '.join(alist) == ' '.join(blist): |
| 351 | continue | 360 | continue |
| 352 | 361 | ||
| 353 | if key in defaultval_fields: | 362 | chg = ChangeRecord(path, key, astr, bstr, monitored) |
| 354 | if not astr: | ||
| 355 | astr = defaultvals[key] | ||
| 356 | elif not bstr: | ||
| 357 | bstr = defaultvals[key] | ||
| 358 | |||
| 359 | chg = ChangeRecord(path, key, astr, bstr, key in monitor_fields) | ||
| 360 | changes.append(chg) | 363 | changes.append(chg) |
| 361 | return changes | 364 | return changes |
| 362 | 365 | ||
| 363 | 366 | ||
| 364 | def process_changes(repopath, revision1, revision2 = 'HEAD', report_all = False): | 367 | def process_changes(repopath, revision1, revision2='HEAD', report_all=False, report_ver=False): |
| 365 | repo = git.Repo(repopath) | 368 | repo = git.Repo(repopath) |
| 366 | assert repo.bare == False | 369 | assert repo.bare == False |
| 367 | commit = repo.commit(revision1) | 370 | commit = repo.commit(revision1) |
| @@ -373,7 +376,7 @@ def process_changes(repopath, revision1, revision2 = 'HEAD', report_all = False) | |||
| 373 | if path.startswith('packages/'): | 376 | if path.startswith('packages/'): |
| 374 | filename = os.path.basename(d.a_blob.path) | 377 | filename = os.path.basename(d.a_blob.path) |
| 375 | if filename == 'latest': | 378 | if filename == 'latest': |
| 376 | changes.extend(compare_dict_blobs(path, d.a_blob, d.b_blob, report_all)) | 379 | changes.extend(compare_dict_blobs(path, d.a_blob, d.b_blob, report_all, report_ver)) |
| 377 | elif filename.startswith('latest.'): | 380 | elif filename.startswith('latest.'): |
| 378 | chg = ChangeRecord(path, filename, d.a_blob.data_stream.read(), d.b_blob.data_stream.read(), True) | 381 | chg = ChangeRecord(path, filename, d.a_blob.data_stream.read(), d.b_blob.data_stream.read(), True) |
| 379 | changes.append(chg) | 382 | changes.append(chg) |
diff --git a/scripts/buildhistory-diff b/scripts/buildhistory-diff index b82240d763..ad50414bce 100755 --- a/scripts/buildhistory-diff +++ b/scripts/buildhistory-diff | |||
| @@ -27,6 +27,12 @@ def main(): | |||
| 27 | parser.add_option("-p", "--buildhistory-dir", | 27 | parser.add_option("-p", "--buildhistory-dir", |
| 28 | help = "Specify path to buildhistory directory (defaults to buildhistory/ under cwd)", | 28 | help = "Specify path to buildhistory directory (defaults to buildhistory/ under cwd)", |
| 29 | action="store", dest="buildhistory_dir", default='buildhistory/') | 29 | action="store", dest="buildhistory_dir", default='buildhistory/') |
| 30 | parser.add_option("-v", "--report-version", | ||
| 31 | help = "Report changes in PKGE/PKGV/PKGR even when the values are still the default (PE/PV/PR)", | ||
| 32 | action="store_true", dest="report_ver", default=False) | ||
| 33 | parser.add_option("-a", "--report-all", | ||
| 34 | help = "Report all changes, not just the default significant ones", | ||
| 35 | action="store_true", dest="report_all", default=False) | ||
| 30 | 36 | ||
| 31 | options, args = parser.parse_args(sys.argv) | 37 | options, args = parser.parse_args(sys.argv) |
| 32 | 38 | ||
| @@ -79,7 +85,7 @@ def main(): | |||
| 79 | 85 | ||
| 80 | import gitdb | 86 | import gitdb |
| 81 | try: | 87 | try: |
| 82 | changes = oe.buildhistory_analysis.process_changes(options.buildhistory_dir, fromrev, torev) | 88 | changes = oe.buildhistory_analysis.process_changes(options.buildhistory_dir, fromrev, torev, options.report_all, options.report_ver) |
| 83 | except gitdb.exc.BadObject as e: | 89 | except gitdb.exc.BadObject as e: |
| 84 | if len(args) == 1: | 90 | if len(args) == 1: |
| 85 | sys.stderr.write("Unable to find previous build revision in buildhistory repository\n\n") | 91 | sys.stderr.write("Unable to find previous build revision in buildhistory repository\n\n") |
