This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch sbp
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/sbp by this push:
     new 5e8f907b Migrate revision creators that modify metadata
5e8f907b is described below

commit 5e8f907b3b8f59e8167343559725b32c0bef0b6e
Author: Sean B. Palmer <[email protected]>
AuthorDate: Wed Feb 18 16:42:16 2026 +0000

    Migrate revision creators that modify metadata
---
 atr/post/draft.py | 23 +++++++++++++++--------
 atr/tasks/sbom.py | 33 +++++++++++++++++----------------
 2 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/atr/post/draft.py b/atr/post/draft.py
index 5568081b..b3a1e0cc 100644
--- a/atr/post/draft.py
+++ b/atr/post/draft.py
@@ -17,6 +17,8 @@
 
 from __future__ import annotations
 
+from typing import TYPE_CHECKING
+
 import aiofiles.os
 import aioshutil
 import asfquart.base as base
@@ -33,6 +35,9 @@ import atr.storage as storage
 import atr.util as util
 import atr.web as web
 
+if TYPE_CHECKING:
+    import pathlib
+
 
 @post.committer("/compose/<project_name>/<version_name>")
 @post.empty()
@@ -196,13 +201,11 @@ async def sbomgen(session: web.Committer, project_name: 
str, version_name: str,
         description = "SBOM generation through web interface"
         async with storage.write(session) as write:
             wacp = await write.as_project_committee_participant(project_name)
-            async with wacp.revision.create_and_manage(
-                project_name, version_name, session.uid, 
description=description
-            ) as creating:
-                # Uses new_revision_number in a functional way
-                path_in_new_revision = creating.interim_path / rel_path
+
+            async def modify(path: pathlib.Path, old_rev: sql.Revision | None) 
-> None:
+                path_in_new_revision = path / rel_path
                 sbom_path_rel = rel_path.with_suffix(rel_path.suffix + 
".cdx.json").name
-                sbom_path_in_new_revision = creating.interim_path / 
rel_path.parent / sbom_path_rel
+                sbom_path_in_new_revision = path / rel_path.parent / 
sbom_path_rel
 
                 # Check that the source file exists in the new revision
                 if not await aiofiles.os.path.exists(path_in_new_revision):
@@ -214,17 +217,21 @@ async def sbomgen(session: web.Committer, project_name: 
str, version_name: str,
                     raise base.ASFQuartException("SBOM file already exists", 
errorcode=400)
 
                 # This shouldn't happen as we need a revision to kick the task 
off from
-                if creating.old is None:
+                if old_rev is None:
                     raise web.FlashError("Internal error: Revision not found")
 
                 # Create and queue the task, using paths within the new 
revision
                 sbom_task = await wacp.sbom.generate_cyclonedx(
-                    project_name, version_name, creating.old.number, 
path_in_new_revision, sbom_path_in_new_revision
+                    project_name, version_name, old_rev.number, 
path_in_new_revision, sbom_path_in_new_revision
                 )
                 success = await interaction.wait_for_task(sbom_task)
                 if not success:
                     raise web.FlashError("Internal error: SBOM generation 
timed out")
 
+            await wacp.revision.create_revision(
+                project_name, version_name, session.uid, 
description=description, modify=modify
+            )
+
     except Exception as e:
         log.exception("Error generating SBOM:")
         await quart.flash(f"Error generating SBOM: {e!s}", "error")
diff --git a/atr/tasks/sbom.py b/atr/tasks/sbom.py
index 0ed004ab..9b242d0a 100644
--- a/atr/tasks/sbom.py
+++ b/atr/tasks/sbom.py
@@ -18,7 +18,8 @@
 import asyncio
 import json
 import os
-from typing import TYPE_CHECKING, Any, Final
+import pathlib
+from typing import Any, Final
 
 import aiofiles
 import aiofiles.os
@@ -28,14 +29,12 @@ import atr.config as config
 import atr.log as log
 import atr.models.results as results
 import atr.models.schema as schema
+import atr.models.sql as sql
 import atr.sbom as sbom
 import atr.storage as storage
 import atr.tasks.checks as checks
 import atr.util as util
 
-if TYPE_CHECKING:
-    import pathlib
-
 _CONFIG: Final = config.get()
 
 
@@ -100,10 +99,10 @@ async def augment(args: FileArgs) -> results.Results | 
None:
         description = "SBOM augmentation through web interface"
         async with storage.write(args.asf_uid) as write:
             wacp = await 
write.as_project_committee_participant(args.project_name)
-            async with wacp.revision.create_and_manage(
-                args.project_name, args.version_name, args.asf_uid or 
"unknown", description=description
-            ) as creating:
-                new_full_path = creating.interim_path / args.file_path
+
+            async def modify(path: pathlib.Path, _old_rev: sql.Revision | 
None) -> None:
+                nonlocal new_full_path, new_full_path_str
+                new_full_path = path / args.file_path
                 new_full_path_str = str(new_full_path)
                 # Write to the new revision
                 log.info(f"Writing augmented SBOM to {new_full_path_str}")
@@ -111,8 +110,9 @@ async def augment(args: FileArgs) -> results.Results | None:
                 async with aiofiles.open(new_full_path, "w", encoding="utf-8") 
as f:
                     await f.write(merged.dumps())
 
-            if creating.new is None:
-                raise RuntimeError("Internal error: New revision not found")
+            await wacp.revision.create_revision(
+                args.project_name, args.version_name, args.asf_uid or 
"unknown", description=description, modify=modify
+            )
 
     return results.SBOMAugment(
         kind="sbom_augment",
@@ -168,10 +168,10 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
     description = "SBOM vulnerability scan through web interface"
     async with storage.write(args.asf_uid) as write:
         wacp = await write.as_project_committee_participant(args.project_name)
-        async with wacp.revision.create_and_manage(
-            args.project_name, args.version_name, args.asf_uid or "unknown", 
description=description
-        ) as creating:
-            new_full_path = creating.interim_path / args.file_path
+
+        async def modify(path: pathlib.Path, _old_rev: sql.Revision | None) -> 
None:
+            nonlocal new_full_path, new_full_path_str
+            new_full_path = path / args.file_path
             new_full_path_str = str(new_full_path)
             # Write to the new revision
             log.info(f"Writing updated SBOM to {new_full_path_str}")
@@ -179,8 +179,9 @@ async def osv_scan(args: FileArgs) -> results.Results | 
None:
             async with aiofiles.open(new_full_path, "w", encoding="utf-8") as 
f:
                 await f.write(merged.dumps())
 
-        if creating.new is None:
-            raise RuntimeError("Internal error: New revision not found")
+        await wacp.revision.create_revision(
+            args.project_name, args.version_name, args.asf_uid or "unknown", 
description=description, modify=modify
+        )
 
     return results.SBOMOSVScan(
         kind="sbom_osv_scan",


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to