#!/usr/bin/env python3
# Copyright (C) 2026 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import subprocess
import sys
import yaml

GIT_HOME = "/var/gerrit/git"
DEFAULT_CONFIG_FILE = "/var/gerrit/etc/incoming-replication.config.yaml"
DEFAULT_REFSPEC_TEMPLATE = "+refs/heads/*:refs/heads/{remote_name}/*"


def parse_timeout(value):
    """Convert a timeout string like '5m', '30s', or '120' to seconds (int)."""
    if value is None or value == "null":
        return None
    value = str(value).strip()
    if value.endswith("m"):
        return int(value[:-1]) * 60
    if value.endswith("s"):
        return int(value[:-1])
    return int(value)


def git(git_dir, *args, timeout=None):
    cmd = ["git", f"--git-dir={git_dir}"] + list(args)
    subprocess.run(cmd, check=True, timeout=timeout)


def configure_remote(git_dir, remote_name, remote_url, refspec):
    subprocess.run(
        [
            "git",
            f"--git-dir={git_dir}",
            "config",
            f"remote.{remote_name}.url",
            remote_url,
        ],
        check=True,
    )
    subprocess.run(
        [
            "git",
            f"--git-dir={git_dir}",
            "config",
            "unset",
            "--all",
            f"remote.{remote_name}.fetch",
        ],
        # exit code 5 means the key did not exist — that is fine on first run
        check=False,
    )
    subprocess.run(
        [
            "git",
            f"--git-dir={git_dir}",
            "config",
            f"remote.{remote_name}.fetch",
            refspec,
        ],
        check=True,
    )


def process_remote(remote):
    remote_name = remote["name"]
    server_url = remote["url"].rstrip("/")
    timeout_seconds = parse_timeout(remote.get("timeout"))

    for fetch in remote.get("fetch", []):
        remote_repo = fetch["remoteRepo"]
        local_repo = fetch.get("localRepo") or remote_repo
        refspec = fetch.get("refSpec") or DEFAULT_REFSPEC_TEMPLATE.format(
            remote_name=remote_name
        )

        remote_url = f"{server_url}/{remote_repo}"
        git_dir = f"{GIT_HOME}/{local_repo}.git"

        configure_remote(git_dir, remote_name, remote_url, refspec)

        print(f"Fetching {remote_repo} from {remote_name} into {git_dir}")
        try:
            subprocess.run(
                ["git", f"--git-dir={git_dir}", "fetch", remote_name],
                check=True,
                timeout=timeout_seconds,
            )
        except subprocess.TimeoutExpired:
            print(
                f"ERROR: fetch of {remote_repo} from {remote_name} timed out "
                f"after {timeout_seconds}s",
                file=sys.stderr,
            )
            sys.exit(1)


def main():
    parser = argparse.ArgumentParser(
        description="Fetch from remote Git repositories into local Gerrit repositories."
    )
    parser.add_argument(
        "--config",
        default=DEFAULT_CONFIG_FILE,
        metavar="CONFIG_FILE",
        help=f"Path to the YAML config file (default: {DEFAULT_CONFIG_FILE})",
    )
    args = parser.parse_args()

    try:
        with open(args.config) as f:
            config = yaml.safe_load(f)
    except FileNotFoundError:
        print(f"ERROR: config file not found: {args.config}", file=sys.stderr)
        sys.exit(1)

    for remote in config.get("remotes", []):
        process_remote(remote)


if __name__ == "__main__":
    main()
