From c5be0e1e3d0ce77836e7c006a2d1320621e706e5 Mon Sep 17 00:00:00 2001 From: Lukas Wurzinger Date: Fri, 2 May 2025 01:11:00 +0200 Subject: [PATCH] fix topic sync --- src/forgesync/cli.py | 13 +++++++++++-- src/forgesync/forgejo.py | 11 +++++++++-- src/forgesync/github.py | 3 ++- src/forgesync/sync.py | 5 ++++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/forgesync/cli.py b/src/forgesync/cli.py index fffece2..d63ccc0 100644 --- a/src/forgesync/cli.py +++ b/src/forgesync/cli.py @@ -135,10 +135,15 @@ def main() -> None: if repo.fork or repo.mirror or repo.private: continue - if repo.name is None: + if repo.owner is None or repo.owner.login is None or repo.name is None: logger.fatal("Could not get name of Forgejo repository") exit(1) + topics_list = from_client.repository.repo_list_topics( + owner=repo.owner.login, + repo=repo.name, + ) + if args.filter is not None: pattern = compile(args.filter) if pattern.search(repo.name) is not None: @@ -150,7 +155,11 @@ def main() -> None: ) try: - synced_repo = syncer.sync(from_repo=repo, description=description) + synced_repo = syncer.sync( + from_repo=repo, + description=description, + topics=topics_list.topics if topics_list.topics is not None else [], + ) except SyncError as error: logger.fatal("Syncing failed: %s", error) exit(2) diff --git a/src/forgesync/forgejo.py b/src/forgesync/forgejo.py index 051f77f..a18cec9 100644 --- a/src/forgesync/forgejo.py +++ b/src/forgesync/forgejo.py @@ -37,6 +37,7 @@ class ForgejoSyncer(Syncer): self: Self, from_repo: ForgejoRepository, description: str, + topics: list[str], ) -> SyncedRepository: assert from_repo.name is not None self.logger.info("Synchronizing %s", from_repo.name) @@ -79,8 +80,6 @@ class ForgejoSyncer(Syncer): wiki_branch=from_repo.wiki_branch, ) - self.logger.info("Updated Forgejo repository %s", edited_repo.full_name) - if ( edited_repo.owner is None or edited_repo.owner.login is None @@ -91,6 +90,14 @@ class ForgejoSyncer(Syncer): ): raise SyncError("received malformed Forgejo repository") + self.client.repository.repo_update_topics( + owner=edited_repo.owner.login, + repo=edited_repo.name, + topics=topics, + ) + + self.logger.info("Updated Forgejo repository %s", edited_repo.full_name) + return SyncedRepository( new_owner=edited_repo.owner.login, orig_owner=from_repo.owner.login, diff --git a/src/forgesync/github.py b/src/forgesync/github.py index 24a5762..5113bd1 100644 --- a/src/forgesync/github.py +++ b/src/forgesync/github.py @@ -52,6 +52,7 @@ class GithubSyncer(Syncer): self: Self, from_repo: ForgejoRepository, description: str, + topics: list[str], ) -> SyncedRepository: if from_repo.name is None: raise SyncError("could not get Forgejo repository name") @@ -140,7 +141,7 @@ class GithubSyncer(Syncer): self.logger.info("Updated GitHub repository %s", repo.full_name) - repo.replace_topics(from_repo.topics if from_repo.topics is not None else []) + repo.replace_topics(topics=topics) self.logger.info("Replaced topics on GitHub repository %s", repo.full_name) diff --git a/src/forgesync/sync.py b/src/forgesync/sync.py index 1fa46ce..3296975 100644 --- a/src/forgesync/sync.py +++ b/src/forgesync/sync.py @@ -23,7 +23,10 @@ class SyncedRepository: class Syncer(ABC): @abstractmethod def sync( - self: Self, from_repo: ForgejoRepository, description: str + self: Self, + from_repo: ForgejoRepository, + description: str, + topics: list[str], ) -> SyncedRepository: pass