1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-10 08:52:39 +01:00

Add an experimental "--create" flag to "arc diff"

Summary:
See T614. This adds a "--create" flag which I think works properly, but doesn't
make it the default.

Once I add "--update" and am confident the flags actually work, I'll work on
some heuristics to make "arc diff" automatically choose "--udpate" or "--create"
as per T614.

Test Plan:
This revision was created with "--create" and a bogus commit message ("derp").
I intentionally goofed the message at first to test the fail + file workflow.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran, epriestley, btrahan

Differential Revision: 1162
This commit is contained in:
epriestley 2011-12-02 15:50:36 -08:00
parent 79da3a6ff9
commit 331afdce87
2 changed files with 73 additions and 44 deletions

View file

@ -32,8 +32,8 @@ class ArcanistDiffWorkflow extends ArcanistBaseWorkflow {
public function getCommandHelp() {
return phutil_console_format(<<<EOTEXT
**diff** [__paths__] (svn)
**diff** [__commit__] (git)
Supports: git, svn
**diff** [__commit__] (git, hg)
Supports: git, svn, hg
Generate a Differential diff or revision from local changes.
Under git, you can specify a commit (like __HEAD^^^__ or __master__)
@ -82,6 +82,13 @@ EOTEXT
"When updating a revision under git, use the specified message ".
"instead of prompting.",
),
'message-file' => array(
'short' => 'F',
'param' => 'file',
'paramtype' => 'file',
'help' => 'When creating a revision, read revision information '.
'from this file.',
),
'edit' => array(
'supports' => array(
'git',
@ -93,6 +100,12 @@ EOTEXT
"When updating a revision under git, edit revision information ".
"before updating.",
),
'create' => array(
'help' => "(EXPERIMENTAL) Create a new revision.",
'conflicts' => array(
'edit' => '--create can not be used with --edit.',
),
),
'nounit' => array(
'help' =>
"Do not run unit tests.",
@ -211,6 +224,8 @@ EOTEXT
ob_start();
}
$is_create = $this->getArgument('create');
$conduit = $this->getConduit();
$this->requireCleanWorkingCopy();
@ -220,7 +235,14 @@ EOTEXT
// Do this before we start linting or running unit tests so we can detect
// things like a missing test plan or invalid reviewers immediately.
if ($this->shouldOnlyCreateDiff()) {
if ($is_create) {
$message_file = $this->getArgument('message-file');
if ($message_file) {
$commit_message = $this->getCommitMessageFromFile($message_file);
} else {
$commit_message = $this->getCommitMessageFromUser();
}
} else if ($this->shouldOnlyCreateDiff()) {
$commit_message = null;
} else {
$commit_message = $this->getGitCommitMessage();
@ -411,8 +433,6 @@ EOTEXT
$remote_corpus);
$remote_message->pullDataFromConduit($conduit);
// TODO: We should throw here if you deleted the 'testPlan'.
$sync = array('title', 'summary', 'testPlan');
foreach ($sync as $field) {
$local = $message->getFieldValue($field);
@ -460,45 +480,6 @@ EOTEXT
$new_message = ArcanistDifferentialCommitMessage::newFromRawCorpus(
$new_text);
$new_message->pullDataFromConduit($conduit);
/*
TODO: restore these checks
try { // <<< this try goes right after the edit
if (!$new_message->getTitle()) {
throw new UsageException(
"You can not remove the Revision title.");
}
if (!$new_message->getTestPlan()) {
throw new UsageException(
"You can not remove the 'Test Plan'.");
}
if ($new_message->getRevisionID() != $revision->getID()) {
throw new UsageException(
"You changed or deleted the Differential revision ID! Why ".
"would you do that?!");
}
} catch (Exception $ex) {
$ii = 0;
do {
$name = $ii
? 'differential-message-'.$ii.'.txt'
: 'differential-message.txt';
if (!file_exists($name)) {
break;
}
++$ii;
} while(true);
require_module_lazy('resource/filesystem');
Filesystem::writeFile($name, $new_text);
echo "Exception! Message was saved to '{$name}'.\n";
throw $ex;
}
*/
$revision['fields'] = $new_message->getFields();
}
@ -1253,4 +1234,51 @@ EOTEXT
return null;
}
private function getCommitMessageFromUser() {
$conduit = $this->getConduit();
$template = $conduit->callMethodSynchronous(
'differential.getcommitmessage',
array(
'revision_id' => null,
'edit' => true,
));
$template =
$template.
"\n\n".
"# Describe this revision.".
"\n";
$template = id(new PhutilInteractiveEditor($template))
->setName('new-commit')
->editInteractively();
$template = preg_replace('/^\s*#.*$/m', '', $template);
try {
$message = ArcanistDifferentialCommitMessage::newFromRawCorpus(
$template);
$message->pullDataFromConduit($conduit);
} catch (Exception $ex) {
$path = Filesystem::writeUniqueFile('arc-commit-message', $template);
echo phutil_console_wrap(
"\n".
"Exception while parsing commit message! Message saved to ".
"'{$path}'. Use -F <file> to specify a commit message file.\n");
throw $ex;
}
return $message;
}
private function getCommitMessageFromFile($file) {
$conduit = $this->getConduit();
$data = Filesystem::readFile($file);
$message = ArcanistDifferentialCommitMessage::newFromRawCorpus($data);
$message->pullDataFromConduit($conduit);
return $message;
}
}

View file

@ -19,6 +19,7 @@ phutil_require_module('arcanist', 'workflow/unit');
phutil_require_module('phutil', 'console');
phutil_require_module('phutil', 'console/editor');
phutil_require_module('phutil', 'filesystem');
phutil_require_module('phutil', 'filesystem/filelist');
phutil_require_module('phutil', 'future/exec');
phutil_require_module('phutil', 'utils');