Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13984333
D7789.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Referenced Files
None
Subscribers
None
D7789.diff
View Options
Index: src/__phutil_library_map__.php
===================================================================
--- src/__phutil_library_map__.php
+++ src/__phutil_library_map__.php
@@ -756,6 +756,7 @@
'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php',
'HeraldPHIDTypeRule' => 'applications/herald/phid/HeraldPHIDTypeRule.php',
'HeraldPholioMockAdapter' => 'applications/herald/adapter/HeraldPholioMockAdapter.php',
+ 'HeraldPreCommitContentAdapter' => 'applications/diffusion/herald/HeraldPreCommitContentAdapter.php',
'HeraldPreCommitRefAdapter' => 'applications/diffusion/herald/HeraldPreCommitRefAdapter.php',
'HeraldRecursiveConditionsException' => 'applications/herald/engine/exception/HeraldRecursiveConditionsException.php',
'HeraldRemarkupRule' => 'applications/herald/remarkup/HeraldRemarkupRule.php',
@@ -3180,6 +3181,7 @@
'HeraldNewController' => 'HeraldController',
'HeraldPHIDTypeRule' => 'PhabricatorPHIDType',
'HeraldPholioMockAdapter' => 'HeraldAdapter',
+ 'HeraldPreCommitContentAdapter' => 'HeraldAdapter',
'HeraldPreCommitRefAdapter' => 'HeraldAdapter',
'HeraldRecursiveConditionsException' => 'Exception',
'HeraldRemarkupRule' => 'PhabricatorRemarkupRuleObject',
Index: src/applications/diffusion/engine/DiffusionCommitHookEngine.php
===================================================================
--- src/applications/diffusion/engine/DiffusionCommitHookEngine.php
+++ src/applications/diffusion/engine/DiffusionCommitHookEngine.php
@@ -132,12 +132,13 @@
throw $ex;
}
- $this->applyHeraldRefRules($ref_updates);
+ $this->applyHeraldRefRules($ref_updates, $all_updates);
$content_updates = $this->findContentUpdates($ref_updates);
$all_updates = array_merge($all_updates, $content_updates);
- // TODO: Fire content Herald rules.
+ $this->applyHeraldContentRules($content_updates, $all_updates);
+
// TODO: Fire external hooks.
// If we make it this far, we're accepting these changes. Mark all the
@@ -225,19 +226,41 @@
/* -( Herald )------------------------------------------------------------- */
+ private function applyHeraldRefRules(
+ array $ref_updates,
+ array $all_updates) {
+ $this->applyHeraldRules(
+ $ref_updates,
+ new HeraldPreCommitRefAdapter(),
+ $all_updates);
+ }
+
+ private function applyHeraldContentRules(
+ array $content_updates,
+ array $all_updates) {
+ $this->applyHeraldRules(
+ $content_updates,
+ new HeraldPreCommitContentAdapter(),
+ $all_updates);
+ }
+
+ private function applyHeraldRules(
+ array $updates,
+ HeraldAdapter $adapter_template,
+ array $all_updates) {
- private function applyHeraldRefRules(array $ref_updates) {
- if (!$ref_updates) {
+ if (!$updates) {
return;
}
+ $adapter_template->setHookEngine($this);
+
$engine = new HeraldEngine();
$rules = null;
$blocking_effect = null;
- foreach ($ref_updates as $ref_update) {
- $adapter = id(new HeraldPreCommitRefAdapter())
- ->setPushLog($ref_update)
- ->setHookEngine($this);
+ foreach ($updates as $update) {
+ $adapter = id(clone $adapter_template)
+ ->setPushLog($update);
if ($rules === null) {
$rules = $engine->loadRulesForAdapter($adapter);
@@ -258,9 +281,9 @@
}
if ($blocking_effect) {
- foreach ($ref_updates as $ref_update) {
- $ref_update->setRejectCode(PhabricatorRepositoryPushLog::REJECT_HERALD);
- $ref_update->setRejectDetails($blocking_effect->getRulePHID());
+ foreach ($all_updates as $update) {
+ $update->setRejectCode(PhabricatorRepositoryPushLog::REJECT_HERALD);
+ $update->setRejectDetails($blocking_effect->getRulePHID());
}
$message = $blocking_effect->getTarget();
Index: src/applications/diffusion/herald/HeraldPreCommitContentAdapter.php
===================================================================
--- /dev/null
+++ src/applications/diffusion/herald/HeraldPreCommitContentAdapter.php
@@ -0,0 +1,120 @@
+<?php
+
+final class HeraldPreCommitContentAdapter extends HeraldAdapter {
+
+ private $log;
+ private $hookEngine;
+
+ public function setPushLog(PhabricatorRepositoryPushLog $log) {
+ $this->log = $log;
+ return $this;
+ }
+
+ public function setHookEngine(DiffusionCommitHookEngine $engine) {
+ $this->hookEngine = $engine;
+ return $this;
+ }
+
+ public function getAdapterApplicationClass() {
+ return 'PhabricatorApplicationDiffusion';
+ }
+
+ public function getObject() {
+ return $this->log;
+ }
+
+ public function getAdapterContentName() {
+ return pht('Commit Hook: Commit Content');
+ }
+
+ public function getFieldNameMap() {
+ return array(
+ ) + parent::getFieldNameMap();
+ }
+
+ public function getFields() {
+ return array_merge(
+ array(
+ self::FIELD_REPOSITORY,
+ self::FIELD_PUSHER,
+ self::FIELD_PUSHER_PROJECTS,
+ self::FIELD_RULE,
+ ),
+ parent::getFields());
+ }
+
+ public function getConditionsForField($field) {
+ switch ($field) {
+ }
+ return parent::getConditionsForField($field);
+ }
+
+ public function getActions($rule_type) {
+ switch ($rule_type) {
+ case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL:
+ return array(
+ self::ACTION_BLOCK,
+ self::ACTION_NOTHING
+ );
+ case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL:
+ return array(
+ self::ACTION_NOTHING,
+ );
+ }
+ }
+
+ public function getValueTypeForFieldAndCondition($field, $condition) {
+ return parent::getValueTypeForFieldAndCondition($field, $condition);
+ }
+
+ public function getPHID() {
+ return $this->getObject()->getPHID();
+ }
+
+ public function getHeraldName() {
+ return pht('Push Log');
+ }
+
+ public function getHeraldField($field) {
+ $log = $this->getObject();
+ switch ($field) {
+ case self::FIELD_REPOSITORY:
+ return $this->hookEngine->getRepository()->getPHID();
+ case self::FIELD_PUSHER:
+ return $this->hookEngine->getViewer()->getPHID();
+ case self::FIELD_PUSHER_PROJECTS:
+ return $this->hookEngine->loadViewerProjectPHIDsForHerald();
+ }
+
+ return parent::getHeraldField($field);
+ }
+
+
+ public function applyHeraldEffects(array $effects) {
+ assert_instances_of($effects, 'HeraldEffect');
+
+ $result = array();
+ foreach ($effects as $effect) {
+ $action = $effect->getAction();
+ switch ($action) {
+ case self::ACTION_NOTHING:
+ $result[] = new HeraldApplyTranscript(
+ $effect,
+ true,
+ pht('Did nothing.'));
+ break;
+ case self::ACTION_BLOCK:
+ $result[] = new HeraldApplyTranscript(
+ $effect,
+ true,
+ pht('Blocked push.'));
+ break;
+ default:
+ throw new Exception(pht('No rules to handle action "%s"!', $action));
+ }
+ }
+
+ return $result;
+ }
+
+}
Index: src/applications/herald/storage/HeraldRule.php
===================================================================
--- src/applications/herald/storage/HeraldRule.php
+++ src/applications/herald/storage/HeraldRule.php
@@ -16,7 +16,7 @@
protected $ruleType;
protected $isDisabled = 0;
- protected $configVersion = 16;
+ protected $configVersion = 17;
// phids for which this rule has been applied
private $ruleApplied = self::ATTACHABLE;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Oct 21, 12:35 PM (4 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6730352
Default Alt Text
D7789.diff (7 KB)
Attached To
Mode
D7789: Provide basic commit content hooks for Herald
Attached
Detach File
Event Timeline
Log In to Comment