Source code
Revision control
Copy as Markdown
Other Tools
# 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
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, sort_keys=True)
return inputs
if __name__ == "__main__":
main(sys.stdout, *sys.argv[1:])