2011-08-14 23:28:08 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
2012-02-20 14:38:21 +01:00
|
|
|
* Copyright 2012 Facebook, Inc.
|
2011-08-14 23:28:08 +02:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
final class DifferentialTitleFieldSpecification
|
|
|
|
extends DifferentialFieldSpecification {
|
|
|
|
|
|
|
|
private $title;
|
|
|
|
private $error = true;
|
|
|
|
|
|
|
|
public function shouldAppearOnEdit() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
protected function didSetRevision() {
|
|
|
|
$this->title = $this->getRevision()->getTitle();
|
|
|
|
}
|
|
|
|
|
2011-08-14 23:28:08 +02:00
|
|
|
public function setValueFromRequest(AphrontRequest $request) {
|
|
|
|
$this->title = $request->getStr('title');
|
|
|
|
$this->error = null;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderEditControl() {
|
|
|
|
return id(new AphrontFormTextAreaControl())
|
|
|
|
->setLabel('Title')
|
|
|
|
->setName('title')
|
|
|
|
->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_SHORT)
|
|
|
|
->setError($this->error)
|
|
|
|
->setValue($this->title);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function willWriteRevision(DifferentialRevisionEditor $editor) {
|
|
|
|
$this->getRevision()->setTitle($this->title);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function validateField() {
|
|
|
|
if (!strlen($this->title)) {
|
|
|
|
$this->error = 'Required';
|
|
|
|
throw new DifferentialFieldValidationException(
|
|
|
|
"You must provide a title.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-15 03:52:09 +02:00
|
|
|
public function shouldAppearOnCommitMessage() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getCommitMessageKey() {
|
|
|
|
return 'title';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setValueFromParsedCommitMessage($value) {
|
|
|
|
$this->title = $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 'Title';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderValueForCommitMessage($is_edit) {
|
|
|
|
return $this->title;
|
|
|
|
}
|
|
|
|
|
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 parseValueFromCommitMessage($value) {
|
|
|
|
return preg_replace('/\s*\n\s*/', ' ', $value);
|
|
|
|
}
|
|
|
|
|
2012-02-20 14:38:21 +01:00
|
|
|
public function shouldAppearOnRevisionList() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderHeaderForRevisionList() {
|
|
|
|
return 'Revision';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getColumnClassForRevisionList() {
|
|
|
|
return 'wide pri';
|
|
|
|
}
|
|
|
|
|
|
|
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
|
|
|
return phutil_render_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => '/D'.$revision->getID(),
|
|
|
|
),
|
|
|
|
phutil_escape_html($revision->getTitle()));
|
|
|
|
}
|
|
|
|
|
2011-08-14 23:28:08 +02:00
|
|
|
}
|