From 025e964b08a4c7fa3ce164e25b7f00eb9ab4754b Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Thu, 29 Feb 2024 13:44:35 +0530 Subject: [PATCH 01/24] Added tests to check direct use of core dependencies, #PG-3272 --- .github/workflows/matomo-tests.yml | 2 + .../CheckDirectDependencyUseCommandTest.php | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/System/CheckDirectDependencyUseCommandTest.php diff --git a/.github/workflows/matomo-tests.yml b/.github/workflows/matomo-tests.yml index 5df6c666..f9cdbbc2 100644 --- a/.github/workflows/matomo-tests.yml +++ b/.github/workflows/matomo-tests.yml @@ -45,6 +45,8 @@ jobs: lfs: true persist-credentials: false submodules: true + - name: Install package ripgrep + run: sudo apt-get install ripgrep - name: Run tests uses: matomo-org/github-action-tests@main with: diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php new file mode 100644 index 00000000..8810da81 --- /dev/null +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -0,0 +1,45 @@ +markTestSkipped('tests:check-direct-dependency-use is not available in this version'); + } + $pluginName = 'LoginLdap'; + $console = new \Piwik\Console(self::$fixture->piwikEnvironment); + $checkDirectDependencyUse = new CheckDirectDependencyUse(); + $console->addCommands([$checkDirectDependencyUse]); + $command = $console->find('tests:check-direct-dependency-use'); + $arguments = array( + 'command' => 'tests:check-direct-dependency-use', + '--plugin' => $pluginName + ); + $inputObject = new ArrayInput($arguments); + $command->run($inputObject, new NullOutput()); + + $this->assertEquals([ + 'DI\\' => [ + 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php' + ], + 'Symfony\Component\Console\\' => [ + 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', + 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', + ] + ], $checkDirectDependencyUse->usesFoundList[$pluginName]); + } +} \ No newline at end of file From 6cb94eb0b4f1c3799002018dd2cbc913496a82ef Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Fri, 1 Mar 2024 11:11:45 +0530 Subject: [PATCH 02/24] Minor change for file_exists --- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 8810da81..436e9ee5 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -17,7 +17,7 @@ class CheckDirectDependencyUseCommandTest extends SystemTestCase { public function testCommand() { - if (version_compare(Version::VERSION, '5.0.2', '<=') && !\Piwik\file_exists(PIWIK_INCLUDE_PATH . '/plugins/TestRunner/Commands/CheckDirectDependencyUse.php')) { + if (version_compare(Version::VERSION, '5.0.2', '<=') && !file_exists(PIWIK_INCLUDE_PATH . '/plugins/TestRunner/Commands/CheckDirectDependencyUse.php')) { $this->markTestSkipped('tests:check-direct-dependency-use is not available in this version'); } $pluginName = 'LoginLdap'; From 32adea9e6fad4da3df5b9cf7669ca7ad4fdf9c53 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Fri, 1 Mar 2024 11:49:02 +0530 Subject: [PATCH 03/24] Changes to test the response --- tests/System/CheckDirectDependencyUseCommandTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 436e9ee5..c346056a 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -31,6 +31,7 @@ public function testCommand() ); $inputObject = new ArrayInput($arguments); $command->run($inputObject, new NullOutput()); + $this->assertEmpty($checkDirectDependencyUse->usesFoundList); $this->assertEquals([ 'DI\\' => [ From 783de13bce568f8ebbc381f92758013a1745f1e2 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Fri, 1 Mar 2024 11:54:49 +0530 Subject: [PATCH 04/24] More changes to debug test failing --- tests/System/CheckDirectDependencyUseCommandTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index c346056a..156ee03c 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -31,7 +31,9 @@ public function testCommand() ); $inputObject = new ArrayInput($arguments); $command->run($inputObject, new NullOutput()); - $this->assertEmpty($checkDirectDependencyUse->usesFoundList); + $this->assertEquals(['DI\\' => [ + 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php' + ]],$checkDirectDependencyUse->usesFoundList); $this->assertEquals([ 'DI\\' => [ From b74625d85ac38f820a291d005925e9b4bff7c0e3 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Fri, 1 Mar 2024 12:06:48 +0530 Subject: [PATCH 05/24] Added more testing --- tests/System/CheckDirectDependencyUseCommandTest.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 156ee03c..0b0c872b 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -12,6 +12,7 @@ use Piwik\Version; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\NullOutput; +use Monolog\Logger; class CheckDirectDependencyUseCommandTest extends SystemTestCase { @@ -31,18 +32,8 @@ public function testCommand() ); $inputObject = new ArrayInput($arguments); $command->run($inputObject, new NullOutput()); - $this->assertEquals(['DI\\' => [ - 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php' - ]],$checkDirectDependencyUse->usesFoundList); $this->assertEquals([ - 'DI\\' => [ - 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php' - ], - 'Symfony\Component\Console\\' => [ - 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', - 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', - ] ], $checkDirectDependencyUse->usesFoundList[$pluginName]); } } \ No newline at end of file From d4647094b6be3b43c08beaf01792872395526c43 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Fri, 1 Mar 2024 13:05:26 +0530 Subject: [PATCH 06/24] Removed unwanted use statements --- tests/System/CheckDirectDependencyUseCommandTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 0b0c872b..3f2fca41 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -12,7 +12,6 @@ use Piwik\Version; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\NullOutput; -use Monolog\Logger; class CheckDirectDependencyUseCommandTest extends SystemTestCase { From 752dfe64b59ab9a96a1a9bdd431d6476261c1ae7 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 04:27:03 +0530 Subject: [PATCH 07/24] Changes for testing --- Commands/CheckDirectDependencyUse.php | 147 ++++++++++++++++++ .../CheckDirectDependencyUseCommandTest.php | 9 +- 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 Commands/CheckDirectDependencyUse.php diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php new file mode 100644 index 00000000..9ab5457c --- /dev/null +++ b/Commands/CheckDirectDependencyUse.php @@ -0,0 +1,147 @@ +setName('tests:check-direct-dependency-use'); + $this->addRequiredValueOption('plugin', null, 'Run test only for a specific plugin'); + $this->addNoValueOption('grep-vendor', null, 'Do not skip vendor folders and scan them too'); + $this->setDescription('checks for direct dependency use in plugins'); + } + + protected function doExecute(): int + { + [$psr4NamespacePrefixes, $psr0Prefixes] = $this->getCoreDependencyNamespacePrefixes(); + + $input = $this->getInput(); + $plugin = $input->getOption('plugin'); + $isGrepVendorFolder = $input->getOption('grep-vendor'); + + if (!empty($plugin)) { + $this->usesFoundList[$plugin] = []; + } + + $this->grepUses($psr4NamespacePrefixes, 'psr4', $plugin, $isGrepVendorFolder); + $this->grepUses($psr0Prefixes, 'psr0', $plugin, $isGrepVendorFolder); + + return self::SUCCESS; + } + + private function getCoreDependencyNamespacePrefixes() + { + $psr4NamespacePrefixes = []; + $psr0Prefixes = []; + + $coreComposerLock = PIWIK_INCLUDE_PATH . '/composer.lock'; + $coreComposerLockContents = file_get_contents($coreComposerLock); + $coreComposerLockContents = json_decode($coreComposerLockContents, true); + + foreach ($coreComposerLockContents['packages'] as $package) { + $psr4NamespacePrefixes = array_merge( + $psr4NamespacePrefixes, + array_keys($package['autoload']['psr-4'] ?? []) + ); + + $psr0Prefixes = array_merge( + $psr0Prefixes, + array_keys($package['autoload']['psr-0'] ?? []) + ); + } + + $psr4NamespacePrefixes = array_filter($psr4NamespacePrefixes); + $psr4NamespacePrefixes = array_unique($psr4NamespacePrefixes); + + $psr0Prefixes = array_filter($psr0Prefixes); + $psr0Prefixes = array_unique($psr0Prefixes); + + return [$psr4NamespacePrefixes, $psr0Prefixes]; + } + + private function grepUses($prefixes, $psrType, $plugin, $isGrepVendorFolder) + { + foreach ($prefixes as $prefix) { + $directUses = $this->grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder); + if (!empty($directUses)) { + $this->reportDirectUses($prefix, $directUses, $psrType); + } + } + } + + private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) + { + $uses = []; + $rgOutput = []; + + if ($plugin) { + $plugin = '/' . $plugin; + } + + $vendorScan = '--glob=\\!vendor'; + if ($isGrepVendorFolder) { + $vendorScan = ''; + } + + if ($psrType === 'psr4') { + $prefix = rtrim($prefix, '\\'); + $regex = ' \\\\?' . preg_quote($prefix) . '\\b'; + } else if ($psrType === 'psr0') { + $regex = '\\b' . preg_quote($prefix) . '_'; + } + + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH . '/plugins' . $plugin; + echo PHP_EOL . $command . PHP_EOL; + exec($command, $rgOutput, $returnCode); + + if (isset($returnCode) && $returnCode == 127) { + throw new Exception('Please install ripgrep package, Check https://github.com/BurntSushi/ripgrep?tab=readme-ov-file#installation for installation'); + } + + foreach ($rgOutput as $line) { + $line = json_decode($line, true); + if ($line['type'] !== 'match') { + continue; + } + + $path = $line['data']['path']['text']; + $path = str_replace(PIWIK_INCLUDE_PATH, '', $path); + $path = ltrim($path, '/'); + + $parts = explode('/', $path); + array_shift($parts); + $pluginName = array_shift($parts); + + if (file_exists(PIWIK_INCLUDE_PATH . '/plugins/' . $pluginName . '/.git')) { + $remainingPath = implode('/', $parts); + $uses[$pluginName][] = $remainingPath; + } + } + + foreach ($uses as $pluginName => $entries) { + $uses[$pluginName] = array_unique($entries); + } + + return $uses; + } + + private function reportDirectUses($prefix, $directUses, $type) + { + $output = $this->getOutput(); + $output->writeln("Found '$prefix' ($type) usage in:"); + foreach ($directUses as $plugin => $files) { + foreach ($files as $file) { + $this->usesFoundList[$plugin][$prefix][] = $plugin . '/' . $file; + } + $output->writeln(" - $plugin, " . count($files) . " files"); + } + } +} diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 3f2fca41..2780cfeb 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -7,7 +7,7 @@ */ namespace Piwik\Plugins\LoginLdap\tests\System; -use Piwik\Plugins\TestRunner\Commands\CheckDirectDependencyUse; +use Piwik\Plugins\LoginLdap\Commands\CheckDirectDependencyUse; use Piwik\Tests\Framework\TestCase\SystemTestCase; use Piwik\Version; use Symfony\Component\Console\Input\ArrayInput; @@ -33,6 +33,13 @@ public function testCommand() $command->run($inputObject, new NullOutput()); $this->assertEquals([ + 'DI\\' => [ + 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php' + ], + 'Symfony\Component\Console\\' => [ + 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', + 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', + ] ], $checkDirectDependencyUse->usesFoundList[$pluginName]); } } \ No newline at end of file From 443d883ab1d708e905803cced70922c5fa9401ce Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 04:33:38 +0530 Subject: [PATCH 08/24] Changes for testing --- tests/System/CheckDirectDependencyUseCommandTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 2780cfeb..c959d002 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -20,14 +20,13 @@ public function testCommand() if (version_compare(Version::VERSION, '5.0.2', '<=') && !file_exists(PIWIK_INCLUDE_PATH . '/plugins/TestRunner/Commands/CheckDirectDependencyUse.php')) { $this->markTestSkipped('tests:check-direct-dependency-use is not available in this version'); } - $pluginName = 'LoginLdap'; +// $pluginName = 'LoginLdap'; $console = new \Piwik\Console(self::$fixture->piwikEnvironment); $checkDirectDependencyUse = new CheckDirectDependencyUse(); $console->addCommands([$checkDirectDependencyUse]); $command = $console->find('tests:check-direct-dependency-use'); $arguments = array( 'command' => 'tests:check-direct-dependency-use', - '--plugin' => $pluginName ); $inputObject = new ArrayInput($arguments); $command->run($inputObject, new NullOutput()); From e0b14ef0587ec94dc0ddf72f78b85fdf3f9dfc9f Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 04:40:14 +0530 Subject: [PATCH 09/24] More changes to test --- tests/System/CheckDirectDependencyUseCommandTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index c959d002..3bf51b97 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -20,7 +20,7 @@ public function testCommand() if (version_compare(Version::VERSION, '5.0.2', '<=') && !file_exists(PIWIK_INCLUDE_PATH . '/plugins/TestRunner/Commands/CheckDirectDependencyUse.php')) { $this->markTestSkipped('tests:check-direct-dependency-use is not available in this version'); } -// $pluginName = 'LoginLdap'; + $pluginName = 'LoginLdap'; $console = new \Piwik\Console(self::$fixture->piwikEnvironment); $checkDirectDependencyUse = new CheckDirectDependencyUse(); $console->addCommands([$checkDirectDependencyUse]); @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList[$pluginName]); + ], $checkDirectDependencyUse->usesFoundList); } } \ No newline at end of file From f976db1e95fe88383022caeeaed37248ca3eceb1 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 04:49:50 +0530 Subject: [PATCH 10/24] More changes for testing --- Commands/CheckDirectDependencyUse.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index 9ab5457c..55a8cb80 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -83,7 +83,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $rgOutput = []; if ($plugin) { - $plugin = '/' . $plugin; + $plugin = '/plugins/' . $plugin; } $vendorScan = '--glob=\\!vendor'; @@ -98,7 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH . '/plugins' . $plugin; + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH . $plugin; echo PHP_EOL . $command . PHP_EOL; exec($command, $rgOutput, $returnCode); From 541dd6fe2fd4051951dd6d1c576d33567e419037 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 04:54:57 +0530 Subject: [PATCH 11/24] More changes --- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 3bf51b97..b9ee85e9 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList); + ], $checkDirectDependencyUse->usesFoundList['DI\\']); } } \ No newline at end of file From 45df704dafda4f64c4123af96a5be383b44d6f75 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 04:59:52 +0530 Subject: [PATCH 12/24] more changes --- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index b9ee85e9..3bf51b97 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList['DI\\']); + ], $checkDirectDependencyUse->usesFoundList); } } \ No newline at end of file From 6ad02001fd2cabca8626d974867943c599165228 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 05:06:31 +0530 Subject: [PATCH 13/24] More changes to debug --- Commands/CheckDirectDependencyUse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index 55a8cb80..7f6405a3 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -139,7 +139,7 @@ private function reportDirectUses($prefix, $directUses, $type) $output->writeln("Found '$prefix' ($type) usage in:"); foreach ($directUses as $plugin => $files) { foreach ($files as $file) { - $this->usesFoundList[$plugin][$prefix][] = $plugin . '/' . $file; + $this->usesFoundList[] = $plugin . '/' . $file; } $output->writeln(" - $plugin, " . count($files) . " files"); } From d8690728be8ae61625ca566586a129b06e0f9922 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 05:12:14 +0530 Subject: [PATCH 14/24] More changes to find failing test behaviour --- Commands/CheckDirectDependencyUse.php | 2 +- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index 7f6405a3..cb7b1abb 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -139,7 +139,7 @@ private function reportDirectUses($prefix, $directUses, $type) $output->writeln("Found '$prefix' ($type) usage in:"); foreach ($directUses as $plugin => $files) { foreach ($files as $file) { - $this->usesFoundList[] = $plugin . '/' . $file; + $this->usesFoundList[$plugin][rtrim($prefix, '\\')][] = $plugin . '/' . $file; } $output->writeln(" - $plugin, " . count($files) . " files"); } diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 3bf51b97..f3054527 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList); + ], $checkDirectDependencyUse->usesFoundList['DI']); } } \ No newline at end of file From 54d85c9a88482bff2c8fe80c1642c1ae6e701083 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 05:18:44 +0530 Subject: [PATCH 15/24] test changes --- Commands/CheckDirectDependencyUse.php | 2 +- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index cb7b1abb..8325b356 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -139,7 +139,7 @@ private function reportDirectUses($prefix, $directUses, $type) $output->writeln("Found '$prefix' ($type) usage in:"); foreach ($directUses as $plugin => $files) { foreach ($files as $file) { - $this->usesFoundList[$plugin][rtrim($prefix, '\\')][] = $plugin . '/' . $file; + $this->usesFoundList[rtrim($plugin, '\\')][rtrim($prefix, '\\')][] = $plugin . '/' . $file; } $output->writeln(" - $plugin, " . count($files) . " files"); } diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index f3054527..3bf51b97 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList['DI']); + ], $checkDirectDependencyUse->usesFoundList); } } \ No newline at end of file From fb4de7c9d19fbe22d5c28cdb5cf33796083804d4 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 05:28:16 +0530 Subject: [PATCH 16/24] test changes --- Commands/CheckDirectDependencyUse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index 8325b356..70467335 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -98,7 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH . $plugin; + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_DOCUMENT_ROOT . $plugin; echo PHP_EOL . $command . PHP_EOL; exec($command, $rgOutput, $returnCode); From aa60379a2c342f13f937eb81750ba86473195ecb Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 05:54:11 +0530 Subject: [PATCH 17/24] Fix to check if things worksnow --- Commands/CheckDirectDependencyUse.php | 4 ++-- tests/System/CheckDirectDependencyUseCommandTest.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index 70467335..b5baca1f 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -98,7 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_DOCUMENT_ROOT . $plugin; + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_DOCUMENT_ROOT; echo PHP_EOL . $command . PHP_EOL; exec($command, $rgOutput, $returnCode); @@ -113,7 +113,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) } $path = $line['data']['path']['text']; - $path = str_replace(PIWIK_INCLUDE_PATH, '', $path); + $path = str_replace(PIWIK_DOCUMENT_ROOT, '', $path); $path = ltrim($path, '/'); $parts = explode('/', $path); diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 3bf51b97..ac75a55b 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -32,13 +32,13 @@ public function testCommand() $command->run($inputObject, new NullOutput()); $this->assertEquals([ - 'DI\\' => [ + 'DI' => [ 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php' ], - 'Symfony\Component\Console\\' => [ + 'Symfony\Component\Console' => [ 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList); + ], $checkDirectDependencyUse->usesFoundList[$pluginName]); } } \ No newline at end of file From 8c6bd2a5695db36077864ca2009634fdd00d754c Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 06:59:30 +0530 Subject: [PATCH 18/24] Set path exclusively --- Commands/CheckDirectDependencyUse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index b5baca1f..12f42ba2 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -98,7 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_DOCUMENT_ROOT; + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . dirname(__FILE__, 4); echo PHP_EOL . $command . PHP_EOL; exec($command, $rgOutput, $returnCode); From 5a104f83557154910b5b2a21e2b16ef7495acc72 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 07:04:21 +0530 Subject: [PATCH 19/24] More level down for path --- Commands/CheckDirectDependencyUse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index 12f42ba2..bf978f56 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -98,7 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . dirname(__FILE__, 4); + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . dirname(__FILE__, 5); echo PHP_EOL . $command . PHP_EOL; exec($command, $rgOutput, $returnCode); From d0f03e887eb736c003e07f31b48d99837da95791 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 07:39:29 +0530 Subject: [PATCH 20/24] Changes to make work for a plugin --- Commands/CheckDirectDependencyUse.php | 6 +++--- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index bf978f56..d119b258 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -98,7 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . dirname(__FILE__, 5); + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH; echo PHP_EOL . $command . PHP_EOL; exec($command, $rgOutput, $returnCode); @@ -113,14 +113,14 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) } $path = $line['data']['path']['text']; - $path = str_replace(PIWIK_DOCUMENT_ROOT, '', $path); + $path = str_replace(PIWIK_INCLUDE_PATH, '', $path); $path = ltrim($path, '/'); $parts = explode('/', $path); array_shift($parts); $pluginName = array_shift($parts); - if (file_exists(PIWIK_INCLUDE_PATH . '/plugins/' . $pluginName . '/.git')) { + if ($pluginName) { $remainingPath = implode('/', $parts); $uses[$pluginName][] = $remainingPath; } diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index ac75a55b..2c2c0a1b 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList[$pluginName]); + ], $checkDirectDependencyUse->usesFoundList); } } \ No newline at end of file From a276d00d2d74cda3593c405e7cde084798bbc07c Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 07:43:28 +0530 Subject: [PATCH 21/24] Fixes for plugin --- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 2c2c0a1b..ac75a55b 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -39,6 +39,6 @@ public function testCommand() 'LoginLdap/tests/Integration/Commands/SynchronizeUsersTest.php', 'LoginLdap/tests/System/CheckDirectDependencyUseCommandTest.php', ] - ], $checkDirectDependencyUse->usesFoundList); + ], $checkDirectDependencyUse->usesFoundList[$pluginName]); } } \ No newline at end of file From 31f12a461d2cbc5c08c8873187a02920584915c2 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 07:54:36 +0530 Subject: [PATCH 22/24] Changes to work with all plugins --- Commands/CheckDirectDependencyUse.php | 3 +-- tests/System/CheckDirectDependencyUseCommandTest.php | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php index d119b258..30ee929e 100644 --- a/Commands/CheckDirectDependencyUse.php +++ b/Commands/CheckDirectDependencyUse.php @@ -98,8 +98,7 @@ private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) $regex = '\\b' . preg_quote($prefix) . '_'; } - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH; - echo PHP_EOL . $command . PHP_EOL; + $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH . $plugin; exec($command, $rgOutput, $returnCode); if (isset($returnCode) && $returnCode == 127) { diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index ac75a55b..7b31fc9a 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -27,6 +27,7 @@ public function testCommand() $command = $console->find('tests:check-direct-dependency-use'); $arguments = array( 'command' => 'tests:check-direct-dependency-use', + '--plugin' => $pluginName ); $inputObject = new ArrayInput($arguments); $command->run($inputObject, new NullOutput()); From 02ca0dce8908bc4371068a5f18a5e268cce2e8fa Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 08:14:58 +0530 Subject: [PATCH 23/24] Removed changes added for debugging --- Commands/CheckDirectDependencyUse.php | 146 ------------------ .../CheckDirectDependencyUseCommandTest.php | 2 +- 2 files changed, 1 insertion(+), 147 deletions(-) delete mode 100644 Commands/CheckDirectDependencyUse.php diff --git a/Commands/CheckDirectDependencyUse.php b/Commands/CheckDirectDependencyUse.php deleted file mode 100644 index 30ee929e..00000000 --- a/Commands/CheckDirectDependencyUse.php +++ /dev/null @@ -1,146 +0,0 @@ -setName('tests:check-direct-dependency-use'); - $this->addRequiredValueOption('plugin', null, 'Run test only for a specific plugin'); - $this->addNoValueOption('grep-vendor', null, 'Do not skip vendor folders and scan them too'); - $this->setDescription('checks for direct dependency use in plugins'); - } - - protected function doExecute(): int - { - [$psr4NamespacePrefixes, $psr0Prefixes] = $this->getCoreDependencyNamespacePrefixes(); - - $input = $this->getInput(); - $plugin = $input->getOption('plugin'); - $isGrepVendorFolder = $input->getOption('grep-vendor'); - - if (!empty($plugin)) { - $this->usesFoundList[$plugin] = []; - } - - $this->grepUses($psr4NamespacePrefixes, 'psr4', $plugin, $isGrepVendorFolder); - $this->grepUses($psr0Prefixes, 'psr0', $plugin, $isGrepVendorFolder); - - return self::SUCCESS; - } - - private function getCoreDependencyNamespacePrefixes() - { - $psr4NamespacePrefixes = []; - $psr0Prefixes = []; - - $coreComposerLock = PIWIK_INCLUDE_PATH . '/composer.lock'; - $coreComposerLockContents = file_get_contents($coreComposerLock); - $coreComposerLockContents = json_decode($coreComposerLockContents, true); - - foreach ($coreComposerLockContents['packages'] as $package) { - $psr4NamespacePrefixes = array_merge( - $psr4NamespacePrefixes, - array_keys($package['autoload']['psr-4'] ?? []) - ); - - $psr0Prefixes = array_merge( - $psr0Prefixes, - array_keys($package['autoload']['psr-0'] ?? []) - ); - } - - $psr4NamespacePrefixes = array_filter($psr4NamespacePrefixes); - $psr4NamespacePrefixes = array_unique($psr4NamespacePrefixes); - - $psr0Prefixes = array_filter($psr0Prefixes); - $psr0Prefixes = array_unique($psr0Prefixes); - - return [$psr4NamespacePrefixes, $psr0Prefixes]; - } - - private function grepUses($prefixes, $psrType, $plugin, $isGrepVendorFolder) - { - foreach ($prefixes as $prefix) { - $directUses = $this->grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder); - if (!empty($directUses)) { - $this->reportDirectUses($prefix, $directUses, $psrType); - } - } - } - - private function grepForUses($prefix, $psrType, $plugin, $isGrepVendorFolder) - { - $uses = []; - $rgOutput = []; - - if ($plugin) { - $plugin = '/plugins/' . $plugin; - } - - $vendorScan = '--glob=\\!vendor'; - if ($isGrepVendorFolder) { - $vendorScan = ''; - } - - if ($psrType === 'psr4') { - $prefix = rtrim($prefix, '\\'); - $regex = ' \\\\?' . preg_quote($prefix) . '\\b'; - } else if ($psrType === 'psr0') { - $regex = '\\b' . preg_quote($prefix) . '_'; - } - - $command = 'rg \'' . $regex . '\' --glob=*.php ' . $vendorScan . ' --json --sort path ' . PIWIK_INCLUDE_PATH . $plugin; - exec($command, $rgOutput, $returnCode); - - if (isset($returnCode) && $returnCode == 127) { - throw new Exception('Please install ripgrep package, Check https://github.com/BurntSushi/ripgrep?tab=readme-ov-file#installation for installation'); - } - - foreach ($rgOutput as $line) { - $line = json_decode($line, true); - if ($line['type'] !== 'match') { - continue; - } - - $path = $line['data']['path']['text']; - $path = str_replace(PIWIK_INCLUDE_PATH, '', $path); - $path = ltrim($path, '/'); - - $parts = explode('/', $path); - array_shift($parts); - $pluginName = array_shift($parts); - - if ($pluginName) { - $remainingPath = implode('/', $parts); - $uses[$pluginName][] = $remainingPath; - } - } - - foreach ($uses as $pluginName => $entries) { - $uses[$pluginName] = array_unique($entries); - } - - return $uses; - } - - private function reportDirectUses($prefix, $directUses, $type) - { - $output = $this->getOutput(); - $output->writeln("Found '$prefix' ($type) usage in:"); - foreach ($directUses as $plugin => $files) { - foreach ($files as $file) { - $this->usesFoundList[rtrim($plugin, '\\')][rtrim($prefix, '\\')][] = $plugin . '/' . $file; - } - $output->writeln(" - $plugin, " . count($files) . " files"); - } - } -} diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 7b31fc9a..8f7b0fa6 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -7,7 +7,7 @@ */ namespace Piwik\Plugins\LoginLdap\tests\System; -use Piwik\Plugins\LoginLdap\Commands\CheckDirectDependencyUse; +use Piwik\Plugins\TestRunner\Commands\CheckDirectDependencyUse; use Piwik\Tests\Framework\TestCase\SystemTestCase; use Piwik\Version; use Symfony\Component\Console\Input\ArrayInput; From 3ec98018b9d9c673f2808e19b07cb1a389b573f5 Mon Sep 17 00:00:00 2001 From: Altamash Shaikh Date: Mon, 11 Mar 2024 09:32:00 +0530 Subject: [PATCH 24/24] Updated min version check --- tests/System/CheckDirectDependencyUseCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/System/CheckDirectDependencyUseCommandTest.php b/tests/System/CheckDirectDependencyUseCommandTest.php index 8f7b0fa6..b04f4d83 100644 --- a/tests/System/CheckDirectDependencyUseCommandTest.php +++ b/tests/System/CheckDirectDependencyUseCommandTest.php @@ -17,7 +17,7 @@ class CheckDirectDependencyUseCommandTest extends SystemTestCase { public function testCommand() { - if (version_compare(Version::VERSION, '5.0.2', '<=') && !file_exists(PIWIK_INCLUDE_PATH . '/plugins/TestRunner/Commands/CheckDirectDependencyUse.php')) { + if (version_compare(Version::VERSION, '5.0.3', '<=') && !file_exists(PIWIK_INCLUDE_PATH . '/plugins/TestRunner/Commands/CheckDirectDependencyUse.php')) { $this->markTestSkipped('tests:check-direct-dependency-use is not available in this version'); } $pluginName = 'LoginLdap';