alitheg commented on code in PR #1376:
URL:
https://github.com/apache/tooling-trusted-releases/pull/1376#discussion_r3557506845
##########
atr/storage/writers/catalogue.py:
##########
@@ -227,6 +222,111 @@ async def delete_project(self, project_key:
safe.ProjectKey) -> None:
raise
self.__write_as.append_to_audit_log(asf_uid=self.__asf_uid,
deleted_project=key)
+ async def import_catalogue_csvs(
+ self, rows_by_table: dict[str, list[dict[str, str]]], committee_key:
str
+ ) -> catalogue_diff.CatalogueDiff:
+ # Recompute the diff against a snapshot taken inside this transaction,
under the write lock
+ await self.__data.begin_immediate()
+ self.__data.expire_all()
+ try:
+ snapshot = await catalogue_import.build_snapshot(self.__data,
committee_key)
+ diff = catalogue_diff.classify_catalogue(rows_by_table, snapshot,
committee_key)
+ await self._apply_diff(diff)
+ await self.__data.commit()
+ except Exception:
+ await self.__data.rollback()
+ raise
+ self._audit_import(diff)
+ return diff
+
+ async def _apply_diff(self, diff: catalogue_diff.CatalogueDiff) -> None:
+ await self.__data.execute(sqlalchemy.text("PRAGMA
defer_foreign_keys=ON"))
+ # Adds in FK order: projects, then releases, then artifacts
+ for add in diff.adds:
+ if isinstance(add, catalogue_rows.ProjectRow):
+ self.__data.add(add.to_sql())
+ await self.__data.flush()
+ for add in diff.adds:
+ if isinstance(add, catalogue_rows.ReleaseRow):
+ self.__data.add(add.to_sql())
+ await self.__data.flush()
+ for add in diff.adds:
+ if isinstance(add, catalogue_rows.ArtifactRow):
+ self.__data.add(add.to_sql())
+ for move in diff.release_moves:
+ await self._move_one_release(move)
+ for rehome in diff.artifact_rehomes:
+ await self._rehome_one_artifact(rehome)
+ await self._assert_fk_integrity()
+
+ def _audit_import(self, diff: catalogue_diff.CatalogueDiff) -> None:
+ counts = diff.counts
+ self.__write_as.append_to_audit_log(
+ asf_uid=self.__asf_uid,
+ added=counts["add"],
+ moved=counts["release_move"],
+ rehomed=counts["artifact_rehome"],
+ conflicts=counts["conflict"],
+ )
+
+ async def _move_one_release(self, move: catalogue_diff.ReleaseMove) ->
None:
+ via = sql.validate_instrumented_attribute
+ old_key = move.key
+ version = str(move.row.version)
+ new_key = f"{move.to_project}-{version}"
+ await self.__data.execute(
+ sqlmodel.update(sql.Artifact)
+ .where(via(sql.Artifact.project_key) == move.from_project)
+ .where(via(sql.Artifact.version) == version)
+ .values(release_key=new_key, project_key=move.to_project)
+ )
+ await self.__data.execute(
+ sqlmodel.update(sql.LifecycleEvent)
+ .where(via(sql.LifecycleEvent.version_key) == old_key)
+ .values(version_key=new_key, project_key=move.to_project)
+ )
+ # Other release-key children re-point to the new key
+ for model, attr in repoint.RELEASE_KEY_REFS:
Review Comment:
Two issues here - 1. Claude was overzealous in finding release keys and I
missed it (it identified version_key there because it *is* called that in
LifecycleEvent - I'll raise a bug and fix later). 2. I neglected to note in
this part that tasks don't need moved since the whole admin page doesn't let
you edit projects that have already started using ATR properly (since mangling
releases, artifacts etc including on-disk and draft etc. just seems fraught
with peril). This is purely for catalogued projects/releases/artifacts which
exist in SVN but have no ATR-managed files anywhere. Which won't have tasks!
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]