Skip to content

Commit c21796e

Browse files
authored
Create sync entrypoint (#6)
1 parent b59f692 commit c21796e

File tree

2 files changed

+91
-2
lines changed

2 files changed

+91
-2
lines changed

gitea_github_sync/cli.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import click
44
from rich import print
55

6-
from . import config, gitea, github, repository
6+
from . import config, gitea, github, migration, repository
77

88

99
@click.group()
@@ -61,3 +61,20 @@ def migrate_repo(full_repo_name: str) -> None:
6161
raise click.Abort()
6262

6363
gt.migrate_repo(repo=repo, github_token=conf.github_token)
64+
65+
66+
@cli.command()
67+
def sync() -> None:
68+
conf = config.load_config()
69+
gt = gitea.get_gitea()
70+
gh = github.get_github()
71+
github_repos = github.list_all_repositories(gh)
72+
gitea_repos = gt.get_repos()
73+
repos_to_sync = migration.list_missing_github_repos(
74+
gh_repos=github_repos, gitea_repos=gitea_repos
75+
)
76+
print(f"Starting migration for {len(repos_to_sync)} repos")
77+
for repo in repos_to_sync:
78+
print(f"Migrating [b]{repo.full_repo_name}[/]")
79+
gt.migrate_repo(repo=repo, github_token=conf.github_token)
80+
print(f"Migrated {len(repos_to_sync)} repos successfully")

tests/test_cli.py

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import textwrap
22
from io import StringIO
33
from typing import List
4-
from unittest.mock import MagicMock, PropertyMock, patch
4+
from unittest.mock import MagicMock, PropertyMock, call, patch
55

66
import pytest
77
from click.testing import CliRunner
@@ -127,6 +127,78 @@ def test_migrate_repo_no_match(
127127
mock_load_config.assert_called_once()
128128

129129

130+
NO_REPOS: List[Repository] = []
131+
MULTIPLE_REPOS = [
132+
Repository("some-team/a-repo", Visibility.PUBLIC),
133+
Repository("some-team/b-repo", Visibility.PRIVATE),
134+
Repository("some-team/c-repo", Visibility.UNKNOWN),
135+
]
136+
137+
138+
@pytest.mark.parametrize(
139+
"repos_to_sync, expected_output",
140+
[
141+
(
142+
NO_REPOS,
143+
textwrap.dedent(
144+
"""\
145+
Starting migration for 0 repos
146+
Migrated 0 repos successfully
147+
"""
148+
),
149+
),
150+
(
151+
MULTIPLE_REPOS,
152+
textwrap.dedent(
153+
"""\
154+
Starting migration for 3 repos
155+
Migrating some-team/a-repo
156+
Migrating some-team/b-repo
157+
Migrating some-team/c-repo
158+
Migrated 3 repos successfully
159+
"""
160+
),
161+
),
162+
],
163+
)
164+
@patch("gitea_github_sync.cli.migration.list_missing_github_repos", autospec=True)
165+
@patch("gitea_github_sync.cli.config.load_config", autospec=True)
166+
@patch("gitea_github_sync.cli.github.list_all_repositories", autospec=True)
167+
@patch("gitea_github_sync.cli.github.get_github", autospec=True)
168+
@patch("gitea_github_sync.cli.gitea.get_gitea", autospec=True)
169+
def test_sync(
170+
mock_get_gitea: MagicMock,
171+
mock_get_github: MagicMock,
172+
mock_list_all_repositories: MagicMock,
173+
mock_load_config: MagicMock,
174+
mock_list_missing_github_repos: MagicMock,
175+
repos_to_sync: List[Repository],
176+
expected_output: str,
177+
) -> None:
178+
expected_github_token = "some-github-token"
179+
180+
type(mock_load_config.return_value).github_token = PropertyMock(
181+
return_value=expected_github_token
182+
)
183+
mock_list_missing_github_repos.return_value = repos_to_sync
184+
185+
runner = CliRunner()
186+
command = ["sync"]
187+
result = runner.invoke(cli, command)
188+
189+
assert result.exit_code == 0
190+
assert result.stdout == expected_output
191+
mock_load_config.assert_called_once()
192+
mock_list_all_repositories.assert_called_once_with(mock_get_github.return_value)
193+
mock_list_missing_github_repos.assert_called_once_with(
194+
gh_repos=mock_list_all_repositories.return_value,
195+
gitea_repos=mock_get_gitea.return_value.get_repos.return_value,
196+
)
197+
mock_get_gitea.return_value.migrate_repo.assert_has_calls(
198+
[call(repo=repo, github_token=expected_github_token) for repo in repos_to_sync]
199+
)
200+
201+
130202
@patch("sys.stdout", new_callable=StringIO)
131203
def test_print_repositories_without_stats(
132204
stdout: StringIO,

0 commit comments

Comments
 (0)