-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LiveCodePhpcpdRunner.php
113 lines (101 loc) · 2.7 KB
/
LiveCodePhpcpdRunner.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\TestFramework\CodingStandard\Tool;
use Magento\TestFramework\CodingStandard\ToolInterface;
/**
* PHP Copy Paste Detector tool wrapper
*/
class LiveCodePhpcpdRunner implements ToolInterface, BlacklistInterface
{
/**
* Report file
*
* @var string
*/
private $reportFile;
/**
* List of paths to be excluded from tool run
*
* @var array
*/
private $blacklist;
/**
* Constructor
*
* @param string $reportFile Destination file to write inspection report to
*/
public function __construct($reportFile)
{
$this->reportFile = $reportFile;
}
/**
* {@inheritdoc}
*/
public function setBlackList(array $blackList)
{
$this->blacklist = $blackList;
}
/**
* Whether the tool can be run in the current environment
*
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
*
* @return bool
*/
public function canRun()
{
exec($this->getCommand() . ' --version', $output, $exitCode);
return $exitCode === 0;
}
/**
* Run tool for files specified
*
* @param array $whiteList Files/directories to be inspected
* @return int
*
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
*/
public function run(array $whiteList)
{
$blacklistedDirs = [];
$blacklistedFileNames = [];
foreach ($this->blacklist as $file) {
$file = escapeshellarg(trim($file));
if (!$file) {
continue;
}
$ext = pathinfo($file, PATHINFO_EXTENSION);
if ($ext != '') {
$blacklistedFileNames[] = $file;
} else {
$blacklistedDirs[] = '--exclude ' . $file . ' ';
}
}
$command = $this->getCommand() . ' --log-pmd ' . escapeshellarg($this->reportFile)
. ' --names-exclude ' . join(',', $blacklistedFileNames) . ' --min-lines 13 ' . join(' ', $blacklistedDirs)
. ' ' . $this->getSourceCodePath($whiteList);
exec($command, $output, $exitCode);
return !(bool)$exitCode;
}
/**
* Get PHPCPD command
*
* @return string
*/
private function getCommand()
{
$vendorDir = require BP . '/app/etc/vendor_path.php';
return 'php ' . BP . '/' . $vendorDir . '/bin/phpcpd';
}
private function getSourceCodePath($whiteList): string
{
if(!empty($whiteList)){
return implode(',', $whiteList);
}
return $_SERVER['GITHUB_WORKSPACE'] ?: '/var/www/html';
}
}