summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin David <valentin.david@codethink.co.uk>2018-09-27 15:46:12 +0200
committerValentin David <valentin.david@codethink.co.uk>2018-09-27 15:49:28 +0200
commitfbc71ac5874f1de84217993b8b33755ff3f9dd0c (patch)
tree99fb1b5c3978f13adeba2ccf93c2380772ee2e27
parentab1cb6724b115e3d6f4f17676d11339e3094e6dc (diff)
downloadbuildstream-valentindavid/silverblue-path.tar.gz
Fix outside-of-project check when project path is not canonical.valentindavid/silverblue-path
The issue happens on Silverblue where /home is a symlink to /var/home. With this element-path is something like /var/home/user/project/elements, when the project path is /home/usr/project. Comparing canonical paths solves the issue. Fixes #673
-rw-r--r--buildstream/_yaml.py2
-rw-r--r--tests/format/project.py12
2 files changed, 13 insertions, 1 deletions
diff --git a/buildstream/_yaml.py b/buildstream/_yaml.py
index 66500fbad..4ee12a18c 100644
--- a/buildstream/_yaml.py
+++ b/buildstream/_yaml.py
@@ -467,7 +467,7 @@ def node_get_project_path(node, key, project_dir, *,
"{}: Specified path '{}' does not exist"
.format(provenance, path_str))
- is_inside = project_dir_path in full_resolved_path.parents or (
+ is_inside = project_dir_path.resolve() in full_resolved_path.parents or (
full_resolved_path == project_dir_path)
if path.is_absolute() or not is_inside:
diff --git a/tests/format/project.py b/tests/format/project.py
index 214592811..46145e578 100644
--- a/tests/format/project.py
+++ b/tests/format/project.py
@@ -188,3 +188,15 @@ def test_project_refs_options(cli, datafiles):
# Assert that the cache keys are different
assert result1.output != result2.output
+
+
+@pytest.mark.datafiles(os.path.join(DATA_DIR, 'element-path'))
+def test_element_path_project_path_contains_symlinks(cli, datafiles, tmpdir):
+ real_project = str(datafiles)
+ linked_project = os.path.join(str(tmpdir), 'linked')
+ os.symlink(real_project, linked_project)
+ os.makedirs(os.path.join(real_project, 'elements'), exist_ok=True)
+ with open(os.path.join(real_project, 'elements', 'element.bst'), 'w') as f:
+ f.write("kind: manual\n")
+ result = cli.run(project=linked_project, args=['show', 'element.bst'])
+ result.assert_success()