mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-26 08:42:40 +01:00
Merge branch 'master' of github.com:facebook/arcanist into arc_excuse
This commit is contained in:
commit
1722e2999b
2 changed files with 84 additions and 15 deletions
|
@ -50,7 +50,7 @@ foreach ($args as $key => $arg) {
|
||||||
PhutilConsoleFormatter::disableANSI(true);
|
PhutilConsoleFormatter::disableANSI(true);
|
||||||
} else if (preg_match('/^--load-phutil-library=(.*)$/', $arg, $matches)) {
|
} else if (preg_match('/^--load-phutil-library=(.*)$/', $arg, $matches)) {
|
||||||
unset($args[$key]);
|
unset($args[$key]);
|
||||||
$load['?'] = $matches[1];
|
$load[] = $matches[1];
|
||||||
} else if (preg_match('/^--conduit-uri=(.*)$/', $arg, $matches)) {
|
} else if (preg_match('/^--conduit-uri=(.*)$/', $arg, $matches)) {
|
||||||
unset($args[$key]);
|
unset($args[$key]);
|
||||||
$force_conduit = $matches[1];
|
$force_conduit = $matches[1];
|
||||||
|
|
|
@ -34,6 +34,7 @@ final class ArcanistDiffWorkflow extends ArcanistBaseWorkflow {
|
||||||
private $unitExcuse;
|
private $unitExcuse;
|
||||||
private $testResults;
|
private $testResults;
|
||||||
private $diffID;
|
private $diffID;
|
||||||
|
private $revisionID;
|
||||||
private $unitWorkflow;
|
private $unitWorkflow;
|
||||||
|
|
||||||
public function getCommandHelp() {
|
public function getCommandHelp() {
|
||||||
|
@ -416,9 +417,11 @@ EOTEXT
|
||||||
$revision['fields'] = $new_message->getFields();
|
$revision['fields'] = $new_message->getFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$revision['id'] = $message->getRevisionID();
|
||||||
|
$this->revisionID = $revision['id'];
|
||||||
|
|
||||||
$update_message = $this->getUpdateMessage();
|
$update_message = $this->getUpdateMessage();
|
||||||
|
|
||||||
$revision['id'] = $message->getRevisionID();
|
|
||||||
$revision['message'] = $update_message;
|
$revision['message'] = $update_message;
|
||||||
$future = $conduit->callMethod(
|
$future = $conduit->callMethod(
|
||||||
'differential.updaterevision',
|
'differential.updaterevision',
|
||||||
|
@ -1438,16 +1441,13 @@ EOTEXT
|
||||||
// $ git commit -a -m 'fix some junk'
|
// $ git commit -a -m 'fix some junk'
|
||||||
// $ arc diff
|
// $ arc diff
|
||||||
//
|
//
|
||||||
// ...you shouldn't have to retype the update message.
|
// ...you shouldn't have to retype the update message. Similar things apply
|
||||||
if ($this->requiresRepositoryAPI()) {
|
// to Mercurial.
|
||||||
$repository_api = $this->getRepositoryAPI();
|
|
||||||
if ($repository_api instanceof ArcanistGitAPI) {
|
$comments = $this->getDefaultUpdateMessage();
|
||||||
$comments = $this->getGitUpdateMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$template =
|
$template =
|
||||||
$comments.
|
rtrim($comments).
|
||||||
"\n\n".
|
"\n\n".
|
||||||
"# Enter a brief description of the changes included in this update.".
|
"# Enter a brief description of the changes included in this update.".
|
||||||
"\n";
|
"\n";
|
||||||
|
@ -1580,6 +1580,18 @@ EOTEXT
|
||||||
return $blessed;
|
return $blessed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getDefaultUpdateMessage() {
|
||||||
|
if (!$this->requiresRepositoryAPI()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$repository_api = $this->getRepositoryAPI();
|
||||||
|
if ($repository_api instanceof ArcanistGitAPI) {
|
||||||
|
return $this->getGitUpdateMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the git message in HEAD if it isn't a primary template message.
|
* Retrieve the git message in HEAD if it isn't a primary template message.
|
||||||
|
@ -1593,14 +1605,71 @@ EOTEXT
|
||||||
$commit_messages = $repository_api->getGitCommitLog();
|
$commit_messages = $repository_api->getGitCommitLog();
|
||||||
$commit_messages = $parser->parseDiff($commit_messages);
|
$commit_messages = $parser->parseDiff($commit_messages);
|
||||||
|
|
||||||
$head = reset($commit_messages);
|
if (count($commit_messages) == 1) {
|
||||||
$message = ArcanistDifferentialCommitMessage::newFromRawCorpus(
|
// If there's only one message, assume this is an amend-based workflow and
|
||||||
$head->getMetadata('message'));
|
// that using it to prefill doesn't make sense.
|
||||||
if ($message->getRevisionID()) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return trim($message->getRawCorpus());
|
// We have more than one message, so figure out which ones are new. We
|
||||||
|
// do this by pulling the current diff and comparing commit hashes in the
|
||||||
|
// working copy with attached commit hashes. It's not super important that
|
||||||
|
// we always get this 100% right, we're just trying to do something
|
||||||
|
// reasonable.
|
||||||
|
|
||||||
|
$current_diff = $this->getConduit()->callMethodSynchronous(
|
||||||
|
'differential.getdiff',
|
||||||
|
array(
|
||||||
|
'revision_id' => $this->revisionID,
|
||||||
|
));
|
||||||
|
|
||||||
|
$properties = idx($current_diff, 'properties', array());
|
||||||
|
$local = idx($properties, 'local:commits', array());
|
||||||
|
$hashes = ipull($local, null, 'commit');
|
||||||
|
|
||||||
|
$usable = array();
|
||||||
|
foreach ($commit_messages as $message) {
|
||||||
|
$text = $message->getMetadata('message');
|
||||||
|
|
||||||
|
$parsed = ArcanistDifferentialCommitMessage::newFromRawCorpus($text);
|
||||||
|
if ($parsed->getRevisionID()) {
|
||||||
|
// If this is an amended commit message with a revision ID, it's
|
||||||
|
// certainly not new. Stop marking commits as usable and break out.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($hashes[$message->getCommitHash()])) {
|
||||||
|
// If this commit is currently part of the diff, stop using commit
|
||||||
|
// messages, since anything older than this isn't new.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, this looks new, so it's a usable commit message.
|
||||||
|
$usable[] = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$usable) {
|
||||||
|
// No new commit messages, so we don't have anywhere to start from.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flip messages so they'll read chronologically (oldest-first) in the
|
||||||
|
// template, e.g.:
|
||||||
|
//
|
||||||
|
// - Added foobar.
|
||||||
|
// - Fixed foobar bug.
|
||||||
|
// - Documented foobar.
|
||||||
|
|
||||||
|
$usable = array_reverse($usable);
|
||||||
|
$default = array();
|
||||||
|
foreach ($usable as $message) {
|
||||||
|
// Pick the first line out of each message.
|
||||||
|
$text = trim($message->getMetadata('message'));
|
||||||
|
$text = head(explode("\n", $text));
|
||||||
|
$default[] = ' - '.$text."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode('', $default);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue