mirror of
https://github.com/openSUSE/osc.git
synced 2025-02-22 10:12:12 +01:00
89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
import subprocess
|
|
import sys
|
|
|
|
import osc.commandline_git
|
|
|
|
|
|
class RepoCloneCommand(osc.commandline_git.GitObsCommand):
|
|
"""
|
|
Clone a git repo
|
|
|
|
NOTE: Some of the options may result in setting "core.sshCommand"
|
|
config option in the git repository."
|
|
"""
|
|
|
|
name = "clone"
|
|
parent = "RepoCommand"
|
|
|
|
def init_arguments(self):
|
|
self.add_argument_owner_repo(nargs="+")
|
|
|
|
self.add_argument(
|
|
"-a",
|
|
"--anonymous",
|
|
action="store_true",
|
|
default=None,
|
|
help="Clone anonymously via the http protocol",
|
|
)
|
|
|
|
self.add_argument(
|
|
"-i",
|
|
"--ssh-key",
|
|
help="Path to a private SSH key (identity file)",
|
|
)
|
|
|
|
self.add_argument(
|
|
"--no-ssh-strict-host-key-checking",
|
|
action="store_true",
|
|
help="Set 'StrictHostKeyChecking no' ssh option",
|
|
)
|
|
|
|
# TODO: replace with an optional argument to get closer to the `git clone` command?
|
|
self.add_argument(
|
|
"--directory",
|
|
help="Clone into the given directory",
|
|
)
|
|
|
|
def run(self, args):
|
|
from osc import gitea_api
|
|
|
|
from osc.output import tty
|
|
|
|
self.print_gitea_settings()
|
|
|
|
if len(args.owner_repo) > 1 and args.directory:
|
|
self.parser.error("The --directory option cannot be used with multiple repos")
|
|
|
|
num_entries = 0
|
|
failed_entries = []
|
|
for owner, repo in args.owner_repo:
|
|
print(f"Cloning git repo {owner}/{repo} ...", file=sys.stderr)
|
|
try:
|
|
gitea_api.Repo.clone(
|
|
self.gitea_conn,
|
|
owner,
|
|
repo,
|
|
directory=args.directory,
|
|
anonymous=args.anonymous,
|
|
add_remotes=True,
|
|
ssh_private_key_path=args.ssh_key or self.gitea_login.ssh_key,
|
|
ssh_strict_host_key_checking=not(args.no_ssh_strict_host_key_checking),
|
|
)
|
|
num_entries += 1
|
|
except gitea_api.GiteaException as e:
|
|
if e.status == 404:
|
|
print(f" * {tty.colorize('ERROR', 'red,bold')}: Repo doesn't exist: {owner}/{repo}", file=sys.stderr)
|
|
failed_entries.append(f"{owner}/{repo}")
|
|
continue
|
|
raise
|
|
except subprocess.CalledProcessError as e:
|
|
print(f" * {tty.colorize('ERROR', 'red,bold')}: git clone failed", file=sys.stderr)
|
|
failed_entries.append(f"{owner}/{repo}")
|
|
continue
|
|
|
|
print("", file=sys.stderr)
|
|
print(f"Total cloned repos: {num_entries}", file=sys.stderr)
|
|
if failed_entries:
|
|
print(f"{tty.colorize('ERROR', 'red,bold')}: Couldn't clone the following repos: {', '.join(failed_entries)}", file=sys.stderr)
|
|
sys.exit(1)
|