diff --git a/src/forgesync/cli.py b/src/forgesync/cli.py index 13f804b..c9ed815 100644 --- a/src/forgesync/cli.py +++ b/src/forgesync/cli.py @@ -30,6 +30,8 @@ class ArgumentParser(Tap): "base URL of the source instance" target: Destination "the destination, e.g. github, codeberg or forgejo=https://forgejo.example.com/api/v1" + org: str | None = None + "the organizaion namespace to sync instead of the user account" description_template: str = "{description} (Mirror of {url})" "the repository description template" remirror: bool = False @@ -132,14 +134,19 @@ def main() -> None: logger=logger, push_mirrorer=push_mirrorer, push_mirror_config=push_mirror_config, + org=args.org, ) - source_user = source_client.user.get_current() - if source_user.login is None: - logger.fatal("Could not get username from Forgejo") - exit(1) + if args.org: + logger.info("Fetching source repositories from organization: %s", args.org) + real_repos = depaginate(source_client.organization.org_list_repos, args.org) + else: + source_user = source_client.user.get_current() + if source_user.login is None: + logger.fatal("Could not get username from Forgejo") + exit(1) + real_repos = depaginate(source_client.user.list_repos, source_user.login) - real_repos = depaginate(source_client.user.list_repos, source_user.login) source_repos: list[SourceRepository] = [] for real in real_repos: source_repos.append(SourceRepository(real=real)) diff --git a/src/forgesync/dest.py b/src/forgesync/dest.py index 638a099..a5e0d6b 100644 --- a/src/forgesync/dest.py +++ b/src/forgesync/dest.py @@ -49,6 +49,7 @@ def make_syncer( logger: Logger, push_mirrorer: PushMirrorer, push_mirror_config: PushMirrorConfig, + org: str | None = None, ) -> Syncer: match self.platform: case Platform.GITHUB: @@ -66,6 +67,7 @@ def make_syncer( token=token, features=features, logger=logger, + org=org, ) @override diff --git a/src/forgesync/forgejo.py b/src/forgesync/forgejo.py index 76ee217..4539ea7 100644 --- a/src/forgesync/forgejo.py +++ b/src/forgesync/forgejo.py @@ -52,23 +52,34 @@ def __init__( token: str, features: list[RepositoryFeature], logger: Logger, + org: str | None = None ) -> None: - self.client = PyforgejoApi(base_url=instance, api_key=token) - self.user = self.client.user.get_current() + self.client = PyforgejoApi(base_url=instance, api_key=token) self.features = features - if self.user.login is None: - raise SyncError("Could not get username from Forgejo") + self.logger = logger - self.repos = {} - for repo in depaginate(self.client.user.list_repos, self.user.login): - if repo.name is None: - continue - self.repos[repo.name] = repo + self.is_org = bool(org) - self.logger = logger + self.repos = {} + if self.is_org: + self.target_owner = org + self.user = None + for repo in depaginate(self.client.organization.org_list_repos, self.target_owner): + if repo.name is None: + continue + self.repos[repo.name] = repo + else: + self.user = self.client.user.get_current() + if self.user.login is None: + raise SyncError("Could not get username from Forgejo") + self.target_owner = self.user.login + for repo in depaginate(self.client.user.list_repos, self.target_owner): + if repo.name is None: + continue + self.repos[repo.name] = repo @override def sync( @@ -77,10 +88,7 @@ def sync( description: str, topics: list[str], ) -> SyncedRepository: - if self.user.login is None: - raise SyncError("Cannot get username from Forgejo") - - self.logger.info("Synchronizing to %s/%s", self.user.login, source_repo.name) + self.logger.info("Synchronizing to %s/%s", self.target_owner, source_repo.name) real = source_repo.real @@ -93,18 +101,28 @@ def sync( if existing_repo.fork: raise RepositorySkippedError("Destination repository is a fork") else: - new_repo = self.client.repository.create_current_user_repo( - name=source_repo.name, - auto_init=False, - default_branch=real.default_branch, - description=description, - private=real.private, - ) + if self.is_org: + new_repo = self.client.organization.create_org_repo( + org=self.target_owner, + name=source_repo.name, + auto_init=False, + default_branch=real.default_branch, + description=description, + private=real.private, + ) + else: + new_repo = self.client.repository.create_current_user_repo( + name=source_repo.name, + auto_init=False, + default_branch=real.default_branch, + description=description, + private=real.private, + ) self.logger.info("Created new Forgejo repository %s", new_repo.full_name) edited_repo = self.client.repository.repo_edit( - owner=self.user.login, + owner=self.target_owner, repo=source_repo.name, archived=real.archived, default_branch=real.default_branch,