diff --git a/PHPCI/Plugin/PhpCpd.php b/PHPCI/Plugin/PhpCpd.php index 0279b8f4..0c247d85 100644 --- a/PHPCI/Plugin/PhpCpd.php +++ b/PHPCI/Plugin/PhpCpd.php @@ -54,7 +54,7 @@ class PhpCpd implements \PHPCI\Plugin } if (!empty($options['ignore'])) { - $this->ignore = $this->phpci->ignore; + $this->ignore = $options['ignore']; } } @@ -88,10 +88,50 @@ class PhpCpd implements \PHPCI\Plugin return false; } - $success = $this->phpci->executeCommand($phpcpd . ' %s "%s"', $ignore, $this->path); + $tmpfilename = tempnam('/tmp', 'phpcpd'); + + $success = $this->phpci->executeCommand($phpcpd . ' --log-pmd="%s" %s "%s"', $tmpfilename, $ignore, $this->path); print $this->phpci->getLastOutput(); + + list($errorCount, $data) = $this->processReport(file_get_contents($tmpfilename)); + $this->build->storeMeta('phpcpd-warnings', $errorCount); + $this->build->storeMeta('phpcpd-data', $data); + + unlink($tmpfilename); return $success; } + + protected function processReport($xmlString) + { + $xml = simplexml_load_string($xmlString); + + if ($xml === false) { + $this->phpci->log($xmlString); + throw new \Exception('Could not process PHPCPD report XML.'); + } + + $warnings = 0; + $data = array(); + + foreach ($xml->duplication as $duplication) { + foreach ($duplication->file as $file) { + $fileName = (string)$file['path']; + $fileName = str_replace($this->phpci->buildPath, '', $fileName); + + $data[] = array( + 'file' => $fileName, + 'line_start' => (int) $file['line'], + 'line_end' => (int) $file['line'] + (int) $duplication['lines'], + 'code' => (string) $duplication->codefragment + ); + } + + $warnings++; + } + + return array($warnings, $data); + } } + diff --git a/public/assets/js/build-plugins/phpcpd.js b/public/assets/js/build-plugins/phpcpd.js new file mode 100644 index 00000000..d1128256 --- /dev/null +++ b/public/assets/js/build-plugins/phpcpd.js @@ -0,0 +1,81 @@ +var phpcpdPlugin = PHPCI.UiPlugin.extend({ + id: 'build-phpcpd', + css: 'col-lg-12 col-md-12 col-sm-12 col-xs-12', + title: 'PHP Copy/Paste Detector', + lastData: null, + box: true, + rendered: false, + + register: function() { + var self = this; + var query = PHPCI.registerQuery('phpcpd-data', -1, {key: 'phpcpd-data'}) + + $(window).on('phpcpd-data', function(data) { + self.onUpdate(data); + }); + + $(window).on('build-updated', function() { + if (!self.rendered) { + query(); + } + }); + }, + + render: function() { + + return $('
| File | ' + + 'Start | ' + + 'End | ' + + '
|---|