import os.path import sys from os import makedirs from src.config import Config, read_toml_config from src.git import git_clone, git_pull, http_git_env, ssh_git_env from src.gitea_api import GiteaApi from src.models import GiteaRepository from src.repository_name import get_repository_name, is_valid_repository_names BASE_PATH = "out" FORMAT = "{owner}/{name}" def get_fetch_params(config: Config, repo: GiteaRepository): if config.fetch.ssh_key_path: return repo.ssh_url, ssh_git_env(config.fetch.ssh_key_path) return repo.clone_url, http_git_env( user=config.fetch.user, token=config.fetch.token, ) def process_repo(config: Config, repo: GiteaRepository): path = get_repository_name(name_format=config.repository_format, r=repo) out_path = os.path.join(config.out_dir, path) repository_url, git_env = get_fetch_params(config=config, repo=repo) makedirs(out_path, exist_ok=True) if os.path.exists(os.path.join(out_path, ".git")): git_pull(out_path, env=git_env) return print(f"New repository: {path}") git_clone(repository_url=repository_url, repository=out_path, env=git_env) def main(): if len(sys.argv) < 2: print("Usage: python gitea-mirror.py CONFIG_PATH") sys.exit(1) try: config = read_toml_config(sys.argv[1]) except RuntimeError as err: print(f"Invalid config: {err}") sys.exit(1) api = GiteaApi( endpoint=config.endpoint, api_token=config.api_token, ) repos = api.get_repositories() print(f"total {len(repos)} repositories") if not is_valid_repository_names( name_format=config.repository_format, repos=repos, ): print("Format string is not valid, duplicates are not allowed") sys.exit(1) for repo in repos: process_repo(config=config, repo=repo) if __name__ == "__main__": main()