66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
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()
|