Page MenuHomePhabricator

D20946.diff
No OneTemporary

D20946.diff

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 @@
<?php
-final class HeraldProjectsField extends HeraldField {
+final class HeraldProjectsField
+ extends PhabricatorProjectTagsField {
const FIELDCONST = 'projects';
@@ -8,26 +9,10 @@
return pht('Project tags');
}
- public function getFieldGroupKey() {
- return HeraldSupportFieldGroup::FIELDGROUPKEY;
- }
-
- public function supportsObject($object) {
- return ($object instanceof PhabricatorProjectInterface);
- }
-
public function getHeraldFieldValue($object) {
return PhabricatorEdgeQuery::loadDestinationPHIDs(
$object->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 @@
+<?php
+
+final class PhabricatorProjectTagsAddedField
+ extends PhabricatorProjectTagsField {
+
+ const FIELDCONST = 'projects.added';
+
+ public function getHeraldFieldName() {
+ return pht('Project tags added');
+ }
+
+ public function getHeraldFieldValue($object) {
+ $xaction = $this->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 @@
<?php
-final class HeraldProjectsField extends HeraldField {
-
- const FIELDCONST = 'projects';
-
- public function getHeraldFieldName() {
- return pht('Project tags');
- }
+abstract class PhabricatorProjectTagsField
+ extends HeraldField {
public function getFieldGroupKey() {
return HeraldSupportFieldGroup::FIELDGROUPKEY;
@@ -16,12 +11,6 @@
return ($object instanceof PhabricatorProjectInterface);
}
- public function getHeraldFieldValue($object) {
- return PhabricatorEdgeQuery::loadDestinationPHIDs(
- $object->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 @@
+<?php
+
+final class PhabricatorProjectTagsRemovedField
+ extends PhabricatorProjectTagsField {
+
+ const FIELDCONST = 'projects.removed';
+
+ public function getHeraldFieldName() {
+ return pht('Project tags removed');
+ }
+
+ public function getHeraldFieldValue($object) {
+ $xaction = $this->getProjectTagsTransaction();
+ if (!$xaction) {
+ return array();
+ }
+
+ $record = PhabricatorEdgeChangeRecord::newFromTransaction($xaction);
+
+ return $record->getRemovedPHIDs();
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 22, 8:49 PM (1 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7710150
Default Alt Text
D20946.diff (7 KB)

Event Timeline