Beispiel #1
0
def clone_single(repo_url: str, branch: str = "", cwd: str = "."):
    """Clone a git repository with ``git clone``.

    This should only be used for temporary cloning, as any secure tokens in the
    repo URL are stored in the repository.

    Args:
        repo_url: HTTPS url to repository on the form
            https://<host>/<owner>/<repo>.
        branch: The branch to clone.
        cwd: Working directory. Defaults to the current directory.
    """
    command = [*"git clone --single-branch".split(), repo_url] + (
        [branch] if branch else []
    )
    rc, _, stderr = captured_run(command, cwd=cwd)
    if rc != 0:
        raise exception.CloneFailedError(
            "Failed to clone",
            rc,
            stderr,
            CloneSpec(
                repo_url=repo_url,
                dest=pathlib.Path(cwd) / util.repo_name(repo_url),
                branch=branch,
            ),
        )
Beispiel #2
0
 async def raise_(spec, *args, **kwargs):
     if spec in fail_specs:
         raise exception.CloneFailedError(
             "Some error",
             returncode=128,
             stderr=b"Something",
             clone_spec=spec,
         )
Beispiel #3
0
async def _clone_async(clone_spec: CloneSpec):
    """Clone git repositories asynchronously.

    Args:
        clone_spec: A clone specification.
    """
    rc, stderr = await _pull_clone_async(clone_spec)

    if rc != 0 and _EMPTY_REPO_ERROR not in stderr:
        raise exception.CloneFailedError(
            f"Failed to clone {clone_spec.repo_url}",
            returncode=rc,
            stderr=stderr,
            clone_spec=clone_spec,
        )
    else:
        plug.log.info(f"Cloned into {clone_spec.repo_url}")
Beispiel #4
0
async def _clone_async(clone_spec: CloneSpec):
    """Clone git repositories asynchronously.

    Args:
        clone_spec: A clone specification.
    """
    rc, stderr = await pull_clone_async(clone_spec)

    empty_repo_error = b"fatal: couldn't find remote ref HEAD"
    if rc != 0 and empty_repo_error.lower() not in stderr.lower():
        raise exception.CloneFailedError(
            f"Failed to clone {clone_spec.repo_url}",
            returncode=rc,
            stderr=stderr,
            clone_spec=clone_spec,
        )
    else:
        plug.log.info(f"Cloned into {clone_spec.repo_url}")
Beispiel #5
0

@pytest.fixture(scope="function", params=iter(repobee_plug.cli.CoreCommand))
def parsed_args_all_subparsers(request):
    """Parametrized fixture which returns a namespace for each of the
    subparsers. These arguments are valid for all subparsers, even though
    many will only use some of the arguments.
    """
    return argparse.Namespace(**request.param.asdict(), **VALID_PARSED_ARGS)


@pytest.fixture(
    scope="function",
    params=[
        exception.PushFailedError("some message", 128, b"error", "someurl"),
        exception.CloneFailedError("some message", 128, b"error", "someurl"),
        exception.GitError("some message", 128, b"error"),
        plug.PlatformError("some message"),
    ],
)
def command_all_raise_mock(command_mock, dummyapi_instance, request):
    """Mock of _repobee.command where all functions raise expected exceptions
    (i.e. those caught in _sys_exit_on_expected_error)
    """

    def raise_(*args, **kwargs):
        raise request.param

    command_mock.setup_student_repos.side_effect = raise_
    command_mock.update_student_repos.side_effect = raise_
    command_mock.open_issue.side_effect = raise_