From d410c6f69628daf27049df0da614ab6b3309eaea Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Tue, 22 Sep 2026 10:15:07 -0400 Subject: [PATCH] manifest-from-tree: forgeext is a component forgeext ships from its own repository with its own recipe and pin, and 62 covers entries across the catalog name it - but the tree manifest the coverage lint runs on did not know the component existed, so every one of those entries selected nothing. The lint exits 1 on an empty entry, so the merge would have failed on it; worse, until then forgeext's sources were not coverage-checked at all. A pin nothing has been pushed to yet (SRCREV all zeros, which is how a work branch carries this component until the merge) names the component with no files instead of failing the whole manifest. The lint then reports its entries as empty and exits 1, which is what an unbumped pin should do, and the script stays usable in the meantime. Proof: the script names forgeext and says its pin is not set; with the component's file list stood in, the 31 empty (forgeext, ...) entries become zero, and the 32 that remain are forgectrl and grblHAL paths that do not exist at their pinned commits yet - the pre-push state the work branches are in. --- scripts/manifest-from-tree.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/scripts/manifest-from-tree.py b/scripts/manifest-from-tree.py index c0c5af1..745c912 100644 --- a/scripts/manifest-from-tree.py +++ b/scripts/manifest-from-tree.py @@ -37,6 +37,7 @@ from forgetest import manifest as manifest_mod # noqa: E402 RECIPES = [ # (component, recipe path relative to the repo or meta-openglow, layer) ("forgectrl", "meta-forgefirm/recipes-forgefirm/forgectrl/forgectrl.bb", "forgefirm"), + ("forgeext", "meta-forgefirm/recipes-forgefirm/forgeext/forgeext.bb", "forgefirm"), ("grblhal-glowforge", "meta-forgefirm/recipes-forgefirm/grblhal-glowforge/grblhal-glowforge.bb", "forgefirm"), ("forgefirm-app", "meta-forgefirm/recipes-forgefirm/forgefirm-app/forgefirm-app.inc", "forgefirm"), ("kernel-module-glowforge", "meta-glowforge-bsp/recipes-kernel/kernel-modules/kernel-module-glowforge.bb", "meta-openglow"), @@ -201,12 +202,21 @@ def main(argv=None): base = REPO if layer == "forgefirm" else args.meta_openglow path = os.path.join(base, rel) url, rev = parse_recipe(path) - repo = fetch(url, rev, args.cache) files = [] - ls_tree(repo, rev, url, args.cache, "", files) - files.sort() + if set(rev) == {"0"}: + # A pin nothing has been pushed to yet, which is how a work + # branch carries a component until the merge. The component is + # named with no files, so the coverage lint reports its covers + # entries as empty and fails - which is what a pin that has not + # been bumped should do - rather than the manifest failing to + # build at all. + print("%s: the pin is not set (nothing pushed to it yet): no files" % name, file=sys.stderr) + else: + repo = fetch(url, rev, args.cache) + ls_tree(repo, rev, url, args.cache, "", files) + files.sort() + print("%s: %s (%d files)" % (name, rev[:12], len(files)), file=sys.stderr) components[name] = {"srcrev": rev, "source": url, "files": files, "recipes": [os.path.basename(rel)]} - print("%s: %s (%d files)" % (name, rev[:12], len(files)), file=sys.stderr) for name, rel, layer, recipe in FILE_COMPONENTS: base = REPO if layer == "forgefirm" else args.meta_openglow files = dir_files(os.path.join(base, rel))