mirror of
https://github.com/explosion/spaCy.git
synced 2024-12-25 09:26:27 +03:00
Try cloning repo from main & master (#10843)
* Try cloning repo from main & master * fixup! Try cloning repo from main & master * fixup! fixup! Try cloning repo from main & master * refactor clone and check for repo:branch existence * spacing fix * make mypy happy * type util function * Update spacy/cli/project/clone.py Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com> Co-authored-by: Peter Baumgartner <5107405+pmbaumgartner@users.noreply.github.com> Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
This commit is contained in:
parent
308a612ec9
commit
8ffff18ac4
|
@ -462,6 +462,23 @@ def git_sparse_checkout(repo, subpath, dest, branch):
|
||||||
shutil.move(str(source_path), str(dest))
|
shutil.move(str(source_path), str(dest))
|
||||||
|
|
||||||
|
|
||||||
|
def git_repo_branch_exists(repo: str, branch: str) -> bool:
|
||||||
|
"""Uses 'git ls-remote' to check if a repository and branch exists
|
||||||
|
|
||||||
|
repo (str): URL to get repo.
|
||||||
|
branch (str): Branch on repo to check.
|
||||||
|
RETURNS (bool): True if repo:branch exists.
|
||||||
|
"""
|
||||||
|
get_git_version()
|
||||||
|
cmd = f"git ls-remote {repo} {branch}"
|
||||||
|
# We might be tempted to use `--exit-code` with `git ls-remote`, but
|
||||||
|
# `run_command` handles the `returncode` for us, so we'll rely on
|
||||||
|
# the fact that stdout returns '' if the requested branch doesn't exist
|
||||||
|
ret = run_command(cmd, capture=True)
|
||||||
|
exists = ret.stdout != ""
|
||||||
|
return exists
|
||||||
|
|
||||||
|
|
||||||
def get_git_version(
|
def get_git_version(
|
||||||
error: str = "Could not run 'git'. Make sure it's installed and the executable is available.",
|
error: str = "Could not run 'git'. Make sure it's installed and the executable is available.",
|
||||||
) -> Tuple[int, int]:
|
) -> Tuple[int, int]:
|
||||||
|
|
|
@ -7,11 +7,11 @@ import re
|
||||||
from ... import about
|
from ... import about
|
||||||
from ...util import ensure_path
|
from ...util import ensure_path
|
||||||
from .._util import project_cli, Arg, Opt, COMMAND, PROJECT_FILE
|
from .._util import project_cli, Arg, Opt, COMMAND, PROJECT_FILE
|
||||||
from .._util import git_checkout, get_git_version
|
from .._util import git_checkout, get_git_version, git_repo_branch_exists
|
||||||
|
|
||||||
DEFAULT_REPO = about.__projects__
|
DEFAULT_REPO = about.__projects__
|
||||||
DEFAULT_PROJECTS_BRANCH = about.__projects_branch__
|
DEFAULT_PROJECTS_BRANCH = about.__projects_branch__
|
||||||
DEFAULT_BRANCH = "master"
|
DEFAULT_BRANCHES = ["main", "master"]
|
||||||
|
|
||||||
|
|
||||||
@project_cli.command("clone")
|
@project_cli.command("clone")
|
||||||
|
@ -20,7 +20,7 @@ def project_clone_cli(
|
||||||
name: str = Arg(..., help="The name of the template to clone"),
|
name: str = Arg(..., help="The name of the template to clone"),
|
||||||
dest: Optional[Path] = Arg(None, help="Where to clone the project. Defaults to current working directory", exists=False),
|
dest: Optional[Path] = Arg(None, help="Where to clone the project. Defaults to current working directory", exists=False),
|
||||||
repo: str = Opt(DEFAULT_REPO, "--repo", "-r", help="The repository to clone from"),
|
repo: str = Opt(DEFAULT_REPO, "--repo", "-r", help="The repository to clone from"),
|
||||||
branch: Optional[str] = Opt(None, "--branch", "-b", help="The branch to clone from"),
|
branch: Optional[str] = Opt(None, "--branch", "-b", help=f"The branch to clone from. If not provided, will attempt {', '.join(DEFAULT_BRANCHES)}"),
|
||||||
sparse_checkout: bool = Opt(False, "--sparse", "-S", help="Use sparse Git checkout to only check out and clone the files needed. Requires Git v22.2+.")
|
sparse_checkout: bool = Opt(False, "--sparse", "-S", help="Use sparse Git checkout to only check out and clone the files needed. Requires Git v22.2+.")
|
||||||
# fmt: on
|
# fmt: on
|
||||||
):
|
):
|
||||||
|
@ -33,9 +33,25 @@ def project_clone_cli(
|
||||||
"""
|
"""
|
||||||
if dest is None:
|
if dest is None:
|
||||||
dest = Path.cwd() / Path(name).parts[-1]
|
dest = Path.cwd() / Path(name).parts[-1]
|
||||||
|
if repo == DEFAULT_REPO and branch is None:
|
||||||
|
branch = DEFAULT_PROJECTS_BRANCH
|
||||||
|
|
||||||
if branch is None:
|
if branch is None:
|
||||||
# If it's a user repo, we want to default to other branch
|
for default_branch in DEFAULT_BRANCHES:
|
||||||
branch = DEFAULT_PROJECTS_BRANCH if repo == DEFAULT_REPO else DEFAULT_BRANCH
|
if git_repo_branch_exists(repo, default_branch):
|
||||||
|
branch = default_branch
|
||||||
|
break
|
||||||
|
if branch is None:
|
||||||
|
default_branches_msg = ", ".join(f"'{b}'" for b in DEFAULT_BRANCHES)
|
||||||
|
msg.fail(
|
||||||
|
"No branch provided and attempted default "
|
||||||
|
f"branches {default_branches_msg} do not exist.",
|
||||||
|
exits=1,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if not git_repo_branch_exists(repo, branch):
|
||||||
|
msg.fail(f"repo: {repo} (branch: {branch}) does not exist.", exits=1)
|
||||||
|
assert isinstance(branch, str)
|
||||||
project_clone(name, dest, repo=repo, branch=branch, sparse_checkout=sparse_checkout)
|
project_clone(name, dest, repo=repo, branch=branch, sparse_checkout=sparse_checkout)
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,9 +77,9 @@ def project_clone(
|
||||||
try:
|
try:
|
||||||
git_checkout(repo, name, dest, branch=branch, sparse=sparse_checkout)
|
git_checkout(repo, name, dest, branch=branch, sparse=sparse_checkout)
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
err = f"Could not clone '{name}' from repo '{repo_name}'"
|
err = f"Could not clone '{name}' from repo '{repo_name}' (branch '{branch}')"
|
||||||
msg.fail(err, exits=1)
|
msg.fail(err, exits=1)
|
||||||
msg.good(f"Cloned '{name}' from {repo_name}", project_dir)
|
msg.good(f"Cloned '{name}' from '{repo_name}' (branch '{branch}')", project_dir)
|
||||||
if not (project_dir / PROJECT_FILE).exists():
|
if not (project_dir / PROJECT_FILE).exists():
|
||||||
msg.warn(f"No {PROJECT_FILE} found in directory")
|
msg.warn(f"No {PROJECT_FILE} found in directory")
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user