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(
"--builtin-addons",
type=str,
dest="builtinsdir",
action="store",
help=(
"The build sub-directory containing builtin add-ons to include in the omni.ja"
),
)
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.builtinsdir:
builtins = list()
for p in registry.match("%s/*/manifest.json" % args.builtinsdir):
dirname = mozpath.basename(get_child(args.builtinsdir, p))
builtins_entry = dict()
# collect addon id and version from each of the builtins manifest.json files.
webext_manifest = json.loads(registry[p].read())
builtins_entry["addon_id"] = webext_manifest["browser_specific_settings"][
"gecko"
]["id"]
builtins_entry["addon_version"] = webext_manifest["version"]
builtins.append(builtins_entry)
def sort_by_dirname(entry):
return entry["res_url"]
listing["builtins"] = sorted(builtins, key=sort_by_dirname)
json.dump(listing, output, sort_keys=True)
return inputs
if __name__ == "__main__":
main(sys.stdout, *sys.argv[1:])