contrib: add a api promote mode to apiage

Promote an API from preview to stable, after the build tags are removed
from the Go source code. This mode can be used to help move apis that
are now stable out of preview state in our api-status.json file.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
John Mulligan 2022-08-22 14:10:23 -04:00 committed by mergify[bot]
parent 94489bef9d
commit 5a7d149d50
1 changed files with 47 additions and 0 deletions

View File

@ -172,6 +172,39 @@ def api_find_updates(tracked, values):
return found return found
def api_promote(tracked, src, values):
changes = problems = 0
for pkg, pkg_api in src.items():
src_stable = pkg_api.get("stable_api", [])
src_preview = pkg_api.get("preview_api", [])
tracked_stable = tracked.get(pkg, {}).get("stable_api", [])
tracked_preview = tracked.get(pkg, {}).get("preview_api", [])
indexed_stable = {a.get("name", ""): a for a in tracked_stable}
indexed_preview = {a.get("name", ""): a for a in tracked_preview}
for api in src_stable:
name = api.get("name", "")
if name in indexed_preview and name not in indexed_stable:
# need to promote this api
if values.get("added_in_version"):
# track some metadata. why not right?
api["added_in_version"] = indexed_preview[name].get("added_in_version", "")
api["became_stable_version"] = values["added_in_version"]
tracked_preview[:] = [a for n, a in indexed_preview.items() if n != name]
tracked_stable.append(api)
print("promoting to stable: {}:{}".format(pkg, name))
changes += 1
elif name in indexed_preview and name in indexed_preview:
print("bad state: {}:{} found in both preview and stable"
.format(pkg, name))
problems += 1
elif name not in indexed_preview and name not in indexed_stable:
print("api not found in preview: {}:{}".format(pkg, name))
problems += 1
# else api is already stable. do nothing.
return changes, problems
def format_markdown(tracked, outfh): def format_markdown(tracked, outfh):
print("<!-- GENERATED FILE: DO NOT EDIT DIRECTLY -->", file=outfh) print("<!-- GENERATED FILE: DO NOT EDIT DIRECTLY -->", file=outfh)
print("", file=outfh) print("", file=outfh)
@ -341,6 +374,7 @@ def main():
"fix-versions", "fix-versions",
"find-updates", "find-updates",
"updates-to-markdown", "updates-to-markdown",
"promote",
), ),
default="compare", default="compare",
help="either update current state or compare current state to source", help="either update current state or compare current state to source",
@ -453,6 +487,19 @@ def main():
print() print()
if not (updates_needed.get("preview") or updates_needed.get("deprecated")): if not (updates_needed.get("preview") or updates_needed.get("deprecated")):
sys.exit(1) sys.exit(1)
elif cli.mode == "promote":
values = {}
_setif(values, "added_in_version", cli.added_in_version)
ccount, pcount = api_promote(
api_tracked,
api_src,
values,
)
print("found {} apis to promote".format(ccount))
if pcount:
print(f"error: {pcount} problems detected", file=sys.stderr)
sys.exit(1)
write_json(cli.current, api_tracked)
elif cli.mode == "write-doc": elif cli.mode == "write-doc":
write_markdown(cli.document, api_tracked) write_markdown(cli.document, api_tracked)
elif cli.mode == "updates-to-markdown": elif cli.mode == "updates-to-markdown":