Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_project_git_methods(tmpdir):
# Test the internal consistency of the various methods that call
# out to git.
# Just manually create a Project instance. We don't need a full
# Manifest.
path = tmpdir / 'project'
p = Project('project', 'ignore-this-url', topdir=tmpdir)
# Helper for getting the contents of a.txt at a revision.
def a_content_at(rev):
return p.git(f'show {rev}:a.txt', capture_stderr=True,
capture_stdout=True).stdout.decode('ascii')
# The project isn't cloned yet.
assert not p.is_cloned()
# Create it, then verify the API knows it's cloned.
# Cache the current SHA.
create_repo(path)
assert p.is_cloned()
start_sha = p.sha('HEAD')
# If a.txt doesn't exist at a revision, we can't read it. If it
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)
def test_project_init():
# Basic tests of the Project constructor and public attributes.
p = Project('p', 'some-url', revision='v1.2')
assert p.name == 'p'
assert p.url == 'some-url'
assert p.revision == 'v1.2'
assert p.path == 'p'
assert p.abspath is None
assert p.posixpath is None
assert p.clone_depth is None
assert p.west_commands == []
assert p.topdir is None
p = Project('p', 'some-url', clone_depth=4, west_commands='foo',
topdir=TOPDIR)
assert p.clone_depth == 4
assert p.west_commands == ['foo']
assert p.topdir == TOPDIR
assert p.abspath == os.path.join(TOPDIR, 'p')
'''})
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
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()
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()
def MF(**kwargs):
# A convenience to save typing
return Manifest.from_file(**kwargs)
assert mproj.abspath is None
assert mproj.posixpath is None
p1 = manifest.projects[1]
assert p1.name == 'another-1'
assert p1.url == 'another-url-1'
assert p1.topdir == topdir
assert PurePath(p1.abspath) == topdir / 'another-1'
p2 = manifest.projects[2]
assert p2.name == 'another-2'
assert p2.url == 'another-url-2'
assert p2.topdir == topdir
assert PurePath(p2.abspath) == topdir / 'another' / 'path'
# On the other hand, if the manifest yaml file does specify its
# path, the ManifestProject must also be rooted at topdir.
manifest = Manifest.from_file(source_file=another_yml_with_path)
mproj = manifest.projects[0]
assert mproj.path == 'with-path'
assert PurePath(mproj.topdir) == topdir
assert PurePath(mproj.abspath) == topdir / 'with-path'
with open(another_yml_with_path, 'w') as f:
f.write('''\
manifest:
projects:
- name: foo
url: bar
self:
path: with-path
''')
# manifest_path() should discover west_yml.
assert manifest_path() == west_yml
# Manifest.from_file() should discover west.yml, and
# the project hierarchy should be rooted at topdir.
manifest = Manifest.from_file()
assert PurePath(manifest.topdir) == topdir
assert len(manifest.projects) == 3
assert manifest.projects[1].name == 'project-1'
assert manifest.projects[2].name == 'project-2'
# Manifest.from_file() should be also usable with another_yml.
# The project hierarchy in its return value should still be rooted
# in the topdir, but the resulting ManifestProject does not have a
# path, because it's not set in the file, and we're explicitly not
# comparing its path to manifest.path.
#
# However, the project hierarchy *must* be rooted at topdir.
manifest = Manifest.from_file(source_file=another_yml)
assert len(manifest.projects) == 3
assert manifest.topdir is not None
assert PurePath(manifest.topdir) == PurePath(topdir)
manifests.update(_IMPORT_SELF_SUBMANIFESTS)
_setup_import_self(tmpdir, manifests)
# Resolve the manifest. The split-manifest/west.d content comes
# from the file system in this case.
actual = Manifest.from_data(manifests['west.yml'],
manifest_path='split-manifest', topdir=tmpdir,
importer=make_importer(call_map),
import_flags=FPI).projects
expected = [
ManifestProject(path='split-manifest', topdir=tmpdir),
# Projects from 01-libraries.yml come first.
Project('my-1', 'downstream.com/my-lib-1', revision='my-1-rev',
path='lib/my-1', topdir=tmpdir),
Project('my-2', 'downstream.com/my-lib-2', revision='my-2-rev',
path='lib/my-2', topdir=tmpdir),
# Next, projects from 02-vendor-hals.yml.
Project('hal_nordic', 'downstream.com/hal_nordic',
revision='my-hal-rev', path='modules/hal/nordic',
topdir=tmpdir),
Project('hal_downstream_sauce', 'downstream.com/hal_downstream_only',
revision='my-down-hal-rev', path='modules/hal/downstream_only',
topdir=tmpdir),
# After that, 03-applications.yml.
Project('my-app', 'downstream.com/my-app', revision='my-app-rev',
path='applications/my-app', topdir=tmpdir),
# upstream is the only element of our projects list, so it's
# after all the self-imports.
Project('upstream', 'upstream.com/upstream', revision='refs/tags/v1.0',
path='upstream', topdir=tmpdir),
# Projects we imported from upstream are last. Projects