From e595bb0dfef3e850cd7c3a8fbaf6a20b57a8dfc8 Mon Sep 17 00:00:00 2001 From: ABaldwinHunter Date: Mon, 7 Dec 2015 12:38:31 -0500 Subject: [PATCH 1/3] Engine accepts paths to custom ruleset When PHPMD gets run, it accepts rule names, e.g. codesize,unusedcode,naming as a comma separated string. It also accepts paths to a custome rule defined by the user mixed in. For example: ``` phpmd: enabled: true config: rulesets: "unusedcode,codesize,cleancode,design,naming,phpmd.xml" ``` where `phpmd.xml` contains a custom rule set up by user. Previously, our engine failed to honor that config setup because it didn't prefix `/code/` to the path. The result was 0 issues found across board. This change fixes that behavior. --- Runner.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Runner.php b/Runner.php index 7113332..61c7cec 100644 --- a/Runner.php +++ b/Runner.php @@ -9,6 +9,8 @@ class Runner { + const RULESETS = 'cleancode,codesize,controversial,design,naming,unusedcode'; + private $config; private $server; @@ -63,6 +65,19 @@ public function queuePaths($dir, $prefix = '', $exclusions = []) { } } + public function prefixCodeDirectory($configRulesets) { + $officialPhpRulesets = explode(',', Runner::RULESETS); + $configRulesets = explode(',', $configRulesets); + + foreach ($configRulesets as &$r) { + if (!in_array($r, $officialPhpRulesets)) { + $r = "/code/$r"; + } + } + + return implode(',', $configRulesets); + } + public function run($files) { $resultFile = tempnam(sys_get_temp_dir(), 'phpmd'); @@ -78,10 +93,11 @@ public function run($files) $phpmd->setFileExtensions(explode(',', $this->config['config']['file_extensions'])); } - $rulesets = "cleancode,codesize,controversial,design,naming,unusedcode"; + $rulesets = Runner::RULESETS; if (isset($this->config['config']['rulesets'])) { $rulesets = $this->config['config']['rulesets']; + $rulesets = $this->prefixCodeDirectory($rulesets); } $phpmd->processFiles( From 7d95b71640ed307d82d12cb98d21e16a7a3e9193 Mon Sep 17 00:00:00 2001 From: ABaldwinHunter Date: Mon, 7 Dec 2015 15:14:45 -0500 Subject: [PATCH 2/3] Fix style issues --- Runner.php | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Runner.php b/Runner.php index 61c7cec..7fde911 100644 --- a/Runner.php +++ b/Runner.php @@ -22,7 +22,7 @@ public function __construct($config, $server) public function queueDirectory($dir, $prefix = '') { - if(isset($this->config['include_paths'])) { + if (isset($this->config['include_paths'])) { $this->queueWithIncludePaths(); } else { $this->queuePaths($dir, $prefix, $this->config['exclude_paths']); @@ -31,21 +31,21 @@ public function queueDirectory($dir, $prefix = '') $this->server->process_work(false); } - public function queueWithIncludePaths() { + public function queueWithIncludePaths() + { foreach ($this->config['include_paths'] as $f) { if ($f !== '.' and $f !== '..') { - if (is_dir("/code$f")) { $this->queuePaths("/code$f", "$f/"); continue; } - $this->server->addwork(array("/code/$f")); } } } - public function queuePaths($dir, $prefix = '', $exclusions = []) { + public function queuePaths($dir, $prefix = '', $exclusions = []) + { $dir = rtrim($dir, '\\/'); foreach (scandir($dir) as $f) { @@ -65,13 +65,14 @@ public function queuePaths($dir, $prefix = '', $exclusions = []) { } } - public function prefixCodeDirectory($configRulesets) { + public function prefixCodeDirectory($configRulesets) + { $officialPhpRulesets = explode(',', Runner::RULESETS); $configRulesets = explode(',', $configRulesets); foreach ($configRulesets as &$r) { if (!in_array($r, $officialPhpRulesets)) { - $r = "/code/$r"; + $r = "/code/$r"; } } @@ -96,8 +97,9 @@ public function run($files) $rulesets = Runner::RULESETS; if (isset($this->config['config']['rulesets'])) { - $rulesets = $this->config['config']['rulesets']; - $rulesets = $this->prefixCodeDirectory($rulesets); + $rulesets = $this->prefixCodeDirectory( + $this->config['config']['rulesets'] + ); } $phpmd->processFiles( From 557dddacb8d53c4d0b91362a08313e0cb3e18339 Mon Sep 17 00:00:00 2001 From: ABaldwinHunter Date: Mon, 7 Dec 2015 16:18:55 -0500 Subject: [PATCH 3/3] Don't prefix /code/ for absolute paths If a user provides an absolute path to ruleset file, we won't prepend `/code/`. This behavior seems intuitive and also prevents breakage with current codeclimate-php configs which may have come to use `/code` as a workaround. --- Runner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runner.php b/Runner.php index 7fde911..415263c 100644 --- a/Runner.php +++ b/Runner.php @@ -71,7 +71,7 @@ public function prefixCodeDirectory($configRulesets) $configRulesets = explode(',', $configRulesets); foreach ($configRulesets as &$r) { - if (!in_array($r, $officialPhpRulesets)) { + if (!in_array($r, $officialPhpRulesets) and $r[0] != "/") { $r = "/code/$r"; } }