From 1bc3d91112c046006da26d1a5c77af4854c6899b Mon Sep 17 00:00:00 2001 From: Daniele Nicolodi Date: Sun, 26 Mar 2023 10:51:28 +0200 Subject: minstall: Fix install_subdir() excludes with path separators on Win The paths in meson.build use / as path separator, however, the paths constructed during the directory structure walk use native path separators, thus the path never compare equal to the excluded ones. Normalize the exclusion paths before the comparison. --- mesonbuild/minstall.py | 2 ++ test cases/common/59 install subdir/meson.build | 6 ++++++ test cases/common/59 install subdir/sub3/data/data.txt | 1 + test cases/common/59 install subdir/sub3/data/excluded.txt | 1 + .../common/59 install subdir/sub3/data/excluded/excluded.txt | 1 + test cases/common/59 install subdir/test.json | 1 + unittests/allplatformstests.py | 11 ++++++----- 7 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 test cases/common/59 install subdir/sub3/data/data.txt create mode 100644 test cases/common/59 install subdir/sub3/data/excluded.txt create mode 100644 test cases/common/59 install subdir/sub3/data/excluded/excluded.txt diff --git a/mesonbuild/minstall.py b/mesonbuild/minstall.py index 91e87fa..c4de5c2 100644 --- a/mesonbuild/minstall.py +++ b/mesonbuild/minstall.py @@ -480,6 +480,8 @@ class Installer: raise ValueError(f'dst_dir must be absolute, got {dst_dir}') if exclude is not None: exclude_files, exclude_dirs = exclude + exclude_files = {os.path.normpath(x) for x in exclude_files} + exclude_dirs = {os.path.normpath(x) for x in exclude_dirs} else: exclude_files = exclude_dirs = set() for root, dirs, files in os.walk(src_dir): diff --git a/test cases/common/59 install subdir/meson.build b/test cases/common/59 install subdir/meson.build index 13d41be..fb2034b 100644 --- a/test cases/common/59 install subdir/meson.build +++ b/test cases/common/59 install subdir/meson.build @@ -7,6 +7,12 @@ install_subdir('sub2', exclude_directories : ['excluded'], install_dir : 'share') +# More exclusions +install_subdir('sub3', + exclude_files : ['data/excluded.txt'], + exclude_directories : ['data/excluded'], + install_dir : 'share') + subdir('subdir') # A subdir with write perms only for the owner # and read-list perms for owner and group diff --git a/test cases/common/59 install subdir/sub3/data/data.txt b/test cases/common/59 install subdir/sub3/data/data.txt new file mode 100644 index 0000000..1269488 --- /dev/null +++ b/test cases/common/59 install subdir/sub3/data/data.txt @@ -0,0 +1 @@ +data diff --git a/test cases/common/59 install subdir/sub3/data/excluded.txt b/test cases/common/59 install subdir/sub3/data/excluded.txt new file mode 100644 index 0000000..bbde3dc --- /dev/null +++ b/test cases/common/59 install subdir/sub3/data/excluded.txt @@ -0,0 +1 @@ +excluded diff --git a/test cases/common/59 install subdir/sub3/data/excluded/excluded.txt b/test cases/common/59 install subdir/sub3/data/excluded/excluded.txt new file mode 100644 index 0000000..bbde3dc --- /dev/null +++ b/test cases/common/59 install subdir/sub3/data/excluded/excluded.txt @@ -0,0 +1 @@ +excluded diff --git a/test cases/common/59 install subdir/test.json b/test cases/common/59 install subdir/test.json index 0dd885c..aa8e27a 100644 --- a/test cases/common/59 install subdir/test.json +++ b/test cases/common/59 install subdir/test.json @@ -12,6 +12,7 @@ {"type": "file", "file": "usr/share/sub1/sub2/data2.dat"}, {"type": "file", "file": "usr/share/sub2/one.dat"}, {"type": "file", "file": "usr/share/sub2/dircheck/excluded-three.dat"}, + {"type": "file", "file": "usr/share/sub3/data/data.txt"}, {"type": "dir", "file": "usr/share/new_directory"} ] } diff --git a/unittests/allplatformstests.py b/unittests/allplatformstests.py index a8ec787..493cb9c 100644 --- a/unittests/allplatformstests.py +++ b/unittests/allplatformstests.py @@ -441,14 +441,15 @@ class AllPlatformTests(BasePlatformTests): self.init(testdir) intro = self.introspect('--installed') expected = { + 'nested_elided/sub': 'share', + 'new_directory': 'share/new_directory', + 'sub/sub1': 'share/sub1', + 'sub1': 'share/sub1', 'sub2': 'share/sub2', + 'sub3': '/usr/share/sub3', + 'sub_elided': 'share', 'subdir/sub1': 'share/sub1', 'subdir/sub_elided': 'share', - 'sub1': 'share/sub1', - 'sub/sub1': 'share/sub1', - 'sub_elided': 'share', - 'nested_elided/sub': 'share', - 'new_directory': 'share/new_directory', } self.assertEqual(len(intro), len(expected)) -- cgit v1.1