in src/workflow/ArcanistWhichWorkflow.php [75:256]
public function run() {
$console = PhutilConsole::getConsole();
if (!$this->getArgument('show-base')) {
$this->printRepositorySection();
$console->writeOut("\n");
}
$repository_api = $this->getRepositoryAPI();
$arg_commit = $this->getArgument('commit');
if (count($arg_commit)) {
$this->parseBaseCommitArgument($arg_commit);
}
$arg = $arg_commit ? ' '.head($arg_commit) : '';
$repository_api->setBaseCommitArgumentRules(
$this->getArgument('base', ''));
$supports_ranges = $repository_api->supportsCommitRanges();
$head_commit = $this->getArgument('head');
if ($head_commit !== null) {
$arg .= csprintf(' --head %R', $head_commit);
$repository_api->setHeadCommit($head_commit);
}
if ($supports_ranges) {
$relative = $repository_api->getBaseCommit();
if ($this->getArgument('show-base')) {
echo $relative."\n";
return 0;
}
$info = $repository_api->getLocalCommitInformation();
if ($info) {
$commits = array();
foreach ($info as $commit) {
$hash = substr($commit['commit'], 0, 16);
$summary = $commit['summary'];
$commits[] = " {$hash} {$summary}";
}
$commits = implode("\n", $commits);
} else {
$commits = ' '.pht('(No commits.)');
}
$explanation = $repository_api->getBaseCommitExplanation();
$relative_summary = $repository_api->getCommitSummary($relative);
$relative = substr($relative, 0, 16);
if ($repository_api instanceof ArcanistGitAPI) {
$head = $this->getArgument('head', 'HEAD');
$command = csprintf('git diff %R', "{$relative}..{$head}");
} else if ($repository_api instanceof ArcanistMercurialAPI) {
$command = csprintf(
'hg diff --rev %R',
hgsprintf('%s', $relative));
} else {
throw new Exception(pht('Unknown VCS!'));
}
echo phutil_console_wrap(
phutil_console_format(
"**%s**\n%s\n\n %s %s\n\n",
pht('COMMIT RANGE'),
pht(
"If you run '%s', changes between the commit:",
"arc diff{$arg}"),
$relative,
$relative_summary));
if ($head_commit === null) {
$will_be_sent = pht(
'...and the current working copy state will be sent to '.
'Differential, because %s',
$explanation);
} else {
$will_be_sent = pht(
'...and "%s" will be sent to Differential, because %s',
$head_commit,
$explanation);
}
echo phutil_console_wrap(
phutil_console_format(
"%s\n\n%s\n\n $ %s\n\n%s\n\n",
$will_be_sent,
pht(
'You can see the exact changes that will be sent by running '.
'this command:'),
$command,
pht('These commits will be included in the diff:')));
echo $commits."\n\n\n";
}
$any_status = $this->getArgument('any-status');
$query = array(
'status' => $any_status
? 'status-any'
: 'status-open',
);
$revisions = $repository_api->loadWorkingCopyDifferentialRevisions(
$this->getConduit(),
$query);
echo phutil_console_wrap(
phutil_console_format(
"**%s**\n%s\n\n",
pht('MATCHING REVISIONS'),
pht(
'These Differential revisions match the changes in this working '.
'copy:')));
if (empty($revisions)) {
echo " ".pht('(No revisions match.)')."\n";
echo "\n";
echo phutil_console_wrap(
phutil_console_format(
pht(
"Since there are no revisions in Differential which match this ".
"working copy, a new revision will be **created** if you run ".
"'%s'.\n\n",
"arc diff{$arg}")));
} else {
$other_author_phids = array();
foreach ($revisions as $revision) {
if ($revision['authorPHID'] != $this->getUserPHID()) {
$other_author_phids[] = $revision['authorPHID'];
}
}
$other_authors = array();
if ($other_author_phids) {
$other_authors = $this->getConduit()->callMethodSynchronous(
'user.query',
array(
'phids' => $other_author_phids,
));
$other_authors = ipull($other_authors, 'userName', 'phid');
}
foreach ($revisions as $revision) {
$title = $revision['title'];
$monogram = 'D'.$revision['id'];
if ($revision['authorPHID'] != $this->getUserPHID()) {
$author = $other_authors[$revision['authorPHID']];
echo pht(" %s (%s) %s\n", $monogram, $author, $title);
} else {
echo pht(" %s %s\n", $monogram, $title);
}
echo ' '.pht('Reason').': '.$revision['why']."\n";
echo "\n";
}
if (count($revisions) == 1) {
echo phutil_console_wrap(
phutil_console_format(
pht(
"Since exactly one revision in Differential matches this ".
"working copy, it will be **updated** if you run '%s'.",
"arc diff{$arg}")));
} else {
echo phutil_console_wrap(
pht(
"Since more than one revision in Differential matches this ".
"working copy, you will be asked which revision you want to ".
"update if you run '%s'.",
"arc diff {$arg}"));
}
echo "\n\n";
}
return 0;
}