import os from tests.testutils import cli, create_repo from buildstream import _yaml def prepare_junction_project(cli, tmpdir): main_project = tmpdir.join("main") sub_project = tmpdir.join("sub") os.makedirs(str(main_project)) os.makedirs(str(sub_project)) _yaml.dump({'name': 'main'}, str(main_project.join("project.conf"))) _yaml.dump({'name': 'sub'}, str(sub_project.join("project.conf"))) import_dir = tmpdir.join("import") os.makedirs(str(import_dir)) with open(str(import_dir.join("hello.txt")), "w") as f: f.write("hello!") import_repo_dir = tmpdir.join("import_repo") os.makedirs(str(import_repo_dir)) import_repo = create_repo("git", str(import_repo_dir)) import_ref = import_repo.create(str(import_dir)) _yaml.dump({'kind': 'import', 'sources': [import_repo.source_config(ref=import_ref)]}, str(sub_project.join("data.bst"))) sub_repo_dir = tmpdir.join("sub_repo") os.makedirs(str(sub_repo_dir)) sub_repo = create_repo("git", str(sub_repo_dir)) sub_ref = sub_repo.create(str(sub_project)) _yaml.dump({'kind': 'junction', 'sources': [sub_repo.source_config(ref=sub_ref)]}, str(main_project.join("sub.bst"))) args = ['fetch', 'sub.bst'] result = cli.run(project=str(main_project), args=args) result.assert_success() return str(main_project) def open_cross_junction(cli, tmpdir): project = prepare_junction_project(cli, tmpdir) workspace = tmpdir.join("workspace") element = 'sub.bst:data.bst' args = ['workspace', 'open', element, str(workspace)] result = cli.run(project=project, args=args) result.assert_success() assert cli.get_element_state(project, element) == 'buildable' assert os.path.exists(str(workspace.join('hello.txt'))) return project, workspace def test_open_cross_junction(cli, tmpdir): open_cross_junction(cli, tmpdir) def test_list_cross_junction(cli, tmpdir): project, workspace = open_cross_junction(cli, tmpdir) element = 'sub.bst:data.bst' args = ['workspace', 'list'] result = cli.run(project=project, args=args) result.assert_success() loaded = _yaml.load_data(result.output) assert isinstance(loaded.get('workspaces'), list) workspaces = loaded['workspaces'] assert len(workspaces) == 1 assert 'element' in workspaces[0] assert workspaces[0]['element'] == element def test_close_cross_junction(cli, tmpdir): project, workspace = open_cross_junction(cli, tmpdir) element = 'sub.bst:data.bst' args = ['workspace', 'close', '--remove-dir', element] result = cli.run(project=project, args=args) result.assert_success() assert not os.path.exists(str(workspace)) args = ['workspace', 'list'] result = cli.run(project=project, args=args) result.assert_success() loaded = _yaml.load_data(result.output) assert isinstance(loaded.get('workspaces'), list) workspaces = loaded['workspaces'] assert len(workspaces) == 0 def test_close_all_cross_junction(cli, tmpdir): project, workspace = open_cross_junction(cli, tmpdir) args = ['workspace', 'close', '--remove-dir', '--all'] result = cli.run(project=project, args=args) result.assert_success() assert not os.path.exists(str(workspace)) args = ['workspace', 'list'] result = cli.run(project=project, args=args) result.assert_success() loaded = _yaml.load_data(result.output) assert isinstance(loaded.get('workspaces'), list) workspaces = loaded['workspaces'] assert len(workspaces) == 0