2011-01-10 00:22:25 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
* Copyright 2012 Facebook, Inc.
|
2011-01-10 00:22:25 +01:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2011-02-19 20:36:08 +01:00
|
|
|
/**
|
|
|
|
* Runs lint rules on changes.
|
|
|
|
*
|
|
|
|
* @group workflow
|
|
|
|
*/
|
2011-01-10 00:22:25 +01:00
|
|
|
class ArcanistLintWorkflow extends ArcanistBaseWorkflow {
|
|
|
|
|
|
|
|
const RESULT_OKAY = 0;
|
|
|
|
const RESULT_WARNINGS = 1;
|
|
|
|
const RESULT_ERRORS = 2;
|
|
|
|
const RESULT_SKIP = 3;
|
|
|
|
|
2011-01-12 05:21:17 +01:00
|
|
|
private $unresolvedMessages;
|
2011-01-30 02:18:32 +01:00
|
|
|
private $shouldAmendChanges = false;
|
2012-04-06 21:23:19 +02:00
|
|
|
private $shouldAmendWithoutPrompt = false;
|
|
|
|
private $shouldAmendAutofixesWithoutPrompt = false;
|
2011-01-30 02:18:32 +01:00
|
|
|
|
|
|
|
public function setShouldAmendChanges($should_amend) {
|
|
|
|
$this->shouldAmendChanges = $should_amend;
|
|
|
|
return $this;
|
|
|
|
}
|
2011-01-12 05:21:17 +01:00
|
|
|
|
2012-04-06 21:23:19 +02:00
|
|
|
public function setShouldAmendWithoutPrompt($should_amend) {
|
|
|
|
$this->shouldAmendWithoutPrompt = $should_amend;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setShouldAmendAutofixesWithoutPrompt($should_amend) {
|
|
|
|
$this->shouldAmendAutofixesWithoutPrompt = $should_amend;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2012-03-05 19:02:37 +01:00
|
|
|
public function getCommandSynopses() {
|
2011-01-10 00:22:25 +01:00
|
|
|
return phutil_console_format(<<<EOTEXT
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
**lint** [__options__] [__paths__]
|
|
|
|
**lint** [__options__] --rev [__rev__]
|
2012-03-05 19:02:37 +01:00
|
|
|
EOTEXT
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getCommandHelp() {
|
|
|
|
return phutil_console_format(<<<EOTEXT
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
Supports: git, svn, hg
|
2011-01-10 00:22:25 +01:00
|
|
|
Run static analysis on changes to check for mistakes. If no files
|
|
|
|
are specified, lint will be run on all files which have been modified.
|
|
|
|
EOTEXT
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getArguments() {
|
|
|
|
return array(
|
|
|
|
'lintall' => array(
|
|
|
|
'help' =>
|
|
|
|
"Show all lint warnings, not just those on changed lines."
|
|
|
|
),
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
'rev' => array(
|
|
|
|
'param' => 'revision',
|
|
|
|
'help' => "Lint changes since a specific revision.",
|
|
|
|
'supports' => array(
|
|
|
|
'git',
|
|
|
|
'hg',
|
|
|
|
),
|
|
|
|
'nosupport' => array(
|
|
|
|
'svn' => "Lint does not currently support --rev in SVN.",
|
|
|
|
),
|
|
|
|
),
|
2011-04-04 03:04:20 +02:00
|
|
|
'output' => array(
|
|
|
|
'param' => 'format',
|
2011-01-10 00:22:25 +01:00
|
|
|
'help' =>
|
2011-04-04 03:04:20 +02:00
|
|
|
"With 'summary', show lint warnings in a more compact format. ".
|
2011-06-29 03:14:07 +02:00
|
|
|
"With 'json', show lint warnings in machine-readable JSON format. ".
|
|
|
|
"With 'compiler', show lint warnings in suitable for your editor."
|
2011-01-10 00:22:25 +01:00
|
|
|
),
|
|
|
|
'advice' => array(
|
|
|
|
'help' =>
|
|
|
|
"Show lint advice, not just warnings and errors."
|
|
|
|
),
|
|
|
|
'engine' => array(
|
|
|
|
'param' => 'classname',
|
|
|
|
'help' =>
|
|
|
|
"Override configured lint engine for this project."
|
|
|
|
),
|
2011-01-10 23:03:12 +01:00
|
|
|
'apply-patches' => array(
|
|
|
|
'help' =>
|
|
|
|
'Apply patches suggested by lint to the working copy without '.
|
|
|
|
'prompting.',
|
|
|
|
'conflicts' => array(
|
|
|
|
'never-apply-patches' => true,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
'never-apply-patches' => array(
|
|
|
|
'help' => 'Never apply patches suggested by lint.',
|
|
|
|
'conflicts' => array(
|
|
|
|
'apply-patches' => true,
|
|
|
|
),
|
|
|
|
),
|
2012-04-06 21:23:19 +02:00
|
|
|
'amend-all' => array(
|
|
|
|
'help' =>
|
|
|
|
'When linting git repositories, amend HEAD with all patches '.
|
|
|
|
'suggested by lint without prompting.',
|
|
|
|
),
|
|
|
|
'amend-autofixes' => array(
|
|
|
|
'help' =>
|
2012-05-25 10:59:43 +02:00
|
|
|
'When linting git repositories, amend HEAD with autofix '.
|
|
|
|
'patches suggested by lint without prompting.',
|
2012-04-06 21:23:19 +02:00
|
|
|
),
|
2011-01-10 00:22:25 +01:00
|
|
|
'*' => 'paths',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function requiresWorkingCopy() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
public function requiresRepositoryAPI() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
public function run() {
|
|
|
|
$working_copy = $this->getWorkingCopy();
|
|
|
|
|
|
|
|
$engine = $this->getArgument('engine');
|
|
|
|
if (!$engine) {
|
Allow global config to load libraries and set test engines
Summary:
Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs.
- Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well.
- Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines.
- Add some type checking to "arc set-config".
- Add "arc set-config --show".
Test Plan:
- **load**
- Ran `arc set-config load xxx`, got error about format.
- Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it.
- Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked.
- Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries.
- Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded.
- Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library.
- Set `.arcconfig` to point at a bad library, verified hard error.
- **lint.engine** / **unit.engine**
- Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine.
- Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine.
- **--show**
- Ran `arc set-config --show`.
- **misc**
- Ran `arc get-config`.
Reviewers: csilvers, btrahan, vrana
Reviewed By: csilvers
CC: aran
Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 20:41:39 +02:00
|
|
|
$engine = $working_copy->getConfigFromAnySource('lint.engine');
|
2011-05-17 21:43:49 +02:00
|
|
|
if (!$engine) {
|
|
|
|
throw new ArcanistNoEngineException(
|
|
|
|
"No lint engine configured for this project. Edit .arcconfig to ".
|
|
|
|
"specify a lint engine.");
|
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
$rev = $this->getArgument('rev');
|
|
|
|
$paths = $this->getArgument('paths');
|
2011-01-10 00:22:25 +01:00
|
|
|
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
if ($rev && $paths) {
|
|
|
|
throw new ArcanistUsageException("Specify either --rev or paths.");
|
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
$should_lint_all = $this->getArgument('lintall');
|
|
|
|
if ($paths) {
|
|
|
|
// NOTE: When the user specifies paths, we imply --lintall and show all
|
|
|
|
// warnings for the paths in question. This is easier to deal with for
|
|
|
|
// us and less confusing for users.
|
|
|
|
$should_lint_all = true;
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
$paths = $this->selectPathsForWorkflow($paths, $rev);
|
|
|
|
|
2012-05-31 00:47:16 +02:00
|
|
|
// is_subclass_of() doesn't autoload under HPHP.
|
|
|
|
if (!class_exists($engine) ||
|
|
|
|
!is_subclass_of($engine, 'ArcanistLintEngine')) {
|
2011-12-21 17:51:34 +01:00
|
|
|
throw new ArcanistUsageException(
|
|
|
|
"Configured lint engine '{$engine}' is not a subclass of ".
|
|
|
|
"'ArcanistLintEngine'.");
|
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
|
|
|
|
$engine = newv($engine, array());
|
|
|
|
$engine->setWorkingCopy($working_copy);
|
|
|
|
|
|
|
|
if ($this->getArgument('advice')) {
|
|
|
|
$engine->setMinimumSeverity(ArcanistLintSeverity::SEVERITY_ADVICE);
|
|
|
|
} else {
|
2012-04-06 21:23:19 +02:00
|
|
|
$engine->setMinimumSeverity(ArcanistLintSeverity::SEVERITY_AUTOFIX);
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
|
2011-10-28 00:26:23 +02:00
|
|
|
// Propagate information about which lines changed to the lint engine.
|
2011-11-03 21:42:19 +01:00
|
|
|
// This is used so that the lint engine can drop warning messages
|
|
|
|
// concerning lines that weren't in the change.
|
2011-01-10 00:22:25 +01:00
|
|
|
$engine->setPaths($paths);
|
|
|
|
if (!$should_lint_all) {
|
|
|
|
foreach ($paths as $path) {
|
2011-11-03 21:42:19 +01:00
|
|
|
// Note that getChangedLines() returns null to indicate that a file
|
|
|
|
// is binary or a directory (i.e., changed lines are not relevant).
|
|
|
|
$engine->setPathChangedLines(
|
|
|
|
$path,
|
|
|
|
$this->getChangedLines($path, 'new'));
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$results = $engine->run();
|
|
|
|
|
2011-01-10 23:03:12 +01:00
|
|
|
if ($this->getArgument('never-apply-patches')) {
|
|
|
|
$apply_patches = false;
|
|
|
|
} else {
|
|
|
|
$apply_patches = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->getArgument('apply-patches')) {
|
|
|
|
$prompt_patches = false;
|
|
|
|
} else {
|
|
|
|
$prompt_patches = true;
|
|
|
|
}
|
|
|
|
|
2012-04-06 21:23:19 +02:00
|
|
|
if ($this->getArgument('amend-all')) {
|
|
|
|
$this->shouldAmendChanges = true;
|
|
|
|
$this->shouldAmendWithoutPrompt = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->getArgument('amend-autofixes')) {
|
|
|
|
$prompt_autofix_patches = false;
|
|
|
|
$this->shouldAmendChanges = true;
|
|
|
|
$this->shouldAmendAutofixesWithoutPrompt = true;
|
|
|
|
} else {
|
|
|
|
$prompt_autofix_patches = true;
|
|
|
|
}
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
$wrote_to_disk = false;
|
|
|
|
|
2011-04-04 03:04:20 +02:00
|
|
|
switch ($this->getArgument('output')) {
|
|
|
|
case 'json':
|
|
|
|
$renderer = new ArcanistLintJSONRenderer();
|
2011-12-15 19:02:29 +01:00
|
|
|
$prompt_patches = false;
|
2012-02-11 06:35:12 +01:00
|
|
|
$apply_patches = $this->getArgument('apply-patches');
|
2011-04-04 03:04:20 +02:00
|
|
|
break;
|
|
|
|
case 'summary':
|
|
|
|
$renderer = new ArcanistLintSummaryRenderer();
|
|
|
|
break;
|
2011-06-29 03:14:07 +02:00
|
|
|
case 'compiler':
|
|
|
|
$renderer = new ArcanistLintLikeCompilerRenderer();
|
|
|
|
$prompt_patches = false;
|
|
|
|
$apply_patches = $this->getArgument('apply-patches');
|
|
|
|
break;
|
2011-04-04 03:04:20 +02:00
|
|
|
default:
|
|
|
|
$renderer = new ArcanistLintRenderer();
|
2012-04-06 21:23:19 +02:00
|
|
|
$renderer->setShowAutofixPatches($prompt_autofix_patches);
|
2011-04-04 03:04:20 +02:00
|
|
|
break;
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
2011-04-04 03:04:20 +02:00
|
|
|
|
2012-04-06 21:23:19 +02:00
|
|
|
$all_autofix = true;
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
foreach ($results as $result) {
|
2012-04-06 21:23:19 +02:00
|
|
|
$result_all_autofix = $result->isAllAutofix();
|
|
|
|
|
|
|
|
if (!$result->getMessages() && !$result_all_autofix) {
|
2011-01-10 00:22:25 +01:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-04-06 21:23:19 +02:00
|
|
|
if (!$result_all_autofix) {
|
|
|
|
$all_autofix = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$lint_result = $renderer->renderLintResult($result);
|
|
|
|
if ($lint_result) {
|
|
|
|
echo $lint_result;
|
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
|
|
|
|
if ($apply_patches && $result->isPatchable()) {
|
|
|
|
$patcher = ArcanistLintPatcher::newFromArcanistLintResult($result);
|
|
|
|
$old = $patcher->getUnmodifiedFileContent();
|
|
|
|
$new = $patcher->getModifiedFileContent();
|
|
|
|
|
2012-04-06 21:23:19 +02:00
|
|
|
if ($prompt_patches &&
|
|
|
|
!($result_all_autofix && !$prompt_autofix_patches)) {
|
2011-01-10 00:22:25 +01:00
|
|
|
$old_file = $result->getFilePathOnDisk();
|
2011-01-10 05:40:13 +01:00
|
|
|
if (!Filesystem::pathExists($old_file)) {
|
|
|
|
$old_file = '/dev/null';
|
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
$new_file = new TempFile();
|
|
|
|
Filesystem::writeFile($new_file, $new);
|
|
|
|
|
|
|
|
// TODO: Improve the behavior here, make it more like
|
|
|
|
// difference_render().
|
|
|
|
passthru(csprintf("diff -u %s %s", $old_file, $new_file));
|
|
|
|
|
|
|
|
$prompt = phutil_console_format(
|
|
|
|
"Apply this patch to __%s__?",
|
|
|
|
$result->getPath());
|
|
|
|
if (!phutil_console_confirm($prompt, $default_no = false)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$patcher->writePatchToDisk();
|
|
|
|
$wrote_to_disk = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Unify arguments for 'arc lint', 'arc unit'
Summary: See T645. These commands take inconsistent and overly-magical arguments
right now. Instead, make them behave consistently and allow them both to operate
on "arc <workflow> path path2 path3 ...", which is a generally useful workflow.
Test Plan: Ran "arc lint <path>", "arc unit <path>", "arc lint --rev
HEAD^^^^^^", "arc unit --rev HEAD^^^^^^^^^^^^", etc. Ran "arc diff --trace" and
verified --rev argument to child workflows.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T645
Differential Revision: https://secure.phabricator.com/D1348
2012-01-09 21:40:50 +01:00
|
|
|
$repository_api = $this->getRepositoryAPI();
|
2011-01-30 02:18:32 +01:00
|
|
|
if ($wrote_to_disk &&
|
|
|
|
($repository_api instanceof ArcanistGitAPI) &&
|
|
|
|
$this->shouldAmendChanges) {
|
2012-04-06 21:23:19 +02:00
|
|
|
|
|
|
|
if ($this->shouldAmendWithoutPrompt ||
|
|
|
|
($this->shouldAmendAutofixesWithoutPrompt && $all_autofix)) {
|
|
|
|
echo phutil_console_format(
|
|
|
|
"<bg:yellow>** LINT NOTICE **</bg> Automatically amending HEAD ".
|
|
|
|
"with lint patches.\n");
|
|
|
|
$amend = true;
|
|
|
|
} else {
|
|
|
|
$amend = phutil_console_confirm("Amend HEAD with lint patches?");
|
|
|
|
}
|
|
|
|
|
2011-01-10 23:03:12 +01:00
|
|
|
if ($amend) {
|
|
|
|
execx(
|
|
|
|
'(cd %s; git commit -a --amend -C HEAD)',
|
|
|
|
$repository_api->getPath());
|
|
|
|
} else {
|
2011-01-30 02:18:32 +01:00
|
|
|
throw new ArcanistUsageException(
|
|
|
|
"Sort out the lint changes that were applied to the working ".
|
|
|
|
"copy and relint.");
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-12 05:21:17 +01:00
|
|
|
$unresolved = array();
|
2011-06-27 22:29:36 +02:00
|
|
|
$has_warnings = false;
|
|
|
|
$has_errors = false;
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
foreach ($results as $result) {
|
|
|
|
foreach ($result->getMessages() as $message) {
|
|
|
|
if (!$message->isPatchApplied()) {
|
|
|
|
if ($message->isError()) {
|
2011-06-27 22:29:36 +02:00
|
|
|
$has_errors = true;
|
2011-01-10 00:22:25 +01:00
|
|
|
} else if ($message->isWarning()) {
|
2011-06-27 22:29:36 +02:00
|
|
|
$has_warnings = true;
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
2011-06-27 22:29:36 +02:00
|
|
|
$unresolved[] = $message;
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-01-12 05:21:17 +01:00
|
|
|
$this->unresolvedMessages = $unresolved;
|
2011-01-10 00:22:25 +01:00
|
|
|
|
2011-06-27 22:29:36 +02:00
|
|
|
// Take the most severe lint message severity and use that
|
|
|
|
// as the result code.
|
|
|
|
if ($has_errors) {
|
|
|
|
$result_code = self::RESULT_ERRORS;
|
|
|
|
} else if ($has_warnings) {
|
|
|
|
$result_code = self::RESULT_WARNINGS;
|
|
|
|
} else {
|
|
|
|
$result_code = self::RESULT_OKAY;
|
|
|
|
}
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
if (!$this->getParentWorkflow()) {
|
|
|
|
if ($result_code == self::RESULT_OKAY) {
|
2011-12-15 19:02:29 +01:00
|
|
|
echo $renderer->renderOkayResult();
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result_code;
|
|
|
|
}
|
2011-01-12 05:21:17 +01:00
|
|
|
|
|
|
|
public function getUnresolvedMessages() {
|
|
|
|
return $this->unresolvedMessages;
|
|
|
|
}
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|