diff --git a/src/deepclone/controller/DeepcloneController.php b/src/deepclone/controller/DeepcloneController.php --- a/src/deepclone/controller/DeepcloneController.php +++ b/src/deepclone/controller/DeepcloneController.php @@ -12,9 +12,11 @@ return new Aphront404Response(); } - $task = id(new ManiphestTaskQuery()) + $query = new ManiphestTaskQuery(); + $task = $query ->setViewer($viewer) ->withPHIDs(array($task_id)) + ->withOpenSubtasks(true) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, @@ -29,8 +31,14 @@ return new Aphront404Response(); } + $transactions = id(new ManiphestTransactionQuery()) + ->setViewer($request->getUser()) + ->withObjectPHIDs(mpull([$task], 'getPHID')) + ->needComments(true) + ->execute(); + if ($request->isFormPost()) { - return $this->triggerTransaction($request, $task); + return $this->triggerTransaction($request, $task, $transactions); // $properties = $provider->readFormValuesFromRequest($request); // list($errors, $issues, $properties) = $provider->processEditForm( // $request, @@ -178,12 +186,51 @@ return $handle; } - private function triggerTransaction(AphrontRequest $request, ManiphestTask $task) { + private function triggerTransaction(AphrontRequest $request, ManiphestTask $task, array $transactions) { $deepCloneRaw = $request->getStr('deep_clone'); $deepClone = $deepCloneRaw === '1'; $copyCommentsRaw = $request->getStr('copy_comments'); $copyComments = $copyCommentsRaw === '1'; - throw new Exception("Deep Clone $deepClone $deepCloneRaw Copy Comments $copyComments $copyCommentsRaw"); + $taskClone = new ManiphestTask(); + + $taskClone->setTitle($task->getTitle()); + $taskClone->setDescription($task->getDescription()); + $taskClone->setAuthorPHID($task->getAuthorPHID()); + $taskClone->setOwnerPHID($task->getOwnerPHID()); + $taskClone->setStatus($task->getStatus()); + $taskClone->setPriority($task->getPriority()); + $taskClone->setSubtype($task->getSubtype()); + $taskClone->setViewPolicy($task->getViewPolicy()); + $taskClone->setEditPolicy($task->getEditPolicy()); + + $taskClone->save(); + + foreach($transactions as &$transaction) { + if ($transaction->getTransactionType() !== 'core:comment') { + continue; + } + + if ($copyComments === false) { + continue; + } + + $transactionClone = new ManiphestTransaction(); + $transactionClone->setViewPolicy($transaction->getViewPolicy()); + $transactionClone->setEditPolicy($transaction->getEditPolicy()); + $transactionClone->setTransactionType('core:comment'); + $transactionClone->setObjectPHID($taskClone->getPHID()); + $transactionClone->setAuthorPHID($transaction->getAuthorPHID()); + $transactionClone->setContentSource($transaction->getContentSource()); + $comment = $transaction->getComment()->getContent(); + $transactionClone->attachComment( + id(new ManiphestTransactionComment()) + ->setContent([$comment]) + ); + + $transactionClone->save(); + } + + return id(new AphrontRedirectResponse())->setURI($taskClone->getURI()); } }