array( 'help' => "Show the amended commit message." ), 'revision' => array( 'param' => 'revision_id', 'help' => "Amend a specific revision. If you do not specify a revision, ". "arc will look in the commit message at HEAD.", ), ); } public function run() { $repository_api = $this->getRepositoryAPI(); if (!($repository_api instanceof ArcanistGitAPI)) { throw new ArcanistUsageException( "You may only run 'arc amend' in a git working copy."); } if ($repository_api->getUncommittedChanges()) { throw new ArcanistUsageException( "You have uncommitted changes in this branch. Stage and commit (or ". "revert) them before proceeding."); } if ($this->getArgument('revision')) { $revision_id = $this->getArgument('revision'); } else { $log = $repository_api->getGitCommitLog(); $parser = new ArcanistDiffParser(); $changes = $parser->parseDiff($log); if (count($changes) != 1) { throw new Exception("Expected one log."); } $change = reset($changes); if ($change->getType() != ArcanistDiffChangeType::TYPE_MESSAGE) { throw new Exception("Expected message change."); } $message = ArcanistDifferentialCommitMessage::newFromRawCorpus( $change->getMetadata('message')); $revision_id = $message->getRevisionID(); if (!$revision_id) { throw new ArcanistUsageException( "No revision specified with '--revision', and no Differential ". "revision marker in HEAD."); } } $conduit = $this->getConduit(); $message = $conduit->callMethodSynchronous( 'differential.getcommitmessage', array( 'revision_id' => $revision_id, )); if ($this->getArgument('show')) { echo $message."\n"; } else { $repository_api->amendGitHeadCommit($message); echo "Amended commit message.\n"; $working_copy = $this->getWorkingCopy(); $remote_hooks = $working_copy->getConfig('remote_hooks_installed', false); if (!$remote_hooks) { echo "According to .arcconfig, remote commit hooks are not installed ". "for this project, so the revision will be marked committed now. ". "Consult the documentation for instructions on installing hooks.". "\n\n"; $mark_workflow = $this->buildChildWorkflow( 'mark-committed', array($revision_id)); $mark_workflow->run(); } } return 0; } protected function getSupportedRevisionControlSystems() { return array('git'); } }