diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -84,7 +84,6 @@ '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 @@ '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 @@ 'ArcanistGeneratedLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistGetConfigWorkflow' => 'ArcanistWorkflow', 'ArcanistGitAPI' => 'ArcanistRepositoryAPI', - 'ArcanistGitHookPreReceiveWorkflow' => 'ArcanistWorkflow', 'ArcanistGoLintLinter' => 'ArcanistExternalLinter', 'ArcanistGoLintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistGoTestResultParser' => 'ArcanistTestResultParser', @@ -362,7 +359,6 @@ 'ArcanistSubversionAPI' => 'ArcanistRepositoryAPI', 'ArcanistSubversionHookAPI' => 'ArcanistHookAPI', 'ArcanistSummaryLintRenderer' => 'ArcanistLintRenderer', - 'ArcanistSvnHookPreCommitWorkflow' => 'ArcanistWorkflow', 'ArcanistTasksWorkflow' => 'ArcanistWorkflow', 'ArcanistTestCase' => 'ArcanistPhutilTestCase', 'ArcanistTestXHPASTLintSwitchHook' => 'ArcanistXHPASTLintSwitchHook', diff --git a/src/workflow/ArcanistGitHookPreReceiveWorkflow.php b/src/workflow/ArcanistGitHookPreReceiveWorkflow.php deleted file mode 100644 --- a/src/workflow/ArcanistGitHookPreReceiveWorkflow.php +++ /dev/null @@ -1,126 +0,0 @@ -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; - } - -} diff --git a/src/workflow/ArcanistSvnHookPreCommitWorkflow.php b/src/workflow/ArcanistSvnHookPreCommitWorkflow.php deleted file mode 100644 --- a/src/workflow/ArcanistSvnHookPreCommitWorkflow.php +++ /dev/null @@ -1,234 +0,0 @@ - '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; - } - -}