From e72dee9e80244ce3f42ee975cc876777a169f390 Mon Sep 17 00:00:00 2001 From: Stephen Ball Date: Thu, 12 Jun 2014 16:06:59 +0000 Subject: [PATCH] Adding a build status JS plugin for PHPCPD --- PHPCI/Plugin/PhpCpd.php | 44 ++++++++++++- public/assets/js/build-plugins/phpcpd.js | 81 ++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 public/assets/js/build-plugins/phpcpd.js 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 $('' + + '' + + '' + + ' ' + + ' ' + + ' ' + + '' + + '
FileStartEnd
'); + + }, + + onUpdate: function(e) { + if (!e.queryData) { + return; + } + + this.rendered = true; + this.lastData = e.queryData; + + var errors = this.lastData[0].meta_value; + var tbody = $('#phpcpd-data tbody'); + tbody.empty(); + + var rowClass = 'danger'; + for (var i in errors) { + var file = errors[i].file; + + if (PHPCI.fileLinkTemplate) { + var fileLink = PHPCI.fileLinkTemplate.replace('{FILE}', file); + fileLink = fileLink.replace('{LINE}', errors[i].line_start); + + file = '' + file + ''; + } + + var label = 'From'; + + if (i % 2 > 0) { + label = 'To'; + } + else { + rowClass = (rowClass == 'warning' ? 'danger' : 'warning'); + } + + var row = $('' + + '' + label + ': '+file+'' + + ''+errors[i].line_start+'' + + ''+errors[i].line_end+''); + + row.addClass(rowClass); + + tbody.append(row); + } + } +}); + +PHPCI.registerPlugin(new phpcpdPlugin());