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 5bf8c534 Migrate all revision creators to use quarantine
5bf8c534 is described below

commit 5bf8c53410555ef4e2d438f24ab07b4c975eef3c
Author: Sean B. Palmer <[email protected]>
AuthorDate: Wed Mar 4 14:47:04 2026 +0000

    Migrate all revision creators to use quarantine
---
 atr/post/draft.py              | 12 +++++++++---
 atr/post/revisions.py          |  4 +++-
 atr/storage/writers/keys.py    |  4 +++-
 atr/storage/writers/release.py | 26 ++++++++++++++++++++------
 atr/storage/writers/vote.py    |  8 ++++++--
 atr/tasks/sbom.py              |  8 ++++++--
 6 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/atr/post/draft.py b/atr/post/draft.py
index af36550b..7ce142f2 100644
--- a/atr/post/draft.py
+++ b/atr/post/draft.py
@@ -58,13 +58,15 @@ async def cache_reset(
     description = "Empty revision to restart all checks without cache for the 
whole release candidate draft"
     async with storage.write(session) as write:
         wacp = await write.as_project_committee_participant(str(project_name))
-        await wacp.revision.create_revision(
+        result = await wacp.revision.create_revision_with_quarantine(
             str(project_name),
             str(version_name),
             session.uid,
             description=description,
             reset_to_global_cache=True,
         )
+        if isinstance(result, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for cache reset")
 
     return await session.redirect(
         get.compose.selected,
@@ -203,13 +205,15 @@ async def recheck(
     description = "Empty revision to restart all checks without cache for the 
whole release candidate draft"
     async with storage.write(session) as write:
         wacp = await write.as_project_committee_participant(str(project_name))
-        await wacp.revision.create_revision(
+        result = await wacp.revision.create_revision_with_quarantine(
             str(project_name),
             str(version_name),
             session.uid,
             description=description,
             set_local_cache=True,
         )
+        if isinstance(result, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for recheck")
 
     return await session.redirect(
         get.compose.selected,
@@ -285,9 +289,11 @@ async def sbomgen(
                 if not success:
                     raise web.FlashError("Internal error: SBOM generation 
timed out")
 
-            await wacp.revision.create_revision(
+            result = await wacp.revision.create_revision_with_quarantine(
                 str(project_name), str(version_name), session.uid, 
description=description, modify=modify
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for SBOM generation")
 
     except Exception as e:
         log.exception("Error generating SBOM:")
diff --git a/atr/post/revisions.py b/atr/post/revisions.py
index 1c994030..e7bdd1b6 100644
--- a/atr/post/revisions.py
+++ b/atr/post/revisions.py
@@ -70,9 +70,11 @@ async def _set_revision(
     description = f"Copy of revision {selected_revision_number} through web 
interface"
     async with storage.write(session) as write:
         wacp = await write.as_project_committee_participant(project_name)
-        new_revision = await wacp.revision.create_revision(
+        new_revision = await wacp.revision.create_revision_with_quarantine(
             project_name, version_name, session.uid, description=description, 
clone_from=selected_revision_number
         )
+        if isinstance(new_revision, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for revision copy")
         return await session.redirect(
             get.revisions.selected,
             success=f"Copied revision {selected_revision_number} to new latest 
revision, {new_revision.number}",
diff --git a/atr/storage/writers/keys.py b/atr/storage/writers/keys.py
index 4b3cff77..2bbbe86e 100644
--- a/atr/storage/writers/keys.py
+++ b/atr/storage/writers/keys.py
@@ -490,9 +490,11 @@ class CommitteeParticipant(FoundationCommitter):
                 path_in_new_revision = path / "KEYS"
                 await aiofiles.os.remove(path_in_new_revision)
 
-            await self.__write_as.revision.create_revision(
+            result = await 
self.__write_as.revision.create_revision_with_quarantine(
                 project_name, version_name, self.__asf_uid, 
description=description, modify=modify
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for KEYS file 
removal")
         return outcomes
 
     def __block_models(self, key_block: str, ldap_data: dict[str, str]) -> 
list[types.Key | Exception]:
diff --git a/atr/storage/writers/release.py b/atr/storage/writers/release.py
index 79735012..6a743e7f 100644
--- a/atr/storage/writers/release.py
+++ b/atr/storage/writers/release.py
@@ -172,9 +172,11 @@ class CommitteeParticipant(FoundationCommitter):
             await aiofiles.os.rmdir(path_to_remove)
 
         try:
-            await self.__write_as.revision.create_revision(
+            result = await 
self.__write_as.revision.create_revision_with_quarantine(
                 project_name, version_name, self.__asf_uid, 
description=description, modify=modify
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for empty directory 
deletion")
         except types.FailedError as e:
             return str(e)
         return None
@@ -212,9 +214,11 @@ class CommitteeParticipant(FoundationCommitter):
             # Delete the file
             await aiofiles.os.remove(path_in_new_revision)
 
-        await self.__write_as.revision.create_revision(
+        result = await 
self.__write_as.revision.create_revision_with_quarantine(
             project_name, version, self.__asf_uid, description=description, 
modify=modify
         )
+        if isinstance(result, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for file deletion")
         return metadata_files_deleted
 
     async def generate_hash_file(self, project_name: str, version_name: str, 
rel_path: pathlib.Path) -> None:
@@ -251,9 +255,11 @@ class CommitteeParticipant(FoundationCommitter):
             async with aiofiles.open(hash_path_in_new_revision, "w") as f:
                 await f.write(f"{hash_value}  {rel_path.name}\n")
 
-        await self.__write_as.revision.create_revision(
+        result = await 
self.__write_as.revision.create_revision_with_quarantine(
             project_name, version_name, self.__asf_uid, 
description=description, modify=modify
         )
+        if isinstance(result, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for hash generation")
 
     async def import_from_svn(
         self, project_name: str, version_name: str, svn_url: str, revision: 
str, target_subdirectory: str | None
@@ -297,9 +303,11 @@ class CommitteeParticipant(FoundationCommitter):
             )
 
         try:
-            await self.__write_as.revision.create_revision(
+            result = await 
self.__write_as.revision.create_revision_with_quarantine(
                 project_name, version_name, self.__asf_uid, 
description=description, modify=modify
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for file move")
         except types.FailedError as e:
             return str(e), moved_files_names, skipped_files_names
         return None, moved_files_names, skipped_files_names
@@ -377,9 +385,11 @@ class CommitteeParticipant(FoundationCommitter):
             renamed_count = await self.__remove_rc_tags_revision(path, 
error_messages)
 
         try:
-            await self.__write_as.revision.create_revision(
+            result = await 
self.__write_as.revision.create_revision_with_quarantine(
                 project_name, version_name, self.__asf_uid, 
description=description, modify=modify
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for RC tag removal")
         except types.FailedError as e:
             return str(e), renamed_count, error_messages
         return None, renamed_count, error_messages
@@ -444,7 +454,11 @@ class CommitteeParticipant(FoundationCommitter):
         await self.__data.refresh(release)
 
         description = "Creation of empty release candidate draft through web 
interface"
-        await self.__write_as.revision.create_revision(project_name, version, 
self.__asf_uid, description=description)
+        result = await 
self.__write_as.revision.create_revision_with_quarantine(
+            project_name, version, self.__asf_uid, description=description
+        )
+        if isinstance(result, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for empty release 
creation")
         self.__write_as.append_to_audit_log(
             asf_uid=self.__asf_uid,
             project_name=project_name,
diff --git a/atr/storage/writers/vote.py b/atr/storage/writers/vote.py
index 1f276071..7c531b62 100644
--- a/atr/storage/writers/vote.py
+++ b/atr/storage/writers/vote.py
@@ -294,9 +294,11 @@ class CommitteeMember(CommitteeParticipant):
             success_message = "Vote marked as passed"
 
             description = "Create a preview revision from the last candidate 
draft"
-            await self.__write_as.revision.create_revision(
+            result = await 
self.__write_as.revision.create_revision_with_quarantine(
                 project_name, release.version, self.__asf_uid, 
description=description
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for manual vote 
resolution")
         else:
             release.phase = sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT
             await self.__data.commit()
@@ -381,9 +383,11 @@ class CommitteeMember(CommitteeParticipant):
             success_message = "Vote marked as passed"
 
             description = "Create a preview revision from the last candidate 
draft"
-            await self.__write_as.revision.create_revision(
+            result = await 
self.__write_as.revision.create_revision_with_quarantine(
                 project_name, release.version, self.__asf_uid, 
description=description
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for vote resolution")
             if (voting_round == 2) and (release.podling_thread_id is not None):
                 round_one_email_address, round_one_message_id = await 
util.email_mid_from_thread_id(
                     release.podling_thread_id
diff --git a/atr/tasks/sbom.py b/atr/tasks/sbom.py
index 5a6539f0..61eb2ada 100644
--- a/atr/tasks/sbom.py
+++ b/atr/tasks/sbom.py
@@ -111,9 +111,11 @@ 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())
 
-            await wacp.revision.create_revision(
+            result = await wacp.revision.create_revision_with_quarantine(
                 args.project_name, args.version_name, args.asf_uid or 
"unknown", description=description, modify=modify
             )
+            if isinstance(result, sql.Quarantined):
+                raise RuntimeError("Unexpected quarantine for SBOM 
augmentation")
 
     return results.SBOMAugment(
         kind="sbom_augment",
@@ -180,9 +182,11 @@ 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())
 
-        await wacp.revision.create_revision(
+        result = await wacp.revision.create_revision_with_quarantine(
             args.project_name, args.version_name, args.asf_uid or "unknown", 
description=description, modify=modify
         )
+        if isinstance(result, sql.Quarantined):
+            raise RuntimeError("Unexpected quarantine for SBOM vulnerability 
scan")
 
     return results.SBOMOSVScan(
         kind="sbom_osv_scan",


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

Reply via email to