mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-26 00:32:41 +01:00
Remove pre-commit hooks
Summary: Ref T7674. The `arc git-hook-pre-receive` and `arc svn-hook-pre-commit` workflows are being removed. Test Plan: N/A Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin, epriestley Maniphest Tasks: T7674 Differential Revision: https://secure.phabricator.com/D12690
This commit is contained in:
parent
f477682726
commit
2b6568a4b9
3 changed files with 0 additions and 364 deletions
|
@ -84,7 +84,6 @@ phutil_register_library_map(array(
|
|||
'ArcanistGeneratedLinterTestCase' => 'lint/linter/__tests__/ArcanistGeneratedLinterTestCase.php',
|
||||
'ArcanistGetConfigWorkflow' => 'workflow/ArcanistGetConfigWorkflow.php',
|
||||
'ArcanistGitAPI' => 'repository/api/ArcanistGitAPI.php',
|
||||
'ArcanistGitHookPreReceiveWorkflow' => 'workflow/ArcanistGitHookPreReceiveWorkflow.php',
|
||||
'ArcanistGoLintLinter' => 'lint/linter/ArcanistGoLintLinter.php',
|
||||
'ArcanistGoLintLinterTestCase' => 'lint/linter/__tests__/ArcanistGoLintLinterTestCase.php',
|
||||
'ArcanistGoTestResultParser' => 'unit/parser/ArcanistGoTestResultParser.php',
|
||||
|
@ -177,7 +176,6 @@ phutil_register_library_map(array(
|
|||
'ArcanistSubversionAPI' => 'repository/api/ArcanistSubversionAPI.php',
|
||||
'ArcanistSubversionHookAPI' => 'repository/hookapi/ArcanistSubversionHookAPI.php',
|
||||
'ArcanistSummaryLintRenderer' => 'lint/renderer/ArcanistSummaryLintRenderer.php',
|
||||
'ArcanistSvnHookPreCommitWorkflow' => 'workflow/ArcanistSvnHookPreCommitWorkflow.php',
|
||||
'ArcanistTasksWorkflow' => 'workflow/ArcanistTasksWorkflow.php',
|
||||
'ArcanistTestCase' => 'infrastructure/testing/ArcanistTestCase.php',
|
||||
'ArcanistTestResultParser' => 'unit/parser/ArcanistTestResultParser.php',
|
||||
|
@ -283,7 +281,6 @@ phutil_register_library_map(array(
|
|||
'ArcanistGeneratedLinterTestCase' => 'ArcanistLinterTestCase',
|
||||
'ArcanistGetConfigWorkflow' => 'ArcanistWorkflow',
|
||||
'ArcanistGitAPI' => 'ArcanistRepositoryAPI',
|
||||
'ArcanistGitHookPreReceiveWorkflow' => 'ArcanistWorkflow',
|
||||
'ArcanistGoLintLinter' => 'ArcanistExternalLinter',
|
||||
'ArcanistGoLintLinterTestCase' => 'ArcanistExternalLinterTestCase',
|
||||
'ArcanistGoTestResultParser' => 'ArcanistTestResultParser',
|
||||
|
@ -362,7 +359,6 @@ phutil_register_library_map(array(
|
|||
'ArcanistSubversionAPI' => 'ArcanistRepositoryAPI',
|
||||
'ArcanistSubversionHookAPI' => 'ArcanistHookAPI',
|
||||
'ArcanistSummaryLintRenderer' => 'ArcanistLintRenderer',
|
||||
'ArcanistSvnHookPreCommitWorkflow' => 'ArcanistWorkflow',
|
||||
'ArcanistTasksWorkflow' => 'ArcanistWorkflow',
|
||||
'ArcanistTestCase' => 'ArcanistPhutilTestCase',
|
||||
'ArcanistTestXHPASTLintSwitchHook' => 'ArcanistXHPASTLintSwitchHook',
|
||||
|
|
|
@ -1,126 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Installable as a git pre-receive hook.
|
||||
*/
|
||||
final class ArcanistGitHookPreReceiveWorkflow extends ArcanistWorkflow {
|
||||
|
||||
public function getWorkflowName() {
|
||||
return 'git-hook-pre-receive';
|
||||
}
|
||||
|
||||
public function getCommandSynopses() {
|
||||
return phutil_console_format(<<<EOTEXT
|
||||
**git-hook-pre-receive**
|
||||
EOTEXT
|
||||
);
|
||||
}
|
||||
|
||||
public function getCommandHelp() {
|
||||
return phutil_console_format(<<<EOTEXT
|
||||
Supports: git
|
||||
You can install this as a git pre-receive hook.
|
||||
EOTEXT
|
||||
);
|
||||
}
|
||||
|
||||
public function getArguments() {
|
||||
return array(
|
||||
);
|
||||
}
|
||||
|
||||
public function requiresConduit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function requiresWorkingCopy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function shouldShellComplete() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getSupportedRevisionControlSystems() {
|
||||
return array('git');
|
||||
}
|
||||
|
||||
public function run() {
|
||||
$working_copy = $this->getWorkingCopy();
|
||||
if (!$working_copy->getProjectID()) {
|
||||
throw new ArcanistUsageException(
|
||||
'You have installed a git pre-receive hook in a remote without an '.
|
||||
'.arcconfig.');
|
||||
}
|
||||
|
||||
// Git repositories have special rules in pre-receive hooks. We need to
|
||||
// construct the API against the .git directory instead of the project
|
||||
// root or commands don't work properly.
|
||||
$repository_api = ArcanistGitAPI::newHookAPI($_SERVER['PWD']);
|
||||
|
||||
$root = $working_copy->getProjectRoot();
|
||||
|
||||
$parser = new ArcanistDiffParser();
|
||||
|
||||
$mark_revisions = array();
|
||||
|
||||
$stdin = file_get_contents('php://stdin');
|
||||
$commits = array_filter(explode("\n", $stdin));
|
||||
foreach ($commits as $commit) {
|
||||
list($old_ref, $new_ref, $refname) = explode(' ', $commit);
|
||||
|
||||
list($log) = execx(
|
||||
'(cd %s && git log -n1 %s)',
|
||||
$repository_api->getPath(),
|
||||
$new_ref);
|
||||
$message_log = reset($parser->parseDiff($log));
|
||||
$message = ArcanistDifferentialCommitMessage::newFromRawCorpus(
|
||||
$message_log->getMetadata('message'));
|
||||
|
||||
$revision_id = $message->getRevisionID();
|
||||
if ($revision_id) {
|
||||
$mark_revisions[] = $revision_id;
|
||||
}
|
||||
|
||||
// TODO: Do commit message junk.
|
||||
|
||||
$info = $repository_api->getPreReceiveHookStatus($old_ref, $new_ref);
|
||||
$paths = ipull($info, 'mask');
|
||||
$frefs = ipull($info, 'ref');
|
||||
$data = array();
|
||||
foreach ($paths as $path => $mask) {
|
||||
list($stdout) = execx(
|
||||
'(cd %s && git cat-file blob %s)',
|
||||
$repository_api->getPath(),
|
||||
$frefs[$path]);
|
||||
$data[$path] = $stdout;
|
||||
}
|
||||
|
||||
// TODO: Do commit content junk.
|
||||
|
||||
$commit_name = $new_ref;
|
||||
if ($revision_id) {
|
||||
$commit_name = 'D'.$revision_id.' ('.$commit_name.')';
|
||||
}
|
||||
|
||||
echo "[arc pre-receive] {$commit_name} OK...\n";
|
||||
}
|
||||
|
||||
$conduit = $this->getConduit();
|
||||
|
||||
$futures = array();
|
||||
foreach ($mark_revisions as $revision_id) {
|
||||
$futures[] = $conduit->callMethod(
|
||||
'differential.close',
|
||||
array(
|
||||
'revisionID' => $revision_id,
|
||||
));
|
||||
}
|
||||
|
||||
id(new FutureIterator($futures))
|
||||
->resolveAll();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,234 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Installable as an SVN "pre-commit" hook.
|
||||
*/
|
||||
final class ArcanistSvnHookPreCommitWorkflow extends ArcanistWorkflow {
|
||||
|
||||
public function getWorkflowName() {
|
||||
return 'svn-hook-pre-commit';
|
||||
}
|
||||
|
||||
public function getCommandSynopses() {
|
||||
return phutil_console_format(<<<EOTEXT
|
||||
**svn-hook-pre-commit** __repository__ __transaction__
|
||||
EOTEXT
|
||||
);
|
||||
}
|
||||
|
||||
public function getCommandHelp() {
|
||||
return phutil_console_format(<<<EOTEXT
|
||||
Supports: svn
|
||||
You can install this as an SVN pre-commit hook. For more information,
|
||||
see the article "Installing Arcanist SVN Hooks" in the Arcanist
|
||||
documentation.
|
||||
EOTEXT
|
||||
);
|
||||
}
|
||||
|
||||
public function getArguments() {
|
||||
return array(
|
||||
'*' => 'svnargs',
|
||||
);
|
||||
}
|
||||
|
||||
protected function shouldShellComplete() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getSupportedRevisionControlSystems() {
|
||||
return array('svn');
|
||||
}
|
||||
|
||||
public function run() {
|
||||
$svnargs = $this->getArgument('svnargs');
|
||||
$repository = $svnargs[0];
|
||||
$transaction = $svnargs[1];
|
||||
|
||||
list($commit_message) = execx(
|
||||
'svnlook log --transaction %s %s',
|
||||
$transaction,
|
||||
$repository);
|
||||
|
||||
if (strpos($commit_message, '@bypass-lint') !== false) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// TODO: Do stuff with commit message.
|
||||
|
||||
list($changed) = execx(
|
||||
'svnlook changed --transaction %s %s',
|
||||
$transaction,
|
||||
$repository);
|
||||
|
||||
$paths = array();
|
||||
$changed = explode("\n", trim($changed));
|
||||
foreach ($changed as $line) {
|
||||
$matches = null;
|
||||
preg_match('/^..\s*(.*)$/', $line, $matches);
|
||||
$paths[$matches[1]] = strlen($matches[1]);
|
||||
}
|
||||
|
||||
$resolved = array();
|
||||
$failed = array();
|
||||
$missing = array();
|
||||
$found = array();
|
||||
asort($paths);
|
||||
|
||||
foreach ($paths as $path => $length) {
|
||||
foreach ($resolved as $rpath => $root) {
|
||||
if (!strncmp($path, $rpath, strlen($rpath))) {
|
||||
$resolved[$path] = $root;
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
$config = $path;
|
||||
|
||||
if (basename($config) == '.arcconfig') {
|
||||
$resolved[$config] = $config;
|
||||
continue;
|
||||
}
|
||||
|
||||
$config = rtrim($config, '/');
|
||||
$last_config = $config;
|
||||
do {
|
||||
if (!empty($missing[$config])) {
|
||||
break;
|
||||
} else if (!empty($found[$config])) {
|
||||
$resolved[$path] = $found[$config];
|
||||
break;
|
||||
}
|
||||
list($err) = exec_manual(
|
||||
'svnlook cat --transaction %s %s %s',
|
||||
$transaction,
|
||||
$repository,
|
||||
$config ? $config.'/.arcconfig' : '.arcconfig');
|
||||
if ($err) {
|
||||
$missing[$path] = true;
|
||||
} else {
|
||||
$resolved[$path] = $config ? $config.'/.arcconfig' : '.arcconfig';
|
||||
$found[$config] = $resolved[$path];
|
||||
break;
|
||||
}
|
||||
$config = dirname($config);
|
||||
if ($config == '.') {
|
||||
$config = '';
|
||||
}
|
||||
if ($config == $last_config) {
|
||||
break;
|
||||
}
|
||||
$last_config = $config;
|
||||
} while (true);
|
||||
|
||||
if (empty($resolved[$path])) {
|
||||
$failed[] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
if ($failed && $resolved) {
|
||||
$failed_paths = ' '.implode("\n ", $failed);
|
||||
$resolved_paths = ' '.implode("\n ", array_keys($resolved));
|
||||
throw new ArcanistUsageException(
|
||||
"This commit includes a mixture of files in Arcanist projects and ".
|
||||
"outside of Arcanist projects. A commit which affects an Arcanist ".
|
||||
"project must affect only that project.\n\n".
|
||||
"Files in projects:\n\n".
|
||||
$resolved_paths."\n\n".
|
||||
"Files not in projects:\n\n".
|
||||
$failed_paths);
|
||||
}
|
||||
|
||||
if (!$resolved) {
|
||||
// None of the affected paths are beneath a .arcconfig file.
|
||||
return 0;
|
||||
}
|
||||
|
||||
$groups = array();
|
||||
foreach ($resolved as $path => $project) {
|
||||
$groups[$project][] = $path;
|
||||
}
|
||||
if (count($groups) > 1) {
|
||||
$message = array();
|
||||
foreach ($groups as $project => $group) {
|
||||
$message[] = "Files underneath '{$project}':\n\n";
|
||||
$message[] = " ".implode("\n ", $group)."\n\n";
|
||||
}
|
||||
$message = implode('', $message);
|
||||
throw new ArcanistUsageException(
|
||||
"This commit includes a mixture of files from different Arcanist ".
|
||||
"projects. A commit which affects an Arcanist project must affect ".
|
||||
"only that project.\n\n".
|
||||
$message);
|
||||
}
|
||||
|
||||
$config_file = key($groups);
|
||||
$project_root = dirname($config_file);
|
||||
$paths = reset($groups);
|
||||
|
||||
list($config) = execx(
|
||||
'svnlook cat --transaction %s %s %s',
|
||||
$transaction,
|
||||
$repository,
|
||||
$config_file);
|
||||
|
||||
$working_copy = ArcanistWorkingCopyIdentity::newFromRootAndConfigFile(
|
||||
$project_root,
|
||||
$config,
|
||||
$config_file." (svnlook: {$transaction} {$repository})");
|
||||
|
||||
$repository_api = new ArcanistSubversionHookAPI(
|
||||
$project_root,
|
||||
$transaction,
|
||||
$repository);
|
||||
|
||||
$lint_engine = $working_copy->getProjectConfig('lint.engine');
|
||||
if (!$lint_engine) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$engine = newv($lint_engine, array());
|
||||
$engine->setWorkingCopy($working_copy);
|
||||
$engine->setConfigurationManager($this->getConfigurationManager());
|
||||
$engine->setMinimumSeverity(ArcanistLintSeverity::SEVERITY_ERROR);
|
||||
$engine->setPaths($paths);
|
||||
$engine->setCommitHookMode(true);
|
||||
$engine->setHookAPI($repository_api);
|
||||
|
||||
try {
|
||||
$results = $engine->run();
|
||||
} catch (ArcanistNoEffectException $no_effect) {
|
||||
// Nothing to do, bail out.
|
||||
return 0;
|
||||
}
|
||||
|
||||
$failures = array();
|
||||
foreach ($results as $result) {
|
||||
if (!$result->getMessages()) {
|
||||
continue;
|
||||
}
|
||||
$failures[] = $result;
|
||||
}
|
||||
|
||||
if ($failures) {
|
||||
$at = '@';
|
||||
$msg = phutil_console_format(
|
||||
"\n**LINT ERRORS**\n\n".
|
||||
"This changeset has lint errors. You must fix all lint errors before ".
|
||||
"you can commit.\n\n".
|
||||
"You can add '{$at}bypass-lint' to your commit message to disable ".
|
||||
"lint checks for this commit, or '{$at}nolint' to the file with ".
|
||||
"errors to disable lint for that file.\n\n");
|
||||
echo phutil_console_wrap($msg);
|
||||
|
||||
$renderer = new ArcanistConsoleLintRenderer();
|
||||
foreach ($failures as $result) {
|
||||
echo $renderer->renderLintResult($result);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue