diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index e73163dd4f..a6e06216fd 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -254,6 +254,7 @@ phutil_register_library_map(array( 'DifferentialFieldSpecification' => 'applications/differential/field/specification/DifferentialFieldSpecification.php', 'DifferentialFieldSpecificationIncompleteException' => 'applications/differential/field/exception/DifferentialFieldSpecificationIncompleteException.php', 'DifferentialFieldValidationException' => 'applications/differential/field/exception/DifferentialFieldValidationException.php', + 'DifferentialFreeformFieldSpecification' => 'applications/differential/field/specification/DifferentialFreeformFieldSpecification.php', 'DifferentialGitSVNIDFieldSpecification' => 'applications/differential/field/specification/DifferentialGitSVNIDFieldSpecification.php', 'DifferentialHostFieldSpecification' => 'applications/differential/field/specification/DifferentialHostFieldSpecification.php', 'DifferentialHunk' => 'applications/differential/storage/DifferentialHunk.php', @@ -1435,6 +1436,7 @@ phutil_register_library_map(array( 'DifferentialFieldParseException' => 'Exception', 'DifferentialFieldSpecificationIncompleteException' => 'Exception', 'DifferentialFieldValidationException' => 'Exception', + 'DifferentialFreeformFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialGitSVNIDFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialHostFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialHunk' => 'DifferentialDAO', @@ -1477,9 +1479,9 @@ phutil_register_library_map(array( 'DifferentialRevisionUpdateHistoryView' => 'AphrontView', 'DifferentialRevisionViewController' => 'DifferentialController', 'DifferentialSubscribeController' => 'DifferentialController', - 'DifferentialSummaryFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialSummaryFieldSpecification' => 'DifferentialFreeformFieldSpecification', 'DifferentialTestPlanFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialTitleFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialTitleFieldSpecification' => 'DifferentialFreeformFieldSpecification', 'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification', 'DiffusionBranchTableController' => 'DiffusionController', 'DiffusionBranchTableView' => 'DiffusionView', diff --git a/src/applications/differential/field/specification/DifferentialFreeformFieldSpecification.php b/src/applications/differential/field/specification/DifferentialFreeformFieldSpecification.php new file mode 100644 index 0000000000..44e4b166d9 --- /dev/null +++ b/src/applications/differential/field/specification/DifferentialFreeformFieldSpecification.php @@ -0,0 +1,138 @@ +loadOneWhere( + 'phid = %s', + $data->getCommitDetail('authorPHID')); + if (!$user) { + return; + } + + $prefixes = array( + 'resolves' => ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, + 'fixes' => ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, + 'wontfix' => ManiphestTaskStatus::STATUS_CLOSED_WONTFIX, + 'wontfixes' => ManiphestTaskStatus::STATUS_CLOSED_WONTFIX, + 'spite' => ManiphestTaskStatus::STATUS_CLOSED_SPITE, + 'spites' => ManiphestTaskStatus::STATUS_CLOSED_SPITE, + 'invalidate' => ManiphestTaskStatus::STATUS_CLOSED_INVALID, + 'invaldiates' => ManiphestTaskStatus::STATUS_CLOSED_INVALID, + 'close' => ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, + 'closes' => ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, + 'ref' => null, + 'refs' => null, + 'references' => null, + 'cf.' => null, + ); + + $suffixes = array( + 'as resolved' => ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, + 'as fixed' => ManiphestTaskStatus::STATUS_CLOSED_RESOLVED, + 'as wontfix' => ManiphestTaskStatus::STATUS_CLOSED_WONTFIX, + 'as spite' => ManiphestTaskStatus::STATUS_CLOSED_SPITE, + 'out of spite' => ManiphestTaskStatus::STATUS_CLOSED_SPITE, + 'as invalid' => ManiphestTaskStatus::STATUS_CLOSED_INVALID, + '' => null, + ); + + $prefix_regex = array(); + foreach ($prefixes as $prefix => $resolution) { + $prefix_regex[] = preg_quote($prefix, '/'); + } + $prefix_regex = implode('|', $prefix_regex); + + $suffix_regex = array(); + foreach ($suffixes as $suffix => $resolution) { + $suffix_regex[] = preg_quote($suffix, '/'); + } + $suffix_regex = implode('|', $suffix_regex); + + $matches = null; + $ok = preg_match_all( + "/({$prefix_regex})\s+T(\d+)\s+({$suffix_regex})/i", + $this->renderValueForCommitMessage($is_edit = false), + $matches, + PREG_SET_ORDER); + + if (!$ok) { + return; + } + + foreach ($matches as $set) { + $prefix = strtolower($set[1]); + $task_id = (int)$set[2]; + $suffix = strtolower($set[3]); + + $status = idx($suffixes, $suffix); + if (!$status) { + $status = idx($prefixes, $prefix); + } + + $tasks = id(new ManiphestTaskQuery()) + ->withTaskIDs(array($task_id)) + ->execute(); + $task = idx($tasks, $task_id); + + if (!$task) { + // Task doesn't exist, or the user can't see it. + continue; + } + + id(new PhabricatorEdgeEditor()) + ->setUser($user) + ->addEdge( + $task->getPHID(), + PhabricatorEdgeConfig::TYPE_TASK_HAS_COMMIT, + $commit->getPHID()) + ->save(); + + if (!$status) { + // Text like "Ref T123", don't change the task status. + continue; + } + + if ($task->getStatus() != ManiphestTaskStatus::STATUS_OPEN) { + // Task is already closed. + continue; + } + + $commit_name = $repository->formatCommitName( + $commit->getCommitIdentifier()); + + $call = new ConduitCall( + 'maniphest.update', + array( + 'id' => $task->getID(), + 'status' => $status, + 'comments' => "Closed by commit {$commit_name}.", + )); + + $call->setUser($user); + $call->execute(); + } + } + +} diff --git a/src/applications/differential/field/specification/DifferentialSummaryFieldSpecification.php b/src/applications/differential/field/specification/DifferentialSummaryFieldSpecification.php index 6c4ddb4687..fb56aa301f 100644 --- a/src/applications/differential/field/specification/DifferentialSummaryFieldSpecification.php +++ b/src/applications/differential/field/specification/DifferentialSummaryFieldSpecification.php @@ -17,7 +17,7 @@ */ final class DifferentialSummaryFieldSpecification - extends DifferentialFieldSpecification { + extends DifferentialFreeformFieldSpecification { private $summary = ''; diff --git a/src/applications/differential/field/specification/DifferentialTitleFieldSpecification.php b/src/applications/differential/field/specification/DifferentialTitleFieldSpecification.php index 81883a45c5..2fb4567679 100644 --- a/src/applications/differential/field/specification/DifferentialTitleFieldSpecification.php +++ b/src/applications/differential/field/specification/DifferentialTitleFieldSpecification.php @@ -17,7 +17,7 @@ */ final class DifferentialTitleFieldSpecification - extends DifferentialFieldSpecification { + extends DifferentialFreeformFieldSpecification { private $title; private $error = true;