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, ), )
async def raise_(spec, *args, **kwargs): if spec in fail_specs: raise exception.CloneFailedError( "Some error", returncode=128, stderr=b"Something", clone_spec=spec, )
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}")
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}")
@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_