4
* Uses `ruby` to detect various errors in Ruby code.
6
final class ArcanistRubyLinter extends ArcanistExternalLinter {
8
public function getInfoURI() {
9
return 'https://www.ruby-lang.org/';
12
public function getInfoName() {
16
public function getInfoDescription() {
17
return pht('Use `ruby` to check for syntax errors in Ruby source files.');
20
public function getLinterName() {
24
public function getLinterConfigurationName() {
28
public function getDefaultBinary() {
29
$prefix = $this->getDeprecatedConfiguration('lint.ruby.prefix');
30
if ($prefix !== null) {
31
$ruby_bin = $prefix.'ruby';
37
public function getVersion() {
38
list($stdout) = execx('%C --version', $this->getExecutableCommand());
41
$regex = '/^ruby (?P<version>\d+\.\d+\.\d+)p\d+/';
42
if (preg_match($regex, $stdout, $matches)) {
43
return $matches['version'];
49
public function getInstallInstructions() {
50
return pht('Install `ruby` from <http://www.ruby-lang.org/>.');
53
public function supportsReadDataFromStdin() {
57
public function shouldExpectCommandErrors() {
61
protected function getMandatoryFlags() {
62
// -w: turn on warnings
64
return array('-w', '-c');
67
protected function parseLinterOutput($path, $err, $stdout, $stderr) {
68
$lines = phutil_split_lines($stderr, false);
71
foreach ($lines as $line) {
74
if (!preg_match('/(.*?):(\d+): (.*?)$/', $line, $matches)) {
78
foreach ($matches as $key => $match) {
79
$matches[$key] = trim($match);
82
$code = head(explode(',', $matches[3]));
84
$message = new ArcanistLintMessage();
85
$message->setPath($path);
86
$message->setLine($matches[2]);
87
$message->setCode($this->getLinterName());
88
$message->setName(pht('Syntax Error'));
89
$message->setDescription($matches[3]);
90
$message->setSeverity($this->getLintMessageSeverity($code));
92
$messages[] = $message;
95
if ($err && !$messages) {