mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 12:15:33 +00:00
277727ce36
It turns out that this check is the major bottleneck in this task. Simply catching the error caused by the duplicate files has the same effect, but is several orders of magnitude faster. MozReview-Commit-ID: 8vFyQ7VVYRD --HG-- extra : rebase_source : 59d724dafd8c9739869a70272e2c9d2778958ffe
97 lines
2.6 KiB
Python
97 lines
2.6 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
import argparse
|
|
import json
|
|
import os.path
|
|
import sys
|
|
|
|
import buildconfig
|
|
import mozpack.path as mozpath
|
|
|
|
from mozpack.copier import FileRegistry
|
|
from mozpack.manifests import InstallManifest
|
|
|
|
|
|
# A list of build manifests, and their relative base paths, from which to
|
|
# extract lists of install files. These vary depending on which backend we're
|
|
# using, so nonexistent manifests are ignored.
|
|
manifest_paths = (
|
|
('', '_build_manifests/install/dist_bin'),
|
|
('', 'faster/install_dist_bin'),
|
|
('browser', 'faster/install_dist_bin_browser'),
|
|
)
|
|
|
|
|
|
def get_registry(paths):
|
|
used_paths = set()
|
|
|
|
registry = FileRegistry()
|
|
for base, path in paths:
|
|
full_path = mozpath.join(buildconfig.topobjdir, path)
|
|
if not os.path.exists(full_path):
|
|
continue
|
|
|
|
used_paths.add(full_path)
|
|
|
|
reg = FileRegistry()
|
|
InstallManifest(full_path).populate_registry(reg)
|
|
|
|
for p, f in reg:
|
|
path = mozpath.join(base, p)
|
|
try:
|
|
registry.add(path, f)
|
|
except Exception:
|
|
pass
|
|
|
|
return registry, used_paths
|
|
|
|
|
|
def get_child(base, path):
|
|
"""Returns the nearest parent of `path` which is an immediate child of
|
|
`base`"""
|
|
|
|
dirname = mozpath.dirname(path)
|
|
while dirname != base:
|
|
path = dirname
|
|
dirname = mozpath.dirname(path)
|
|
return path
|
|
|
|
|
|
def main(output, *args):
|
|
parser = argparse.ArgumentParser(
|
|
description='Produces a JSON manifest of built-in add-ons')
|
|
parser.add_argument('--features', type=str, dest='featuresdir',
|
|
action='store', help=('The distribution sub-directory '
|
|
'containing feature add-ons'))
|
|
args = parser.parse_args(args)
|
|
|
|
registry, inputs = get_registry(manifest_paths)
|
|
|
|
dicts = {}
|
|
for path in registry.match('dictionaries/*.dic'):
|
|
base, ext = os.path.splitext(mozpath.basename(path))
|
|
dicts[base] = path
|
|
|
|
listing = {
|
|
"dictionaries": dicts,
|
|
}
|
|
|
|
if args.featuresdir:
|
|
features = set()
|
|
for p in registry.match('%s/*' % args.featuresdir):
|
|
features.add(mozpath.basename(get_child(args.featuresdir, p)))
|
|
|
|
listing["system"] = sorted(features)
|
|
|
|
json.dump(listing, output)
|
|
|
|
return inputs
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.stdout, *sys.argv[1:])
|