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
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
'''\
manifest:
projects:
- name: p3
url: p3-url
'''})
assert (p1 / 'd').check(dir=1)
assert (p1 / 'd' / 'ignore-me.txt').check(file=1)
assert (p1 / 'd' / 'm1.yml').check(file=1)
assert (p1 / 'd' / 'm2.yml').check(file=1)
checkout_branch(p1, 'master')
assert (p1 / 'd').check(file=0, dir=0)
actual = MF().projects
expected = [ManifestProject(path='mp', topdir=topdir),
Project('p1', 'p1-url', topdir=topdir),
Project('p2', 'p2-url', topdir=topdir),
Project('p3', 'p3-url', topdir=topdir)]
for a, e in zip(actual, expected):
check_proj_consistency(a, e)
# Try this first without providing topdir.
m = M(content)
expected1 = Project('testproject_v1', 'https://url1.com/testproject',
revision='v1.0')
expected2 = Project('testproject_v2', 'https://url1.com/testproject',
revision='v2.0')
check_proj_consistency(m.projects[1], expected1)
check_proj_consistency(m.projects[2], expected2)
# Same again, but with topdir.
if platform.system() == 'Windows':
topdir = 'C:/'
else:
topdir = '/'
m = M(content, topdir=topdir)
expected1 = Project('testproject_v1', 'https://url1.com/testproject',
revision='v1.0', topdir=topdir)
expected2 = Project('testproject_v2', 'https://url1.com/testproject',
revision='v2.0', topdir=topdir)
check_proj_consistency(m.projects[1], expected1)
check_proj_consistency(m.projects[2], expected2)
def test_project_revisions():
# All projects have revisions.
# The default revision, if set, should take effect
# when not explicitly specified in a project.
m = M('''\
defaults:
revision: defaultrev
projects:
- name: p1
url: u1
- name: p2
url: u2
revision: rev
''')
expected = [Project('p1', 'u1', revision='defaultrev'),
Project('p2', 'u2', revision='rev')]
for p, e in zip(m.projects[1:], expected):
check_proj_consistency(p, e)
# The default revision, if not given in a defaults section, is
# master.
m = M('''\
projects:
- name: p1
url: u1
''')
assert m.projects[1].revision == 'master'
# It of course doesn't test any file sytem or network related
# features required to make west update, west manifest --freeze,
# etc. work.
#
# Here, the main west.yml simply imports upstream/west.yml.
# We expect the projects list to be the same as upstream's,
# with the addition of one project (upstream itself).
importer = make_importer({('upstream', 'west.yml'): _UPSTREAM_WYML})
actual = Manifest.from_data(content, manifest_path='my-repo',
topdir=TOPDIR, importer=importer,
import_flags=FPI).projects
expected = [
ManifestProject(path='my-repo', topdir=TOPDIR),
Project('upstream', 'upstream.com/upstream', revision='refs/tags/v1.0',
path='upstream', topdir=TOPDIR),
Project('hal_nordic', 'upstream.com/hal_nordic',
revision='hal_nordic-upstream-rev',
path='modules/hal/nordic', topdir=TOPDIR),
Project('segger', 'upstream.com/segger',
revision='segger-upstream-rev',
path='modules/debug/segger', topdir=TOPDIR)]
for a, e in zip(actual, expected):
check_proj_consistency(a, e)
''',
'm2.yml': '''\
manifest:
projects:
- name: p3
url: p3-url
'''})
assert (p1 / 'm1.yml').check(file=1)
assert (p1 / 'm2.yml').check(file=1)
checkout_branch(p1, 'master')
assert (p1 / 'm1.yml').check(file=0, dir=0)
assert (p1 / 'm2.yml').check(file=0, dir=0)
actual = MF().projects
expected = [ManifestProject(path='mp', topdir=topdir),
Project('p1', 'p1-url', topdir=topdir),
Project('p2', 'p2-url', topdir=topdir),
Project('p3', 'p3-url', topdir=topdir)]
for a, e in zip(actual, expected):
check_proj_consistency(a, e)