2011-08-11 00:36:18 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
final class DifferentialBlameRevisionFieldSpecification
|
|
|
|
extends DifferentialFieldSpecification {
|
|
|
|
|
|
|
|
private $value;
|
|
|
|
|
|
|
|
public function getStorageKey() {
|
|
|
|
return 'phabricator:blame-revision';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getValueForStorage() {
|
|
|
|
return $this->value;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setValueFromStorage($value) {
|
|
|
|
$this->value = $value;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function shouldAppearOnEdit() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setValueFromRequest(AphrontRequest $request) {
|
2011-08-14 20:29:56 +02:00
|
|
|
$this->value = $request->getStr($this->getStorageKey());
|
2011-08-11 00:36:18 +02:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderEditControl() {
|
|
|
|
return id(new AphrontFormTextControl())
|
|
|
|
->setLabel('Blame Revision')
|
|
|
|
->setCaption('Revision which broke the stuff which this change fixes.')
|
2011-08-14 20:29:56 +02:00
|
|
|
->setName($this->getStorageKey())
|
2011-08-11 00:36:18 +02:00
|
|
|
->setValue($this->value);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function shouldAppearOnRevisionView() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderLabelForRevisionView() {
|
|
|
|
return 'Blame Revision:';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderValueForRevisionView() {
|
|
|
|
if (!$this->value) {
|
|
|
|
return null;
|
|
|
|
}
|
2011-12-23 00:46:50 +01:00
|
|
|
$engine = PhabricatorMarkupEngine::newDifferentialMarkupEngine();
|
|
|
|
return $engine->markupText($this->value);
|
2011-08-11 00:36:18 +02:00
|
|
|
}
|
|
|
|
|
2011-08-11 00:48:44 +02:00
|
|
|
public function shouldAppearOnConduitView() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getValueForConduit() {
|
|
|
|
return $this->value;
|
|
|
|
}
|
|
|
|
|
2011-08-15 03:52:09 +02:00
|
|
|
public function shouldAppearOnCommitMessage() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getCommitMessageKey() {
|
|
|
|
return 'blameRevision';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setValueFromParsedCommitMessage($value) {
|
|
|
|
$this->value = $value;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
Drive commit message rendering from field specifications
Summary:
When rendering commit messages, drive all the logic through field specification
classes instead of the hard-coded DifferentialCommitMessageData class. This
removes DifferentialCommitMessageData and support classes.
Note that this effectively reverts D546, and will cause a minor break for
Facebook (Task IDs will no longer render in commit messages generated by "arc
amend", and will not be editable via "arc diff --edit"). This can be resolved by
implementing the feature as a custom field. While I've been able to preserve the
task ID functionality elsewhere, I felt this implementation was too complex to
reasonably leave hooks for, and the break is pretty minor.
Test Plan:
- Made numerous calls to differential.getcommitmessage across many diffs in
various states, with and without 'edit' and with and without various field
overrides.
- General behavior seems correct (messages look accurate, and have the
expected information). Special fields like "Reviewed By" and "git-svn-id" seem
to work correctly.
- Edit behavior seems correct (edit mode shows all editable fields, hides
fields like "Reviewed By").
- Field overwrite behavior seems correct (overwritable fields show the correct
values when overwritten, ignore provided values otherwise).
Reviewed By: jungejason
Reviewers: jungejason, tuomaspelkonen, aran
CC: aran, jungejason
Differential Revision: 814
2011-08-16 06:06:58 +02:00
|
|
|
public function shouldOverwriteWhenCommitMessageIsEdited() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderLabelForCommitMessage() {
|
|
|
|
return 'Blame Revision';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderValueForCommitMessage($is_edit) {
|
|
|
|
return $this->value;
|
|
|
|
}
|
|
|
|
|
Drive Differential commit message parsing through extensible fields
Summary:
I think this is the last major step -- use the fields to parse commit messages,
not a hard-coded list of stuff. This adds two primary methods to fields, one to
get all the labels they'll parse (so we can do "CC" and "CCs" and treat them as
the same field) and one to parse the string into a canonical representation
(e.g., lookup reviewers and such).
You'll need to impelement the one block of task-specific stuff I removed in
Facebook's task field:
list($pre_comment) = split(' -- ', $data);
$data = array_filter(preg_split('/[^\d]+/', $pre_comment));
foreach ($data as $k => $v) {
$data[$k] = (int)$v;
}
$data = array_unique($data);
break;
Otherwise I think this is clean.
Test Plan:
- Called the conduit method with various commit messages, parsed fields/errors
seemed correct.
- "arc diff"'d this diff onto localhost, then updated it.
- "arc amend"'d this diff.
Reviewers: jungejason, tuomaspelkonen, aran
Reviewed By: jungejason
CC: aran, jungejason, epriestley
Differential Revision: 829
2011-08-18 21:08:18 +02:00
|
|
|
public function getSupportedCommitMessageLabels() {
|
|
|
|
return array(
|
|
|
|
'Blame Revision',
|
|
|
|
'Blame Rev',
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function parseValueFromCommitMessage($value) {
|
|
|
|
return $value;
|
|
|
|
}
|
|
|
|
|
2011-08-11 00:36:18 +02:00
|
|
|
}
|