def test_import_project_release_dir(tmpdir): # Tests for a workspace that imports a directory from a project # at a fixed release. remotes = tmpdir / 'remotes' empty_project = remotes / 'empty_project' create_repo(empty_project) add_commit(empty_project, 'empty-project empty commit') imported = remotes / 'imported' create_repo(imported) add_commit(imported, 'add directory of imports', files={'test.d/1.yml': f'''\ manifest: projects: - name: west.d/1.yml-p1 url: {empty_project} - name: west.d/1.yml-p2 url: {empty_project} ''', 'test.d/2.yml': f'''\ manifest: projects: - name: west.d/2.yml-p1 url: {empty_project} '''}) add_tag(imported, 'import-tag') ws = tmpdir / 'ws' create_workspace(ws, and_git=True) manifest_repo = ws / 'mp' add_commit(manifest_repo, 'manifest repo commit', files={'west.yml': f''' manifest: projects: - name: imported url: {imported} revision: import-tag import: test.d '''}) cmd(f'init -l {manifest_repo}') with pytest.raises(ManifestImportFailed): Manifest.from_file(topdir=ws) cmd('update', cwd=ws) actual = Manifest.from_file(topdir=ws).projects expected = [ManifestProject(path='mp', topdir=ws), Project('imported', imported, revision='import-tag', topdir=ws), Project('west.d/1.yml-p1', empty_project, topdir=ws), Project('west.d/1.yml-p2', empty_project, topdir=ws), Project('west.d/2.yml-p1', empty_project, topdir=ws)] for a, e in zip(actual, expected): check_proj_consistency(a, e)
def test_import_project_rolling(repos_tmpdir): # Like test_import_project_release, but with a rolling downstream # that pulls master. We also use west init -l. remotes = repos_tmpdir / 'repos' zephyr = remotes / 'zephyr' ws = repos_tmpdir / 'ws' create_workspace(ws, and_git=True) manifest_repo = ws / 'mp' create_repo(manifest_repo) add_commit(manifest_repo, 'manifest repo commit', # zephyr revision is implicitly master: files={'west.yml': f''' manifest: projects: - name: zephyr url: {zephyr} import: true '''}) cmd(f'init -l {manifest_repo}') with pytest.raises(ManifestImportFailed): Manifest.from_file(topdir=ws) cmd('update', cwd=ws) actual = Manifest.from_file(topdir=ws).projects expected = [ManifestProject(path='mp', topdir=ws), Project('zephyr', zephyr, revision='master', topdir=ws), Project('Kconfiglib', remotes / 'Kconfiglib', revision='zephyr', path='subdir/Kconfiglib', topdir=ws), Project('tagged_repo', remotes / 'tagged_repo', revision='v1.0', topdir=ws), Project('net-tools', remotes / 'net-tools', clone_depth=1, topdir=ws, west_commands='scripts/west-commands.yml')] for a, e in zip(actual, expected): check_proj_consistency(a, e) # Add a commit in the remote zephyr repository and make sure it # *does* affect our local workspace, since we're rolling with its # master branch. zephyr_ws = ws / 'zephyr' head_before = rev_parse(zephyr_ws, 'HEAD') add_commit(zephyr, 'this better show up', files={'should-clone': ''}) cmd('update', cwd=ws) assert head_before != rev_parse(zephyr_ws, 'HEAD') assert (zephyr_ws / 'should-clone').check(file=1)
def test_import_project_release_fork(repos_tmpdir): # Like test_import_project_release(), but with a project fork, # and using west init -l. remotes = repos_tmpdir / 'repos' zephyr = remotes / 'zephyr' add_tag(zephyr, 'zephyr-tag') fork = remotes / 'my-kconfiglib-fork' create_repo(fork) add_commit(fork, 'fork kconfiglib') add_tag(fork, 'fork-tag') ws = repos_tmpdir / 'ws' create_workspace(ws, and_git=True) manifest_repo = ws / 'mp' create_repo(manifest_repo) add_commit(manifest_repo, 'manifest repo commit', files={ 'west.yml': f''' manifest: projects: - name: zephyr url: {zephyr} revision: zephyr-tag import: true - name: Kconfiglib url: {fork} revision: fork-tag ''' }) cmd(f'init -l {manifest_repo}') with pytest.raises(ManifestImportFailed): Manifest.from_file(topdir=ws) cmd('update', cwd=ws) actual = Manifest.from_file(topdir=ws).projects expected = [ ManifestProject(path='mp', topdir=ws), Project('zephyr', zephyr, revision='zephyr-tag', topdir=ws), Project('Kconfiglib', fork, revision='fork-tag', path='Kconfiglib', topdir=ws), Project('tagged_repo', remotes / 'tagged_repo', revision='v1.0', topdir=ws), Project('net-tools', remotes / 'net-tools', clone_depth=1, topdir=ws, west_commands='scripts/west-commands.yml') ] for a, e in zip(actual, expected): check_proj_consistency(a, e) zephyr_ws = ws / 'zephyr' head_before = rev_parse(zephyr_ws, 'HEAD') add_commit(zephyr, 'this better not show up', files={'should-not-clone': ''}) cmd('update', cwd=ws) assert head_before == rev_parse(zephyr_ws, 'HEAD') actual = Manifest.from_file(topdir=ws).projects for a, e in zip(actual, expected): check_proj_consistency(a, e) assert (zephyr_ws / 'should-not-clone').check(file=0)
def test_update_some_with_imports(repos_tmpdir): # 'west update project1 project2' should work fine even when # imports are used, as long as the relevant projects are all # defined in the manifest repository. # # It currently should fail with a helpful message if the projects # are resolved via project imports. remotes = repos_tmpdir / 'repos' zephyr = remotes / 'zephyr' net_tools = remotes / 'net-tools' ws = repos_tmpdir / 'ws' create_workspace(ws, and_git=True) manifest_repo = ws / 'mp' create_repo(manifest_repo) add_commit( manifest_repo, 'manifest repo commit', # zephyr revision is implicitly master: files={ 'west.yml': f''' manifest: projects: - name: zephyr url: {zephyr} import: true self: import: foo.yml ''', 'foo.yml': f''' manifest: projects: - name: net-tools url: {net_tools} ''' }) cmd(f'init -l {manifest_repo}') # Updating unknown projects should fail as always. with pytest.raises(subprocess.CalledProcessError): cmd('update unknown-project', cwd=ws) # Updating a list of projects when some are resolved via project # imports must fail. with pytest.raises(subprocess.CalledProcessError): cmd('update Kconfiglib net-tools', cwd=ws) # Updates of projects defined in the manifest repository or all # projects must succeed, and behave the same as if no imports # existed. cmd('update net-tools', cwd=ws) with pytest.raises(ManifestImportFailed): Manifest.from_file(topdir=ws) manifest = Manifest.from_file(topdir=ws, import_flags=MIF.IGNORE_PROJECTS) projects = manifest.get_projects(['net-tools', 'zephyr']) net_tools_project = projects[0] zephyr_project = projects[1] assert net_tools_project.is_cloned() assert not zephyr_project.is_cloned() cmd('update zephyr', cwd=ws) assert zephyr_project.is_cloned() cmd('update', cwd=ws) manifest = Manifest.from_file(topdir=ws) assert manifest.get_projects(['Kconfiglib'])[0].is_cloned()