From 2c70a1a72aa40cb066dcf23abf05c435d6dcaf4e Mon Sep 17 00:00:00 2001 From: Tomasz Mlynski Date: Tue, 14 Dec 2021 20:00:17 +0100 Subject: [PATCH 1/2] Use flag instead of `DirectoryIterator::isDot()` --- src/Psalm/Config/FileFilter.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Psalm/Config/FileFilter.php b/src/Psalm/Config/FileFilter.php index 71f04699853..beddce22bc9 100644 --- a/src/Psalm/Config/FileFilter.php +++ b/src/Psalm/Config/FileFilter.php @@ -1,6 +1,7 @@ rewind(); while ($iterator->valid()) { - if (!$iterator->isDot() && $iterator->isLink()) { + if ($iterator->isLink()) { $linked_path = readlink($iterator->getPathname()); if (stripos($linked_path, $directory_path) !== 0) { From 1da689345106293165bb8c6373816265aa043f26 Mon Sep 17 00:00:00 2001 From: Tomasz Mlynski Date: Tue, 14 Dec 2021 20:25:27 +0100 Subject: [PATCH 2/2] Add `resolveSymlinks` condition for project directories --- config.xsd | 1 + src/Psalm/Config/FileFilter.php | 42 ++++++++++++++++++++------------- tests/Config/ConfigTest.php | 2 +- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/config.xsd b/config.xsd index ab37ca2dcd3..cc51ba82ca3 100644 --- a/config.xsd +++ b/config.xsd @@ -144,6 +144,7 @@ + diff --git a/src/Psalm/Config/FileFilter.php b/src/Psalm/Config/FileFilter.php index beddce22bc9..dc9acf742e2 100644 --- a/src/Psalm/Config/FileFilter.php +++ b/src/Psalm/Config/FileFilter.php @@ -114,6 +114,7 @@ public static function loadFromArray( $ignore_type_stats = strtolower( isset($directory['ignoreTypeStats']) ? (string) $directory['ignoreTypeStats'] : '' ) === 'true'; + $resolve_symlinks = isset($directory['resolveSymlinks']) && $directory['resolveSymlinks'] === true; $declare_strict_types = strtolower( isset($directory['useStrictTypes']) ? (string) $directory['useStrictTypes'] : '' ) === 'true'; @@ -186,29 +187,33 @@ public static function loadFromArray( ); } - /** @var RecursiveDirectoryIterator */ - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($directory_path, FilesystemIterator::SKIP_DOTS) - ); - $iterator->rewind(); + if ($resolve_symlinks) { + /** @var RecursiveDirectoryIterator */ + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($directory_path, FilesystemIterator::SKIP_DOTS) + ); + $iterator->rewind(); - while ($iterator->valid()) { - if ($iterator->isLink()) { - $linked_path = readlink($iterator->getPathname()); + while ($iterator->valid()) { + if ($iterator->isLink()) { + $linked_path = readlink($iterator->getPathname()); - if (stripos($linked_path, $directory_path) !== 0) { - if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { - $filter->ignore_type_stats[$directory_path] = true; - } + if (stripos($linked_path, $directory_path) !== 0) { + if ($ignore_type_stats && $filter instanceof ProjectFileFilter) { + $filter->ignore_type_stats[$directory_path] = true; + } - if ($declare_strict_types && $filter instanceof ProjectFileFilter) { - $filter->declare_strict_types[$directory_path] = true; - } + if ($declare_strict_types && $filter instanceof ProjectFileFilter) { + $filter->declare_strict_types[$directory_path] = true; + } - if (is_dir($linked_path)) { - $filter->addDirectory($linked_path); + if (is_dir($linked_path)) { + $filter->addDirectory($linked_path); + } } } + + $iterator->next(); } $iterator->next(); @@ -356,6 +361,9 @@ public static function loadFromXMLElement( isset($directory['ignoreTypeStats']) ? (string) $directory['ignoreTypeStats'] : '' ) === 'true', + 'resolveSymlinks' => strtolower( + isset($directory['resolveSymlinks']) ? (string) $directory['resolveSymlinks'] : '' + ) === 'true', 'useStrictTypes' => strtolower( isset($directory['useStrictTypes']) ? (string) $directory['useStrictTypes'] : '' ) === 'true', diff --git a/tests/Config/ConfigTest.php b/tests/Config/ConfigTest.php index b77e573cf5e..f86dc722807 100644 --- a/tests/Config/ConfigTest.php +++ b/tests/Config/ConfigTest.php @@ -180,7 +180,7 @@ public function testIgnoreSymlinkedProjectDirectory(): void - + '