Skip to content

Commit

Permalink
Add resolveSymlinks condition for project directories
Browse files Browse the repository at this point in the history
  • Loading branch information
dvz committed Dec 14, 2021
1 parent 2c70a1a commit 1da6893
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 18 deletions.
1 change: 1 addition & 0 deletions config.xsd
Expand Up @@ -144,6 +144,7 @@
<xs:complexType name="ProjectDirectoryAttributeType">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="ignoreTypeStats" type="xs:string" />
<xs:attribute name="resolveSymlinks" type="xs:boolean" />
<xs:attribute name="useStrictTypes" type="xs:string" />
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
Expand Down
42 changes: 25 additions & 17 deletions src/Psalm/Config/FileFilter.php
Expand Up @@ -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';
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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',
Expand Down
2 changes: 1 addition & 1 deletion tests/Config/ConfigTest.php
Expand Up @@ -180,7 +180,7 @@ public function testIgnoreSymlinkedProjectDirectory(): void
<projectFiles>
<directory name="tests" />
<ignoreFiles>
<directory name="tests/fixtures/symlinktest/ignored" />
<directory name="tests/fixtures/symlinktest/ignored" resolveSymlinks="true" />
</ignoreFiles>
</projectFiles>
</psalm>'
Expand Down

0 comments on commit 1da6893

Please sign in to comment.