| # -*- coding: utf-8 -*- |
| # Copyright 2020 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Dumps a JSON file that describes objects installed for the given boards. |
| |
| e.g., |
| |
| { |
| 'bob': { |
| 'chromeos-base/chromeos-chrome': [ |
| '/opt/google/chrome/chrome', |
| '/opt/google/chrome/libchrome.so' |
| ] |
| } |
| } |
| """ |
| |
| from __future__ import print_function |
| |
| import collections |
| import json |
| import os |
| import sys |
| |
| from chromite.lib import commandline, cros_build_lib, portage_util |
| |
| |
| assert sys.version_info >= (3, 6), 'This module requires Python 3.6+' |
| |
| |
| def get_all_package_objects(board): |
| """Given a board, returns a dict of {package_name: [objects_in_package]} |
| |
| `objects_in_package` is specifically talking about objects of type `obj` |
| which were installed by the given package. In other words, this will |
| enumerate all regular files (e.g., excluding directories and symlinks) |
| installed by a package. |
| |
| This dict comprises all packages currently installed on said board. |
| """ |
| db = portage_util.PortageDB(root=os.path.join('/build', board)) |
| |
| result = collections.defaultdict(set) |
| for package in db.InstalledPackages(): |
| objects = ( |
| '/' + path for typ, path in package.ListContents() if typ == package.OBJ |
| ) |
| result['%s/%s' % (package.category, package.package)].update(objects) |
| |
| return {k: sorted(v) for k, v in result.items()} |
| |
| |
| def main(argv): |
| cros_build_lib.AssertInsideChroot() |
| |
| parser = commandline.ArgumentParser(description=__doc__) |
| parser.add_argument( |
| '--output', required=True, help='File to write results to') |
| parser.add_argument('board', nargs='+') |
| opts = parser.parse_args(argv) |
| |
| output = opts.output |
| if output == '-': |
| output = '/dev/stdout' |
| |
| results = {x: get_all_package_objects(x) for x in opts.board} |
| with open(output, 'w') as f: |
| json.dump(results, f) |