Skip to content

Commit

Permalink
tests: regression test for submodules with relative paths
Browse files Browse the repository at this point in the history
Add a regression test for
#545.

Mark it xfail for now since we don't have a fix. We'll remove that
once we have the fix in place.

Signed-off-by: Martí Bolívar <[email protected]>
  • Loading branch information
mbolivar-nordic committed Feb 17, 2023
1 parent d9f00e2 commit 4e51e7f
Showing 1 changed file with 104 additions and 0 deletions.
104 changes: 104 additions & 0 deletions tests/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,110 @@ def test_update_submodules_strategy(repos_tmpdir):
assert net_tools_project.sha('HEAD', cwd=kconfiglib_dst_dir) \
== kconfiglib_new_sha

@pytest.mark.xfail
def test_update_submodules_relpath(tmpdir):
# Regression test for
# https://github.com/zephyrproject-rtos/west/issues/545.
#
# We need to make sure that submodules with relative paths are
# initialized correctly even when ther is no "origin" remote.
#
# Background: unless the config variable git.$SUBMODULENAME.url is
# set, "git submodule init" relies on the "default remote" for
# figuring out how to turn that relative path into something
# useful. The "default remote" ends up being "origin" in the
# situation where we are initializing a submodule from a
# superproject which is a west project.
#
# However, west neither makes nor expects any guarantees
# about any particular git remotes being present in a project, so
# that only works if we set the config variable before
# initializing the module.

# The following paths begin with 'project' if they are west projects,
# and 'submodule' if they are direct or transitive submodules of a
# west project. Numeric suffixes reflect the tree structure of the
# workspace:
#
# workspace
# ├── manifest
# ├── project-1
# │ └── submodule-1-1
# └── project-2
# ├── submodule-2-1
# └── submodule-2-2
# └── submodule-2-2-1
#
# Some of them are declared to west directly, some implicitly.
pseudo_remotes = tmpdir / 'remotes' # parent directory for 'remote' repos
remote_repositories = [
pseudo_remotes / path for path in
['manifest',
'project-1',
'submodule-1-1',
'project-2',
'submodule-2-1',
'submodule-2-2',
'submodule-2-2-1',
]
]
for remote_repo in remote_repositories:
create_repo(remote_repo)

add_commit(pseudo_remotes / 'manifest', 'manifest west.yml',
files={'west.yml': f'''
manifest:
remotes:
- name: not-origin
url-base: file://{pseudo_remotes}
defaults:
remote: not-origin
projects:
- name: project-1
submodules: true
- name: project-2
submodules:
- path: submodule-2-1
- name: sub-2-2
path: submodule-2-2
'''})

def add_submodule(superproject, submodule_name,
submodule_url, submodule_path):
subprocess.check_call([GIT, '-C', os.fspath(superproject),
'submodule', 'add',
'--name', submodule_name,
submodule_url, submodule_path])
add_commit(superproject, f'add submodule {submodule_name}')

add_submodule(pseudo_remotes / 'project-1', 'sub-1-1',
'../submodule-1-1', 'submodule-1-1')
add_submodule(pseudo_remotes / 'project-2', 'sub-2-1',
'../submodule-2-1', 'submodule-2-1')
add_submodule(pseudo_remotes / 'project-2', 'sub-2-2',
'../submodule-2-2', 'submodule-2-2')
add_submodule(pseudo_remotes / 'project-2' / 'submodule-2-2', 'sub-2-2-1',
'../submodule-2-2-1', 'submodule-2-2-1')

workspace = tmpdir / 'workspace'
remote_manifest = pseudo_remotes / 'manifest'
cmd(f'init -m "{remote_manifest}" "{workspace}"')

workspace.chdir()
cmd('update')
expected_dirs = [
workspace / expected for expected in
['project-1',
'project-1' / 'submodule-1-1',
'project-2',
'project-2' / 'submodule-2-1',
'project-2' / 'submodule-2-2',
'project-2' / 'submodule-2-2' / 'submodule-2-2-1',
]
]
for expected_dir in expected_dirs:
expected_dir.check(dir=1)

def test_update_recovery(tmpdir):
# Make sure that the final 'west update' can recover from the
# following turn of events:
Expand Down

0 comments on commit 4e51e7f

Please sign in to comment.