diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -4382,6 +4382,9 @@ 'PhabricatorProjectSubprojectsProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectSubprojectsProfileMenuItem.php', 'PhabricatorProjectSubtypeDatasource' => 'applications/project/typeahead/PhabricatorProjectSubtypeDatasource.php', 'PhabricatorProjectSubtypesConfigType' => 'applications/project/config/PhabricatorProjectSubtypesConfigType.php', + 'PhabricatorProjectTagsAddedField' => 'applications/project/herald/PhabricatorProjectTagsAddedField.php', + 'PhabricatorProjectTagsField' => 'applications/project/herald/PhabricatorProjectTagsField.php', + 'PhabricatorProjectTagsRemovedField' => 'applications/project/herald/PhabricatorProjectTagsRemovedField.php', 'PhabricatorProjectTestDataGenerator' => 'applications/project/lipsum/PhabricatorProjectTestDataGenerator.php', 'PhabricatorProjectTransaction' => 'applications/project/storage/PhabricatorProjectTransaction.php', 'PhabricatorProjectTransactionEditor' => 'applications/project/editor/PhabricatorProjectTransactionEditor.php', @@ -7679,7 +7682,7 @@ 'HeraldPreCommitContentAdapter' => 'HeraldPreCommitAdapter', 'HeraldPreCommitRefAdapter' => 'HeraldPreCommitAdapter', 'HeraldPreventActionGroup' => 'HeraldActionGroup', - 'HeraldProjectsField' => 'HeraldField', + 'HeraldProjectsField' => 'PhabricatorProjectTagsField', 'HeraldRecursiveConditionsException' => 'Exception', 'HeraldRelatedFieldGroup' => 'HeraldFieldGroup', 'HeraldRemarkupFieldValue' => 'HeraldFieldValue', @@ -10943,6 +10946,9 @@ 'PhabricatorProjectSubprojectsProfileMenuItem' => 'PhabricatorProfileMenuItem', 'PhabricatorProjectSubtypeDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorProjectSubtypesConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorProjectTagsAddedField' => 'PhabricatorProjectTagsField', + 'PhabricatorProjectTagsField' => 'HeraldField', + 'PhabricatorProjectTagsRemovedField' => 'PhabricatorProjectTagsField', 'PhabricatorProjectTestDataGenerator' => 'PhabricatorTestDataGenerator', 'PhabricatorProjectTransaction' => 'PhabricatorModularTransaction', 'PhabricatorProjectTransactionEditor' => 'PhabricatorApplicationTransactionEditor', diff --git a/src/applications/herald/field/HeraldField.php b/src/applications/herald/field/HeraldField.php --- a/src/applications/herald/field/HeraldField.php +++ b/src/applications/herald/field/HeraldField.php @@ -241,6 +241,51 @@ return false; } + final protected function getAppliedTransactionsOfTypes(array $types) { + $types = array_fuse($types); + $xactions = $this->getAdapter()->getAppliedTransactions(); + + $result = array(); + foreach ($xactions as $key => $xaction) { + $xaction_type = $xaction->getTransactionType(); + if (isset($types[$xaction_type])) { + $result[$key] = $xaction; + } + } + + return $result; + } + + final protected function getAppliedEdgeTransactionOfType($edge_type) { + $edge_xactions = $this->getAppliedTransactionsOfTypes( + array( + PhabricatorTransactions::TYPE_EDGE, + )); + + $results = array(); + foreach ($edge_xactions as $edge_xaction) { + $xaction_edge_type = $edge_xaction->getMetadataValue('edge:type'); + if ($xaction_edge_type == $edge_type) { + $results[] = $edge_xaction; + } + } + + if (count($results) > 1) { + throw new Exception( + pht( + 'Found more than one ("%s") applied edge transactions with given '. + 'edge type ("%s"); expected zero or one.', + phutil_count($results), + $edge_type)); + } + + if ($results) { + return head($results); + } + + return null; + } + public function isFieldAvailable() { return true; } diff --git a/src/applications/project/herald/HeraldProjectsField.php b/src/applications/project/herald/HeraldProjectsField.php --- a/src/applications/project/herald/HeraldProjectsField.php +++ b/src/applications/project/herald/HeraldProjectsField.php @@ -1,6 +1,7 @@ getPHID(), PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); } - protected function getHeraldFieldStandardType() { - return self::STANDARD_PHID_LIST; - } - - protected function getDatasource() { - return new PhabricatorProjectDatasource(); - } - } diff --git a/src/applications/project/herald/PhabricatorProjectTagsAddedField.php b/src/applications/project/herald/PhabricatorProjectTagsAddedField.php new file mode 100644 --- /dev/null +++ b/src/applications/project/herald/PhabricatorProjectTagsAddedField.php @@ -0,0 +1,23 @@ +getProjectTagsTransaction(); + if (!$xaction) { + return array(); + } + + $record = PhabricatorEdgeChangeRecord::newFromTransaction($xaction); + + return $record->getAddedPHIDs(); + } + +} diff --git a/src/applications/project/herald/HeraldProjectsField.php b/src/applications/project/herald/PhabricatorProjectTagsField.php copy from src/applications/project/herald/HeraldProjectsField.php copy to src/applications/project/herald/PhabricatorProjectTagsField.php --- a/src/applications/project/herald/HeraldProjectsField.php +++ b/src/applications/project/herald/PhabricatorProjectTagsField.php @@ -1,12 +1,7 @@ getPHID(), - PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); - } - protected function getHeraldFieldStandardType() { return self::STANDARD_PHID_LIST; } @@ -30,4 +19,9 @@ return new PhabricatorProjectDatasource(); } + final protected function getProjectTagsTransaction() { + return $this->getAppliedEdgeTransactionOfType( + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); + } + } diff --git a/src/applications/project/herald/PhabricatorProjectTagsRemovedField.php b/src/applications/project/herald/PhabricatorProjectTagsRemovedField.php new file mode 100644 --- /dev/null +++ b/src/applications/project/herald/PhabricatorProjectTagsRemovedField.php @@ -0,0 +1,23 @@ +getProjectTagsTransaction(); + if (!$xaction) { + return array(); + } + + $record = PhabricatorEdgeChangeRecord::newFromTransaction($xaction); + + return $record->getRemovedPHIDs(); + } + +}