def test_submodule_init(tmpdir_factory, runner, run, project): """Test initializing submodules.""" src_project = Path(str(tmpdir_factory.mktemp('src_project'))) assert 0 == run(args=('init', str(src_project))) woop = src_project / 'woop' with woop.open('w') as fp: fp.write('woop') repo = git.Repo(str(src_project)) repo.git.add('--all') repo.index.commit('Added woop file') assert 0 == run(args=('dataset', 'create', 'foo')) assert 0 == run(args=('dataset', 'add', 'foo', str(woop))) imported_woop = Path(project) / 'data' / 'foo' / woop.name assert imported_woop.exists() dst_project = Path(str(tmpdir_factory.mktemp('dst_project'))) subprocess.call(['git', 'clone', project, str(dst_project)]) subprocess.call(['git', 'lfs', 'install', '--local'], cwd=str(dst_project)) dst_woop = Path(dst_project) / 'data' / 'foo' / 'woop' assert not dst_woop.exists() result = runner.invoke(cli.cli, [ '--path', str(dst_project), 'run', '--no-output', 'wc', str(dst_woop.absolute()) ], catch_exceptions=False) assert 0 == result.exit_code
def find_project_config_path(path=None): """Find project config path.""" path = Path(path) if path else Path.cwd() abspath = path.absolute() project_path = get_project_config_path(abspath) if project_path: return project_path for parent in abspath.parents: project_path = get_project_config_path(parent) if project_path: return project_path
def worktree( self, path=None, branch_name=None, commit=None, merge_args=('--ff-only', ), ): """Create new worktree.""" from git import GitCommandError, NULL_TREE from renku._contexts import Isolation delete = path is None path = path or tempfile.mkdtemp() branch_name = branch_name or 'renku/run/isolation/' + uuid.uuid4().hex # TODO sys.argv if commit is NULL_TREE: args = ['add', '--detach', path] self.repo.git.worktree(*args) client = attr.evolve(self, path=path) client.repo.git.checkout('--orphan', branch_name) client.repo.git.rm('-rf', '*') else: args = ['add', '-b', branch_name, path] if commit: args.append(commit) self.repo.git.worktree(*args) client = attr.evolve(self, path=path) client.repo.config_reader = self.repo.config_reader # Keep current directory relative to repository root. relative = Path('.').resolve().relative_to(self.path) # Reroute standard streams original_mapped_std = _mapped_std_streams(self.candidate_paths) mapped_std = {} for name, stream in original_mapped_std.items(): stream_path = Path(path) / (Path(stream).relative_to(self.path)) stream_path = stream_path.absolute() if not stream_path.exists(): stream_path.parent.mkdir(parents=True, exist_ok=True) stream_path.touch() mapped_std[name] = stream_path _clean_streams(self.repo, original_mapped_std) new_cwd = Path(path) / relative new_cwd.mkdir(parents=True, exist_ok=True) with Isolation(cwd=str(new_cwd), **mapped_std): yield client try: self.repo.git.merge(branch_name, *merge_args) except GitCommandError: raise errors.FailedMerge(self.repo) if delete: shutil.rmtree(path) self.repo.git.worktree('prune') self.checkout_paths_from_storage()