1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-18 21:02:41 +01:00

Tasks can be defined in the commit message (Phabricator part).

Summary:
Phabricator did not support giving the task ids in the commit message.
Currently there is no default implementation for this, but there is a
Facebook specific implementation. At some point default implementation
for Maniphest tasks to revisions will be added.

Test Plan:
Tested with the Facebook specific implementation that task ids are
recognized in the commit message and tasks are automatically attached
to revisions.

The task attached to this revision was added from the commit message.

Reviewed By: jungejason
Reviewers: jungejason, epriestley
CC: dpepper, edward, gpatangay, tuomaspelkonen, jungejason
Differential Revision: 240996
This commit is contained in:
tuomaspelkonen 2011-04-21 17:53:18 -07:00
parent 74777227a3
commit 9367c41a28
8 changed files with 85 additions and 1 deletions

View file

@ -156,6 +156,7 @@ phutil_register_library_map(array(
'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/revisionupdatehistory', 'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/revisionupdatehistory',
'DifferentialRevisionViewController' => 'applications/differential/controller/revisionview', 'DifferentialRevisionViewController' => 'applications/differential/controller/revisionview',
'DifferentialSubscribeController' => 'applications/differential/controller/subscribe', 'DifferentialSubscribeController' => 'applications/differential/controller/subscribe',
'DifferentialTasksAttacher' => 'applications/differential/tasks',
'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus', 'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus',
'DiffusionBranchInformation' => 'applications/diffusion/data/branch', 'DiffusionBranchInformation' => 'applications/diffusion/data/branch',
'DiffusionBranchQuery' => 'applications/diffusion/query/branch/base', 'DiffusionBranchQuery' => 'applications/diffusion/query/branch/base',

View file

@ -66,6 +66,7 @@ class ConduitAPI_differential_getcommitmessage_Method extends ConduitAPIMethod {
'testPlan' => 'Test Plan', 'testPlan' => 'Test Plan',
'blameRevision' => 'Blame Revision', 'blameRevision' => 'Blame Revision',
'revertPlan' => 'Revert Plan', 'revertPlan' => 'Revert Plan',
'tasks' => 'Tasks',
); );
foreach ($fields as $field => $value) { foreach ($fields as $field => $value) {

View file

@ -62,6 +62,7 @@ class ConduitAPI_differential_parsecommitmessage_Method
'ccPHIDs' => $message->getCCPHIDs(), 'ccPHIDs' => $message->getCCPHIDs(),
'revisionID' => $message->getRevisionID(), 'revisionID' => $message->getRevisionID(),
'gitSVNID' => $message->getGitSVNID(), 'gitSVNID' => $message->getGitSVNID(),
'tasks' => $message->getTasks(),
), ),
); );
} }

View file

@ -31,6 +31,7 @@ class DifferentialRevisionEditor {
protected $diff; protected $diff;
protected $comments; protected $comments;
protected $silentUpdate; protected $silentUpdate;
protected $tasks = null;
public function __construct(DifferentialRevision $revision, $actor_phid) { public function __construct(DifferentialRevision $revision, $actor_phid) {
$this->revision = $revision; $this->revision = $revision;
@ -55,6 +56,11 @@ class DifferentialRevisionEditor {
$editor->addDiff($diff, null); $editor->addDiff($diff, null);
$editor->save(); $editor->save();
// Tasks can only be updated after revision has been saved to the
// database. Currently tasks are updated only when a revision is created.
// UI must be used to modify tasks after creating one.
$editor->updateTasks();
return $revision; return $revision;
} }
@ -70,6 +76,7 @@ class DifferentialRevisionEditor {
$this->setReviewers($fields['reviewerPHIDs']); $this->setReviewers($fields['reviewerPHIDs']);
$this->setCCPHIDs($fields['ccPHIDs']); $this->setCCPHIDs($fields['ccPHIDs']);
$this->setTasks($fields['tasks']);
} }
public function getRevision() { public function getRevision() {
@ -86,6 +93,10 @@ class DifferentialRevisionEditor {
return $this; return $this;
} }
public function setTasks(array $tasks) {
$this->tasks = $tasks;
}
public function addDiff(DifferentialDiff $diff, $comments) { public function addDiff(DifferentialDiff $diff, $comments) {
if ($diff->getRevisionID() && if ($diff->getRevisionID() &&
$diff->getRevisionID() != $this->getRevision()->getID()) { $diff->getRevisionID() != $this->getRevision()->getID()) {
@ -555,5 +566,20 @@ class DifferentialRevisionEditor {
return $comment; return $comment;
} }
private function updateTasks() {
if ($this->tasks) {
$task_class = PhabricatorEnv::getEnvConfig(
'differential.attach-task-class');
if ($task_class) {
PhutilSymbolLoader::loadClass($task_class);
$task_attacher = newv($task_class, array());
$ret = $task_attacher->attachTasksToRevision(
$this->actorPHID,
$this->revision,
$this->tasks);
}
}
}
} }

View file

@ -19,6 +19,7 @@ phutil_require_module('phabricator', 'infrastructure/env');
phutil_require_module('phabricator', 'storage/qsprintf'); phutil_require_module('phabricator', 'storage/qsprintf');
phutil_require_module('phabricator', 'storage/queryfx'); phutil_require_module('phabricator', 'storage/queryfx');
phutil_require_module('phutil', 'symbols');
phutil_require_module('phutil', 'utils'); phutil_require_module('phutil', 'utils');

View file

@ -39,6 +39,8 @@ class DifferentialCommitMessage {
protected $revisionID; protected $revisionID;
protected $gitSVNID; protected $gitSVNID;
protected $tasks = array();
protected function __construct() { protected function __construct() {
} }
@ -160,6 +162,14 @@ class DifferentialCommitMessage {
return $this; return $this;
} }
public function setTasks(array $tasks) {
$this->tasks = $tasks;
return $this;
}
public function getTasks() {
return $this->tasks;
}
public static function newFromRawCorpus($raw_corpus) { public static function newFromRawCorpus($raw_corpus) {
$message = new DifferentialCommitMessage(); $message = new DifferentialCommitMessage();
@ -202,6 +212,9 @@ class DifferentialCommitMessage {
case 'Commenters': case 'Commenters':
// Just drop this. // Just drop this.
break; break;
case 'Tasks':
$message->setTasks($data);
break;
default: default:
throw new Exception("Unrecognized field '{$field}'."); throw new Exception("Unrecognized field '{$field}'.");
} }
@ -298,7 +311,9 @@ class DifferentialCommitMessage {
'CC' => 'CC', 'CC' => 'CC',
'Revert' => 'Revert Plan', 'Revert' => 'Revert Plan',
'Revert Plan' => 'Revert Plan', 'Revert Plan' => 'Revert Plan',
'Task ID' => 'Tasks',
'Task IDs' => 'Tasks',
'Tasks' => 'Tasks',
'git-svn-id' => 'git-svn-id', 'git-svn-id' => 'git-svn-id',
// This appears only in "arc amend"-ed messages, just discard it. // This appears only in "arc amend"-ed messages, just discard it.

View file

@ -0,0 +1,29 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* 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.
*/
abstract class DifferentialTasksAttacher {
/**
* Implementation of this function should attach given tasks to
* the given revision. The function is called when 'arc' has task
* ids defined in the commit message.
*/
abstract public function attachTasksToRevision(
$user_phid,
DifferentialRevision $revision,
array $task_ids);
}

View file

@ -0,0 +1,10 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_source('DifferentialTasksAttacher.php');