mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-30 02:32:42 +01:00
Remove the Maniphest-specific bulk job type
Summary: Depends on D18863. Ref PHI173. Ref T13025. After D18863, this job type is no longer used: the workflow uses a genric worker instead which can apply transactions to any object. Test Plan: Grepped for callsites, found none. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13025 Differential Revision: https://secure.phabricator.com/D18864
This commit is contained in:
parent
09e71a4082
commit
a251db4618
2 changed files with 0 additions and 305 deletions
|
@ -1559,7 +1559,6 @@ phutil_register_library_map(array(
|
||||||
'ManiphestTaskDescriptionTransaction' => 'applications/maniphest/xaction/ManiphestTaskDescriptionTransaction.php',
|
'ManiphestTaskDescriptionTransaction' => 'applications/maniphest/xaction/ManiphestTaskDescriptionTransaction.php',
|
||||||
'ManiphestTaskDetailController' => 'applications/maniphest/controller/ManiphestTaskDetailController.php',
|
'ManiphestTaskDetailController' => 'applications/maniphest/controller/ManiphestTaskDetailController.php',
|
||||||
'ManiphestTaskEdgeTransaction' => 'applications/maniphest/xaction/ManiphestTaskEdgeTransaction.php',
|
'ManiphestTaskEdgeTransaction' => 'applications/maniphest/xaction/ManiphestTaskEdgeTransaction.php',
|
||||||
'ManiphestTaskEditBulkJobType' => 'applications/maniphest/bulk/ManiphestTaskEditBulkJobType.php',
|
|
||||||
'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php',
|
'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php',
|
||||||
'ManiphestTaskEditEngineLock' => 'applications/maniphest/editor/ManiphestTaskEditEngineLock.php',
|
'ManiphestTaskEditEngineLock' => 'applications/maniphest/editor/ManiphestTaskEditEngineLock.php',
|
||||||
'ManiphestTaskFerretEngine' => 'applications/maniphest/search/ManiphestTaskFerretEngine.php',
|
'ManiphestTaskFerretEngine' => 'applications/maniphest/search/ManiphestTaskFerretEngine.php',
|
||||||
|
@ -6778,7 +6777,6 @@ phutil_register_library_map(array(
|
||||||
'ManiphestTaskDescriptionTransaction' => 'ManiphestTaskTransactionType',
|
'ManiphestTaskDescriptionTransaction' => 'ManiphestTaskTransactionType',
|
||||||
'ManiphestTaskDetailController' => 'ManiphestController',
|
'ManiphestTaskDetailController' => 'ManiphestController',
|
||||||
'ManiphestTaskEdgeTransaction' => 'ManiphestTaskTransactionType',
|
'ManiphestTaskEdgeTransaction' => 'ManiphestTaskTransactionType',
|
||||||
'ManiphestTaskEditBulkJobType' => 'PhabricatorWorkerBulkJobType',
|
|
||||||
'ManiphestTaskEditController' => 'ManiphestController',
|
'ManiphestTaskEditController' => 'ManiphestController',
|
||||||
'ManiphestTaskEditEngineLock' => 'PhabricatorEditEngineLock',
|
'ManiphestTaskEditEngineLock' => 'PhabricatorEditEngineLock',
|
||||||
'ManiphestTaskFerretEngine' => 'PhabricatorFerretEngine',
|
'ManiphestTaskFerretEngine' => 'PhabricatorFerretEngine',
|
||||||
|
|
|
@ -1,303 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class ManiphestTaskEditBulkJobType
|
|
||||||
extends PhabricatorWorkerBulkJobType {
|
|
||||||
|
|
||||||
public function getBulkJobTypeKey() {
|
|
||||||
return 'maniphest.task.edit';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getJobName(PhabricatorWorkerBulkJob $job) {
|
|
||||||
return pht('Maniphest Bulk Edit');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDescriptionForConfirm(PhabricatorWorkerBulkJob $job) {
|
|
||||||
return pht(
|
|
||||||
'You are about to apply a bulk edit to Maniphest which will affect '.
|
|
||||||
'%s task(s).',
|
|
||||||
new PhutilNumber($job->getSize()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getJobSize(PhabricatorWorkerBulkJob $job) {
|
|
||||||
return count($job->getParameter('taskPHIDs', array()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getDoneURI(PhabricatorWorkerBulkJob $job) {
|
|
||||||
return $job->getParameter('doneURI');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function createTasks(PhabricatorWorkerBulkJob $job) {
|
|
||||||
$tasks = array();
|
|
||||||
|
|
||||||
foreach ($job->getParameter('taskPHIDs', array()) as $phid) {
|
|
||||||
$tasks[] = PhabricatorWorkerBulkTask::initializeNewTask($job, $phid);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tasks;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function runTask(
|
|
||||||
PhabricatorUser $actor,
|
|
||||||
PhabricatorWorkerBulkJob $job,
|
|
||||||
PhabricatorWorkerBulkTask $task) {
|
|
||||||
|
|
||||||
$object = id(new ManiphestTaskQuery())
|
|
||||||
->setViewer($actor)
|
|
||||||
->requireCapabilities(
|
|
||||||
array(
|
|
||||||
PhabricatorPolicyCapability::CAN_VIEW,
|
|
||||||
PhabricatorPolicyCapability::CAN_EDIT,
|
|
||||||
))
|
|
||||||
->withPHIDs(array($task->getObjectPHID()))
|
|
||||||
->needProjectPHIDs(true)
|
|
||||||
->needSubscriberPHIDs(true)
|
|
||||||
->executeOne();
|
|
||||||
if (!$object) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$field_list = PhabricatorCustomField::getObjectFields(
|
|
||||||
$object,
|
|
||||||
PhabricatorCustomField::ROLE_EDIT);
|
|
||||||
$field_list->readFieldsFromStorage($object);
|
|
||||||
|
|
||||||
$actions = $job->getParameter('actions');
|
|
||||||
$xactions = $this->buildTransactions($actions, $object);
|
|
||||||
|
|
||||||
$editor = id(new ManiphestTransactionEditor())
|
|
||||||
->setActor($actor)
|
|
||||||
->setContentSource($job->newContentSource())
|
|
||||||
->setContinueOnNoEffect(true)
|
|
||||||
->setContinueOnMissingFields(true)
|
|
||||||
->applyTransactions($object, $xactions);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function buildTransactions($actions, ManiphestTask $task) {
|
|
||||||
$value_map = array();
|
|
||||||
$type_map = array(
|
|
||||||
'add_comment' => PhabricatorTransactions::TYPE_COMMENT,
|
|
||||||
'assign' => ManiphestTaskOwnerTransaction::TRANSACTIONTYPE,
|
|
||||||
'status' => ManiphestTaskStatusTransaction::TRANSACTIONTYPE,
|
|
||||||
'priority' => ManiphestTaskPriorityTransaction::TRANSACTIONTYPE,
|
|
||||||
'add_project' => PhabricatorTransactions::TYPE_EDGE,
|
|
||||||
'remove_project' => PhabricatorTransactions::TYPE_EDGE,
|
|
||||||
'add_ccs' => PhabricatorTransactions::TYPE_SUBSCRIBERS,
|
|
||||||
'remove_ccs' => PhabricatorTransactions::TYPE_SUBSCRIBERS,
|
|
||||||
'space' => PhabricatorTransactions::TYPE_SPACE,
|
|
||||||
);
|
|
||||||
|
|
||||||
$edge_edit_types = array(
|
|
||||||
'add_project' => true,
|
|
||||||
'remove_project' => true,
|
|
||||||
'add_ccs' => true,
|
|
||||||
'remove_ccs' => true,
|
|
||||||
);
|
|
||||||
|
|
||||||
$xactions = array();
|
|
||||||
foreach ($actions as $action) {
|
|
||||||
if (empty($type_map[$action['action']])) {
|
|
||||||
throw new Exception(pht("Unknown batch edit action '%s'!", $action));
|
|
||||||
}
|
|
||||||
|
|
||||||
$type = $type_map[$action['action']];
|
|
||||||
|
|
||||||
// Figure out the current value, possibly after modifications by other
|
|
||||||
// batch actions of the same type. For example, if the user chooses to
|
|
||||||
// "Add Comment" twice, we should add both comments. More notably, if the
|
|
||||||
// user chooses "Remove Project..." and also "Add Project...", we should
|
|
||||||
// avoid restoring the removed project in the second transaction.
|
|
||||||
|
|
||||||
if (array_key_exists($type, $value_map)) {
|
|
||||||
$current = $value_map[$type];
|
|
||||||
} else {
|
|
||||||
switch ($type) {
|
|
||||||
case PhabricatorTransactions::TYPE_COMMENT:
|
|
||||||
$current = null;
|
|
||||||
break;
|
|
||||||
case ManiphestTaskOwnerTransaction::TRANSACTIONTYPE:
|
|
||||||
$current = $task->getOwnerPHID();
|
|
||||||
break;
|
|
||||||
case ManiphestTaskStatusTransaction::TRANSACTIONTYPE:
|
|
||||||
$current = $task->getStatus();
|
|
||||||
break;
|
|
||||||
case ManiphestTaskPriorityTransaction::TRANSACTIONTYPE:
|
|
||||||
$current = $task->getPriority();
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_EDGE:
|
|
||||||
$current = $task->getProjectPHIDs();
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_SUBSCRIBERS:
|
|
||||||
$current = $task->getSubscriberPHIDs();
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_SPACE:
|
|
||||||
$current = PhabricatorSpacesNamespaceQuery::getObjectSpacePHID(
|
|
||||||
$task);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the value is meaningful / provided, and normalize it if
|
|
||||||
// necessary. This discards, e.g., empty comments and empty owner
|
|
||||||
// changes.
|
|
||||||
|
|
||||||
$value = $action['value'];
|
|
||||||
switch ($type) {
|
|
||||||
case PhabricatorTransactions::TYPE_COMMENT:
|
|
||||||
if (!strlen($value)) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_SPACE:
|
|
||||||
if (empty($value)) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
$value = head($value);
|
|
||||||
break;
|
|
||||||
case ManiphestTaskOwnerTransaction::TRANSACTIONTYPE:
|
|
||||||
if (empty($value)) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
$value = head($value);
|
|
||||||
$no_owner = PhabricatorPeopleNoOwnerDatasource::FUNCTION_TOKEN;
|
|
||||||
if ($value === $no_owner) {
|
|
||||||
$value = null;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_EDGE:
|
|
||||||
if (empty($value)) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_SUBSCRIBERS:
|
|
||||||
if (empty($value)) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the edit doesn't change anything, go to the next action. This
|
|
||||||
// check is only valid for changes like "owner", "status", etc, not
|
|
||||||
// for edge edits, because we should still apply an edit like
|
|
||||||
// "Remove Projects: A, B" to a task with projects "A, B".
|
|
||||||
|
|
||||||
if (empty($edge_edit_types[$action['action']])) {
|
|
||||||
if ($value == $current) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply the value change; for most edits this is just replacement, but
|
|
||||||
// some need to merge the current and edited values (add/remove project).
|
|
||||||
|
|
||||||
switch ($type) {
|
|
||||||
case PhabricatorTransactions::TYPE_COMMENT:
|
|
||||||
if (strlen($current)) {
|
|
||||||
$value = $current."\n\n".$value;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_EDGE:
|
|
||||||
$is_remove = $action['action'] == 'remove_project';
|
|
||||||
|
|
||||||
$current = array_fill_keys($current, true);
|
|
||||||
$value = array_fill_keys($value, true);
|
|
||||||
|
|
||||||
$new = $current;
|
|
||||||
$did_something = false;
|
|
||||||
|
|
||||||
if ($is_remove) {
|
|
||||||
foreach ($value as $phid => $ignored) {
|
|
||||||
if (isset($new[$phid])) {
|
|
||||||
unset($new[$phid]);
|
|
||||||
$did_something = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach ($value as $phid => $ignored) {
|
|
||||||
if (empty($new[$phid])) {
|
|
||||||
$new[$phid] = true;
|
|
||||||
$did_something = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$did_something) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
$value = array_keys($new);
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_SUBSCRIBERS:
|
|
||||||
$is_remove = $action['action'] == 'remove_ccs';
|
|
||||||
|
|
||||||
$current = array_fill_keys($current, true);
|
|
||||||
|
|
||||||
$new = array();
|
|
||||||
$did_something = false;
|
|
||||||
|
|
||||||
if ($is_remove) {
|
|
||||||
foreach ($value as $phid) {
|
|
||||||
if (isset($current[$phid])) {
|
|
||||||
$new[$phid] = true;
|
|
||||||
$did_something = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($new) {
|
|
||||||
$value = array('-' => array_keys($new));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$new = array();
|
|
||||||
foreach ($value as $phid) {
|
|
||||||
$new[$phid] = true;
|
|
||||||
$did_something = true;
|
|
||||||
}
|
|
||||||
if ($new) {
|
|
||||||
$value = array('+' => array_keys($new));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$did_something) {
|
|
||||||
continue 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$value_map[$type] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
$template = new ManiphestTransaction();
|
|
||||||
|
|
||||||
foreach ($value_map as $type => $value) {
|
|
||||||
$xaction = clone $template;
|
|
||||||
$xaction->setTransactionType($type);
|
|
||||||
|
|
||||||
switch ($type) {
|
|
||||||
case PhabricatorTransactions::TYPE_COMMENT:
|
|
||||||
$xaction->attachComment(
|
|
||||||
id(new ManiphestTransactionComment())
|
|
||||||
->setContent($value));
|
|
||||||
break;
|
|
||||||
case PhabricatorTransactions::TYPE_EDGE:
|
|
||||||
$project_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
|
|
||||||
$xaction
|
|
||||||
->setMetadataValue('edge:type', $project_type)
|
|
||||||
->setNewValue(
|
|
||||||
array(
|
|
||||||
'=' => array_fuse($value),
|
|
||||||
));
|
|
||||||
break;
|
|
||||||
case ManiphestTaskPriorityTransaction::TRANSACTIONTYPE:
|
|
||||||
$keyword_map = ManiphestTaskPriority::getTaskPriorityKeywordsMap();
|
|
||||||
$keyword = head(idx($keyword_map, $value));
|
|
||||||
$xaction->setNewValue($keyword);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$xaction->setNewValue($value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$xactions[] = $xaction;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $xactions;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue