blob: 1d020e24dadf5b14ed84d7c7dc9b826c7c258176 [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import itertools
import json
import os
import pathlib
import sys
from sdk_common import (
Atom,
Validator,
gather_dependencies,
)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--id", help="The atom's identifier", required=True)
parser.add_argument("--out", help="Path to the output file", required=True)
parser.add_argument("--depfile", help="Path to the depfile", required=True)
parser.add_argument(
"--deps", help="List of manifest paths for dependencies", nargs="*"
)
parser.add_argument(
"--file",
help="A (destination <-- source) mapping",
action="append",
nargs=2,
)
parser.add_argument(
"--file-list", help="A file containing destination=source mappings"
)
parser.add_argument(
"--gn-label", help="GN label of the atom", required=True
)
parser.add_argument("--category", help="Publication level", required=True)
parser.add_argument(
"--meta",
help="Path to the atom's metadata file in the SDK. Required by default unless --noop-atom is set to True.",
)
parser.add_argument(
"--noop-atom",
action="store_true",
help="Whether the atom is a sdk_noop_atom. Sets the atom's meta to be empty. Defaults to False.",
)
parser.add_argument("--type", help="Type of the atom", required=True)
parser.add_argument("--plasa", help="Path to the plasa metadata, optional")
parser.add_argument("--area", help="API council area that owns the atom")
parser.add_argument(
"--areas-file-path",
type=pathlib.Path,
help="Path to docs/contribute/governance/areas/_areas.yaml",
required=True,
)
args = parser.parse_args()
if args.meta is None and not args.noop_atom:
parser.error("--meta is required.")
# Gather the definitions of other atoms this atom depends on.
(deps, atoms) = gather_dependencies(args.deps)
# Build the list of files making up this atom.
extra_files = []
if args.file_list:
with open(args.file_list, "r") as file_list_file:
extra_files = [
line.strip().split("=", 1)
for line in file_list_file.readlines()
]
files = (
dict(itertools.chain(args.file, extra_files))
if args.file
else dict(extra_files)
)
plasa_fragments = []
if args.plasa:
with open(args.plasa, "r") as plasa_file:
data = json.load(plasa_file)
for d in data:
files[d["dest"]] = d["path"]
plasa_fragments += [d["dest"]]
atoms.update(
[
Atom(
{
"id": args.id,
"meta": args.meta or "",
"gn-label": args.gn_label,
"category": args.category,
"area": args.area,
"deps": sorted(list(deps)),
"files": [
{
"source": os.path.normpath(source),
"destination": os.path.normpath(destination),
}
for destination, source in files.items()
],
"type": args.type,
"plasa": plasa_fragments,
}
)
]
)
v = Validator.from_areas_file_path(areas_file=args.areas_file_path)
violations = [*v.detect_violations(args.category, atoms)]
if violations:
print("Errors detected!")
for msg in violations:
print(msg)
return 1
manifest = {
"ids": [args.id],
"atoms": [a.json for a in sorted(list(atoms))],
}
with open(os.path.abspath(args.out), "w") as out:
json.dump(
manifest, out, indent=2, sort_keys=True, separators=(",", ": ")
)
with open(args.depfile, "w") as dep_file:
dep_file.write(
"{}: {}\n".format(
args.out,
# Always write relative paths to depfiles. See more information
# from https://fxbug.dev/42155246.
" ".join(os.path.relpath(source) for _, source in extra_files),
),
)
if __name__ == "__main__":
sys.exit(main())