Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions src/forgesync/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand Down
2 changes: 2 additions & 0 deletions src/forgesync/dest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -66,6 +67,7 @@ def make_syncer(
token=token,
features=features,
logger=logger,
org=org,
)

@override
Expand Down
62 changes: 40 additions & 22 deletions src/forgesync/forgejo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

self.user is currently of type ForgejoUser, so it should be updated to ForgejoUser | 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(
Expand All @@ -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

Expand All @@ -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,
Expand Down