diff options
Diffstat (limited to 'scripts/lib/devtool/upgrade.py')
| -rw-r--r-- | scripts/lib/devtool/upgrade.py | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/scripts/lib/devtool/upgrade.py b/scripts/lib/devtool/upgrade.py index 28fbdaee35..7de9ab5c2d 100644 --- a/scripts/lib/devtool/upgrade.py +++ b/scripts/lib/devtool/upgrade.py | |||
| @@ -291,7 +291,26 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, srcbranch, branch, kee | |||
| 291 | 291 | ||
| 292 | return (rev, md5, sha256, srcbranch, srcsubdir_rel) | 292 | return (rev, md5, sha256, srcbranch, srcsubdir_rel) |
| 293 | 293 | ||
| 294 | def _create_new_recipe(newpv, md5, sha256, srcrev, srcbranch, srcsubdir_old, srcsubdir_new, workspace, tinfoil, rd): | 294 | def _add_license_diff_to_recipe(path, diff): |
| 295 | notice_text = """# FIXME: the LIC_FILES_CHKSUM values have been updated by 'devtool upgrade'. | ||
| 296 | # The following is the difference between the old and the new license text. | ||
| 297 | # Please update the LICENSE value if needed, and summarize the changes in | ||
| 298 | # the commit message via 'License-checksum-change:' tag. | ||
| 299 | # (example: 'License-checksum-change: copyright years updated.') | ||
| 300 | # | ||
| 301 | # The changes: | ||
| 302 | # | ||
| 303 | """ | ||
| 304 | commented_diff = "\n".join(["# {}".format(l) for l in diff.split('\n')]) | ||
| 305 | with open(path, 'rb') as f: | ||
| 306 | orig_content = f.read() | ||
| 307 | with open(path, 'wb') as f: | ||
| 308 | f.write(notice_text.encode()) | ||
| 309 | f.write(commented_diff.encode()) | ||
| 310 | f.write("\n#\n\n".encode()) | ||
| 311 | f.write(orig_content) | ||
| 312 | |||
| 313 | def _create_new_recipe(newpv, md5, sha256, srcrev, srcbranch, srcsubdir_old, srcsubdir_new, workspace, tinfoil, rd, license_diff, new_licenses): | ||
| 295 | """Creates the new recipe under workspace""" | 314 | """Creates the new recipe under workspace""" |
| 296 | 315 | ||
| 297 | bpn = rd.getVar('BPN') | 316 | bpn = rd.getVar('BPN') |
| @@ -400,6 +419,11 @@ def _create_new_recipe(newpv, md5, sha256, srcrev, srcbranch, srcsubdir_old, src | |||
| 400 | else: | 419 | else: |
| 401 | logger.info('Source subdirectory has changed, updating S value') | 420 | logger.info('Source subdirectory has changed, updating S value') |
| 402 | 421 | ||
| 422 | if license_diff: | ||
| 423 | newlicchksum = " ".join(["file://{};md5={}".format(l["path"], l["actual_md5"]) + (";beginline={}".format(l["beginline"]) if l["beginline"] else "") + (";endline={}".format(l["endline"]) if l["endline"] else "") for l in new_licenses]) | ||
| 424 | newvalues["LIC_FILES_CHKSUM"] = newlicchksum | ||
| 425 | _add_license_diff_to_recipe(fullpath, license_diff) | ||
| 426 | |||
| 403 | rd = tinfoil.parse_recipe_file(fullpath, False) | 427 | rd = tinfoil.parse_recipe_file(fullpath, False) |
| 404 | oe.recipeutils.patch_recipe(rd, fullpath, newvalues) | 428 | oe.recipeutils.patch_recipe(rd, fullpath, newvalues) |
| 405 | 429 | ||
| @@ -427,6 +451,47 @@ def _check_git_config(): | |||
| 427 | if configerr: | 451 | if configerr: |
| 428 | raise DevtoolError('Your git configuration is incomplete which will prevent rebases from working:\n' + '\n'.join(configerr)) | 452 | raise DevtoolError('Your git configuration is incomplete which will prevent rebases from working:\n' + '\n'.join(configerr)) |
| 429 | 453 | ||
| 454 | def _extract_licenses(srcpath, recipe_licenses): | ||
| 455 | licenses = [] | ||
| 456 | for url in recipe_licenses.split(): | ||
| 457 | license = {} | ||
| 458 | (type, host, path, user, pswd, parm) = bb.fetch.decodeurl(url) | ||
| 459 | license['path'] = path | ||
| 460 | license['md5'] = parm.get('md5', '') | ||
| 461 | license['beginline'], license['endline'] = 0, 0 | ||
| 462 | if 'beginline' in parm: | ||
| 463 | license['beginline'] = int(parm['beginline']) | ||
| 464 | if 'endline' in parm: | ||
| 465 | license['endline'] = int(parm['endline']) | ||
| 466 | license['text'] = [] | ||
| 467 | with open(os.path.join(srcpath, path), 'rb') as f: | ||
| 468 | import hashlib | ||
| 469 | actual_md5 = hashlib.md5() | ||
| 470 | lineno = 0 | ||
| 471 | for line in f: | ||
| 472 | lineno += 1 | ||
| 473 | if (lineno >= license['beginline']) and ((lineno <= license['endline']) or not license['endline']): | ||
| 474 | license['text'].append(line.decode(errors='ignore')) | ||
| 475 | actual_md5.update(line) | ||
| 476 | license['actual_md5'] = actual_md5.hexdigest() | ||
| 477 | licenses.append(license) | ||
| 478 | return licenses | ||
| 479 | |||
| 480 | def _generate_license_diff(old_licenses, new_licenses): | ||
| 481 | need_diff = False | ||
| 482 | for l in new_licenses: | ||
| 483 | if l['md5'] != l['actual_md5']: | ||
| 484 | need_diff = True | ||
| 485 | break | ||
| 486 | if need_diff == False: | ||
| 487 | return None | ||
| 488 | |||
| 489 | import difflib | ||
| 490 | diff = '' | ||
| 491 | for old, new in zip(old_licenses, new_licenses): | ||
| 492 | for line in difflib.unified_diff(old['text'], new['text'], old['path'], new['path']): | ||
| 493 | diff = diff + line | ||
| 494 | return diff | ||
| 430 | 495 | ||
| 431 | def upgrade(args, config, basepath, workspace): | 496 | def upgrade(args, config, basepath, workspace): |
| 432 | """Entry point for the devtool 'upgrade' subcommand""" | 497 | """Entry point for the devtool 'upgrade' subcommand""" |
| @@ -480,14 +545,18 @@ def upgrade(args, config, basepath, workspace): | |||
| 480 | check_prerelease_version(args.version, 'devtool upgrade') | 545 | check_prerelease_version(args.version, 'devtool upgrade') |
| 481 | 546 | ||
| 482 | rf = None | 547 | rf = None |
| 548 | license_diff = None | ||
| 483 | try: | 549 | try: |
| 484 | logger.info('Extracting current version source...') | 550 | logger.info('Extracting current version source...') |
| 485 | rev1, srcsubdir1 = standard._extract_source(srctree, False, 'devtool-orig', False, config, basepath, workspace, args.fixed_setup, rd, tinfoil, no_overrides=args.no_overrides) | 551 | rev1, srcsubdir1 = standard._extract_source(srctree, False, 'devtool-orig', False, config, basepath, workspace, args.fixed_setup, rd, tinfoil, no_overrides=args.no_overrides) |
| 552 | old_licenses = _extract_licenses(srctree, rd.getVar('LIC_FILES_CHKSUM')) | ||
| 486 | logger.info('Extracting upgraded version source...') | 553 | logger.info('Extracting upgraded version source...') |
| 487 | rev2, md5, sha256, srcbranch, srcsubdir2 = _extract_new_source(args.version, srctree, args.no_patch, | 554 | rev2, md5, sha256, srcbranch, srcsubdir2 = _extract_new_source(args.version, srctree, args.no_patch, |
| 488 | args.srcrev, args.srcbranch, args.branch, args.keep_temp, | 555 | args.srcrev, args.srcbranch, args.branch, args.keep_temp, |
| 489 | tinfoil, rd) | 556 | tinfoil, rd) |
| 490 | rf, copied = _create_new_recipe(args.version, md5, sha256, args.srcrev, srcbranch, srcsubdir1, srcsubdir2, config.workspace_path, tinfoil, rd) | 557 | new_licenses = _extract_licenses(srctree, rd.getVar('LIC_FILES_CHKSUM')) |
| 558 | license_diff = _generate_license_diff(old_licenses, new_licenses) | ||
| 559 | rf, copied = _create_new_recipe(args.version, md5, sha256, args.srcrev, srcbranch, srcsubdir1, srcsubdir2, config.workspace_path, tinfoil, rd, license_diff, new_licenses) | ||
| 491 | except bb.process.CmdError as e: | 560 | except bb.process.CmdError as e: |
| 492 | _upgrade_error(e, rf, srctree) | 561 | _upgrade_error(e, rf, srctree) |
| 493 | except DevtoolError as e: | 562 | except DevtoolError as e: |
| @@ -502,6 +571,8 @@ def upgrade(args, config, basepath, workspace): | |||
| 502 | 571 | ||
| 503 | logger.info('Upgraded source extracted to %s' % srctree) | 572 | logger.info('Upgraded source extracted to %s' % srctree) |
| 504 | logger.info('New recipe is %s' % rf) | 573 | logger.info('New recipe is %s' % rf) |
| 574 | if license_diff: | ||
| 575 | logger.info('License checksums have been updated in the new recipe; please refer to it for the difference between the old and the new license texts.') | ||
| 505 | finally: | 576 | finally: |
| 506 | tinfoil.shutdown() | 577 | tinfoil.shutdown() |
| 507 | return 0 | 578 | return 0 |
