def renku_clone( client, url, path=None, install_githooks=True, skip_smudge=True, recursive=True, depth=None, progress=None, config=None, raise_git_except=False, ): """Clone Renku project repo, install Git hooks and LFS.""" install_lfs = client.use_external_storage clone( url=url, path=path, install_githooks=install_githooks, install_lfs=install_lfs, skip_smudge=skip_smudge, recursive=recursive, depth=depth, progress=progress, config=config, raise_git_except=raise_git_except, )
def project_clone( client, url, path=None, install_githooks=True, skip_smudge=True, recursive=True, depth=None, progress=None, config=None, raise_git_except=False, checkout_rev=None, ): """Clone Renku project repo, install Git hooks and LFS.""" install_lfs = client.external_storage_requested return clone( url=url, path=path, install_githooks=install_githooks, install_lfs=install_lfs, skip_smudge=skip_smudge, recursive=recursive, depth=depth, progress=progress, config=config, raise_git_except=raise_git_except, checkout_rev=checkout_rev, )
def _prepare_git_repo(self, url, ref): def checkout(repo, ref): try: repo.git.checkout(ref) except GitCommandError: raise errors.ParameterError( 'Cannot find reference "{}" in Git repository: {}'.format( ref, url)) RENKU_BRANCH = 'renku-default-branch' ref = ref or RENKU_BRANCH u = GitURL.parse(url) path = u.pathname if u.hostname == 'localhost': path = str(Path(path).resolve()) url = path repo_name = os.path.splitext(os.path.basename(path))[0] path = os.path.dirname(path).lstrip('/') repo_path = self.renku_path / 'cache' / u.hostname / path / repo_name if repo_path.exists(): repo = Repo(str(repo_path)) if repo.remotes.origin.url == url: try: repo.git.fetch(all=True) repo.git.checkout(ref) try: repo.git.pull() except GitError: # When ref is not a branch, an error is thrown pass except GitError: # ignore the error and try re-cloning pass else: return repo, repo_path try: shutil.rmtree(str(repo_path)) except PermissionError: raise errors.InvalidFileOperation( 'Cannot delete files in {}: Permission denied'.format( repo_path)) repo = clone(url, path=str(repo_path), install_githooks=False) # Because the name of the default branch is not always 'master', we # create an alias of the default branch when cloning the repo. It # is used to refer to the default branch later. renku_ref = 'refs/heads/' + RENKU_BRANCH try: repo.git.execute( ['git', 'symbolic-ref', renku_ref, repo.head.reference.path]) checkout(repo, ref) except GitCommandError as e: raise errors.GitError( 'Cannot clone remote Git repo: {}'.format(url)) from e else: return repo, repo_path