@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Show command transactions in Harbormaster builds

Summary:
Create transaction, editor, etc, and move command generation over to editor.
Show in a timeline in the buildable page.

Also prevent Engine from creating an empty transaction when build starts (Fixes T4885).

Fixes T4886.

Test Plan: Restart builds and buildables, look at timeline.

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: epriestley, Korvin

Maniphest Tasks: T4885, T4886

Differential Revision: https://secure.phabricator.com/D9110

authored by

Aviv Eyal and committed by
epriestley
f2c0e94e 7f22958a

+505 -33
+43
resources/sql/autopatches/20140514.harbormasterbuildabletransaction.sql
··· 1 + CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildabletransaction ( 2 + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 3 + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, 4 + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, 5 + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, 6 + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, 7 + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, 8 + commentPHID VARCHAR(64) COLLATE utf8_bin, 9 + commentVersion INT UNSIGNED NOT NULL, 10 + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, 11 + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, 12 + newValue LONGTEXT NOT NULL COLLATE utf8_bin, 13 + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, 14 + metadata LONGTEXT NOT NULL COLLATE utf8_bin, 15 + dateCreated INT UNSIGNED NOT NULL, 16 + dateModified INT UNSIGNED NOT NULL, 17 + 18 + UNIQUE KEY `key_phid` (phid), 19 + KEY `key_object` (objectPHID) 20 + 21 + ) ENGINE=InnoDB, COLLATE utf8_general_ci; 22 + 23 + CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtransaction ( 24 + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 25 + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, 26 + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, 27 + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, 28 + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, 29 + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, 30 + commentPHID VARCHAR(64) COLLATE utf8_bin, 31 + commentVersion INT UNSIGNED NOT NULL, 32 + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, 33 + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, 34 + newValue LONGTEXT NOT NULL COLLATE utf8_bin, 35 + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, 36 + metadata LONGTEXT NOT NULL COLLATE utf8_bin, 37 + dateCreated INT UNSIGNED NOT NULL, 38 + dateModified INT UNSIGNED NOT NULL, 39 + 40 + UNIQUE KEY `key_phid` (phid), 41 + KEY `key_object` (objectPHID) 42 + 43 + ) ENGINE=InnoDB, COLLATE utf8_general_ci;
+12
src/__phutil_library_map__.php
··· 738 738 'HarbormasterBuildStepTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildStepTransactionQuery.php', 739 739 'HarbormasterBuildTarget' => 'applications/harbormaster/storage/build/HarbormasterBuildTarget.php', 740 740 'HarbormasterBuildTargetQuery' => 'applications/harbormaster/query/HarbormasterBuildTargetQuery.php', 741 + 'HarbormasterBuildTransaction' => 'applications/harbormaster/storage/HarbormasterBuildTransaction.php', 742 + 'HarbormasterBuildTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildTransactionEditor.php', 743 + 'HarbormasterBuildTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildTransactionQuery.php', 741 744 'HarbormasterBuildViewController' => 'applications/harbormaster/controller/HarbormasterBuildViewController.php', 742 745 'HarbormasterBuildWorker' => 'applications/harbormaster/worker/HarbormasterBuildWorker.php', 743 746 'HarbormasterBuildable' => 'applications/harbormaster/storage/HarbormasterBuildable.php', ··· 746 749 'HarbormasterBuildableListController' => 'applications/harbormaster/controller/HarbormasterBuildableListController.php', 747 750 'HarbormasterBuildableQuery' => 'applications/harbormaster/query/HarbormasterBuildableQuery.php', 748 751 'HarbormasterBuildableSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildableSearchEngine.php', 752 + 'HarbormasterBuildableTransaction' => 'applications/harbormaster/storage/HarbormasterBuildableTransaction.php', 753 + 'HarbormasterBuildableTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildableTransactionEditor.php', 754 + 'HarbormasterBuildableTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildableTransactionQuery.php', 749 755 'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php', 750 756 'HarbormasterCapabilityManagePlans' => 'applications/harbormaster/capability/HarbormasterCapabilityManagePlans.php', 751 757 'HarbormasterCommandBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterCommandBuildStepImplementation.php', ··· 3427 3433 1 => 'PhabricatorPolicyInterface', 3428 3434 ), 3429 3435 'HarbormasterBuildTargetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3436 + 'HarbormasterBuildTransaction' => 'PhabricatorApplicationTransaction', 3437 + 'HarbormasterBuildTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 3438 + 'HarbormasterBuildTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3430 3439 'HarbormasterBuildViewController' => 'HarbormasterController', 3431 3440 'HarbormasterBuildWorker' => 'HarbormasterWorker', 3432 3441 'HarbormasterBuildable' => ··· 3439 3448 'HarbormasterBuildableListController' => 'HarbormasterController', 3440 3449 'HarbormasterBuildableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3441 3450 'HarbormasterBuildableSearchEngine' => 'PhabricatorApplicationSearchEngine', 3451 + 'HarbormasterBuildableTransaction' => 'PhabricatorApplicationTransaction', 3452 + 'HarbormasterBuildableTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 3453 + 'HarbormasterBuildableTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3442 3454 'HarbormasterBuildableViewController' => 'HarbormasterController', 3443 3455 'HarbormasterCapabilityManagePlans' => 'PhabricatorPolicyCapability', 3444 3456 'HarbormasterCommandBuildStepImplementation' => 'HarbormasterBuildStepImplementation',
+9 -14
src/applications/harbormaster/controller/HarbormasterBuildActionController.php
··· 55 55 } 56 56 57 57 if ($request->isDialogFormPost() && $can_issue) { 58 + $editor = id(new HarbormasterBuildTransactionEditor()) 59 + ->setActor($viewer) 60 + ->setContentSourceFromRequest($request) 61 + ->setContinueOnNoEffect(true) 62 + ->setContinueOnMissingFields(true); 58 63 59 - // Issue the new build command. 60 - id(new HarbormasterBuildCommand()) 61 - ->setAuthorPHID($viewer->getPHID()) 62 - ->setTargetPHID($build->getPHID()) 63 - ->setCommand($command) 64 - ->save(); 64 + $xaction = id(new HarbormasterBuildTransaction()) 65 + ->setTransactionType(HarbormasterBuildTransaction::TYPE_COMMAND) 66 + ->setNewValue($command); 65 67 66 - // Schedule a build update. We may already have stuff in queue (in which 67 - // case this will just no-op), but we might also be dealing with a 68 - // stopped build, which won't restart unless we deal with this. 69 - PhabricatorWorker::scheduleTask( 70 - 'HarbormasterBuildWorker', 71 - array( 72 - 'buildID' => $build->getID() 73 - )); 68 + $editor->applyTransactions($build, array($xaction)); 74 69 75 70 return id(new AphrontRedirectResponse())->setURI($return_uri); 76 71 }
+11 -1
src/applications/harbormaster/controller/HarbormasterBuildViewController.php
··· 103 103 $targets[] = $this->buildLog($build, $build_target); 104 104 } 105 105 106 + $xactions = id(new HarbormasterBuildTransactionQuery()) 107 + ->setViewer($viewer) 108 + ->withObjectPHIDs(array($build->getPHID())) 109 + ->execute(); 110 + $timeline = id(new PhabricatorApplicationTransactionView()) 111 + ->setUser($viewer) 112 + ->setObjectPHID($build->getPHID()) 113 + ->setTransactions($xactions); 114 + 106 115 return $this->buildApplicationPage( 107 116 array( 108 117 $crumbs, 109 118 $box, 110 - $targets 119 + $targets, 120 + $timeline, 111 121 ), 112 122 array( 113 123 'title' => $title,
+22 -11
src/applications/harbormaster/controller/HarbormasterBuildableActionController.php
··· 56 56 57 57 $return_uri = $buildable->getMonogram(); 58 58 if ($request->isDialogFormPost() && $issuable) { 59 - foreach ($issuable as $build) { 60 - id(new HarbormasterBuildCommand()) 61 - ->setAuthorPHID($viewer->getPHID()) 62 - ->setTargetPHID($build->getPHID()) 63 - ->setCommand($command) 64 - ->save(); 59 + $editor = id(new HarbormasterBuildableTransactionEditor()) 60 + ->setActor($viewer) 61 + ->setContentSourceFromRequest($request) 62 + ->setContinueOnNoEffect(true) 63 + ->setContinueOnMissingFields(true); 64 + 65 + $xaction = id(new HarbormasterBuildableTransaction()) 66 + ->setTransactionType(HarbormasterBuildableTransaction::TYPE_COMMAND) 67 + ->setNewValue($command); 68 + 69 + $editor->applyTransactions($buildable, array($xaction)); 70 + 71 + $build_editor = id(new HarbormasterBuildTransactionEditor()) 72 + ->setActor($viewer) 73 + ->setContentSourceFromRequest($request) 74 + ->setContinueOnNoEffect(true) 75 + ->setContinueOnMissingFields(true); 65 76 66 - PhabricatorWorker::scheduleTask( 67 - 'HarbormasterBuildWorker', 68 - array( 69 - 'buildID' => $build->getID() 70 - )); 77 + foreach ($issuable as $build) { 78 + $xaction = id(new HarbormasterBuildTransaction()) 79 + ->setTransactionType(HarbormasterBuildTransaction::TYPE_COMMAND) 80 + ->setNewValue($command); 81 + $build_editor->applyTransactions($build, array($xaction)); 71 82 } 72 83 73 84 return id(new AphrontRedirectResponse())->setURI($return_uri);
+10
src/applications/harbormaster/controller/HarbormasterBuildableViewController.php
··· 46 46 $box = id(new PHUIObjectBoxView()) 47 47 ->setHeader($header); 48 48 49 + $xactions = id(new HarbormasterBuildableTransactionQuery()) 50 + ->setViewer($viewer) 51 + ->withObjectPHIDs(array($buildable->getPHID())) 52 + ->execute(); 53 + $timeline = id(new PhabricatorApplicationTransactionView()) 54 + ->setUser($viewer) 55 + ->setObjectPHID($buildable->getPHID()) 56 + ->setTransactions($xactions); 57 + 49 58 $actions = $this->buildActionList($buildable); 50 59 $this->buildPropertyLists($box, $buildable, $actions); 51 60 ··· 57 66 $crumbs, 58 67 $box, 59 68 $build_list, 69 + $timeline, 60 70 ), 61 71 array( 62 72 'title' => $title,
+106
src/applications/harbormaster/editor/HarbormasterBuildTransactionEditor.php
··· 1 + <?php 2 + 3 + final class HarbormasterBuildTransactionEditor 4 + extends PhabricatorApplicationTransactionEditor { 5 + 6 + public function getTransactionTypes() { 7 + $types = parent::getTransactionTypes(); 8 + 9 + $types[] = HarbormasterBuildTransaction::TYPE_CREATE; 10 + $types[] = HarbormasterBuildTransaction::TYPE_COMMAND; 11 + 12 + return $types; 13 + } 14 + 15 + protected function getCustomTransactionOldValue( 16 + PhabricatorLiskDAO $object, 17 + PhabricatorApplicationTransaction $xaction) { 18 + 19 + switch ($xaction->getTransactionType()) { 20 + case HarbormasterBuildTransaction::TYPE_CREATE: 21 + case HarbormasterBuildTransaction::TYPE_COMMAND: 22 + return null; 23 + } 24 + 25 + return parent::getCustomTransactionOldValue($object, $xaction); 26 + } 27 + 28 + protected function getCustomTransactionNewValue( 29 + PhabricatorLiskDAO $object, 30 + PhabricatorApplicationTransaction $xaction) { 31 + 32 + switch ($xaction->getTransactionType()) { 33 + case HarbormasterBuildTransaction::TYPE_CREATE: 34 + return true; 35 + case HarbormasterBuildTransaction::TYPE_COMMAND: 36 + return $xaction->getNewValue(); 37 + } 38 + 39 + return parent::getCustomTransactionNewValue($object, $xaction); 40 + } 41 + 42 + protected function applyCustomInternalTransaction( 43 + PhabricatorLiskDAO $object, 44 + PhabricatorApplicationTransaction $xaction) { 45 + 46 + switch ($xaction->getTransactionType()) { 47 + case HarbormasterBuildTransaction::TYPE_CREATE: 48 + return; 49 + case HarbormasterBuildTransaction::TYPE_COMMAND: 50 + return $this->executeBuildCommand($object, $xaction); 51 + } 52 + 53 + return parent::applyCustomInternalTransaction($object, $xaction); 54 + } 55 + 56 + private function executeBuildCommand( 57 + HarbormasterBuild $build, 58 + HarbormasterBuildTransaction $xaction) { 59 + 60 + $command = $xaction->getNewValue(); 61 + 62 + switch ($command) { 63 + case HarbormasterBuildCommand::COMMAND_RESTART: 64 + $issuable = $build->canRestartBuild(); 65 + break; 66 + case HarbormasterBuildCommand::COMMAND_STOP: 67 + $issuable = $build->canStopBuild(); 68 + break; 69 + case HarbormasterBuildCommand::COMMAND_RESUME: 70 + $issuable = $build->canResumeBuild(); 71 + break; 72 + default: 73 + throw new Exception("Unknown command $command"); 74 + } 75 + 76 + if (!$issuable) { 77 + return; 78 + } 79 + 80 + id(new HarbormasterBuildCommand()) 81 + ->setAuthorPHID($xaction->getAuthorPHID()) 82 + ->setTargetPHID($build->getPHID()) 83 + ->setCommand($command) 84 + ->save(); 85 + 86 + PhabricatorWorker::scheduleTask( 87 + 'HarbormasterBuildWorker', 88 + array( 89 + 'buildID' => $build->getID() 90 + )); 91 + } 92 + 93 + protected function applyCustomExternalTransaction( 94 + PhabricatorLiskDAO $object, 95 + PhabricatorApplicationTransaction $xaction) { 96 + 97 + switch ($xaction->getTransactionType()) { 98 + case HarbormasterBuildTransaction::TYPE_CREATE: 99 + case HarbormasterBuildTransaction::TYPE_COMMAND: 100 + return; 101 + } 102 + 103 + return parent::applyCustomExternalTransaction($object, $xaction); 104 + } 105 + 106 + }
+68
src/applications/harbormaster/editor/HarbormasterBuildableTransactionEditor.php
··· 1 + <?php 2 + 3 + final class HarbormasterBuildableTransactionEditor 4 + extends PhabricatorApplicationTransactionEditor { 5 + 6 + public function getTransactionTypes() { 7 + $types = parent::getTransactionTypes(); 8 + 9 + $types[] = HarbormasterBuildableTransaction::TYPE_CREATE; 10 + $types[] = HarbormasterBuildableTransaction::TYPE_COMMAND; 11 + 12 + return $types; 13 + } 14 + 15 + protected function getCustomTransactionOldValue( 16 + PhabricatorLiskDAO $object, 17 + PhabricatorApplicationTransaction $xaction) { 18 + 19 + switch ($xaction->getTransactionType()) { 20 + case HarbormasterBuildableTransaction::TYPE_CREATE: 21 + case HarbormasterBuildableTransaction::TYPE_COMMAND: 22 + return null; 23 + } 24 + 25 + return parent::getCustomTransactionOldValue($object, $xaction); 26 + } 27 + 28 + protected function getCustomTransactionNewValue( 29 + PhabricatorLiskDAO $object, 30 + PhabricatorApplicationTransaction $xaction) { 31 + 32 + switch ($xaction->getTransactionType()) { 33 + case HarbormasterBuildableTransaction::TYPE_CREATE: 34 + return true; 35 + case HarbormasterBuildableTransaction::TYPE_COMMAND: 36 + return $xaction->getNewValue(); 37 + } 38 + 39 + return parent::getCustomTransactionNewValue($object, $xaction); 40 + } 41 + 42 + protected function applyCustomInternalTransaction( 43 + PhabricatorLiskDAO $object, 44 + PhabricatorApplicationTransaction $xaction) { 45 + 46 + switch ($xaction->getTransactionType()) { 47 + case HarbormasterBuildableTransaction::TYPE_CREATE: 48 + case HarbormasterBuildableTransaction::TYPE_COMMAND: 49 + return; 50 + } 51 + 52 + return parent::applyCustomInternalTransaction($object, $xaction); 53 + } 54 + 55 + protected function applyCustomExternalTransaction( 56 + PhabricatorLiskDAO $object, 57 + PhabricatorApplicationTransaction $xaction) { 58 + 59 + switch ($xaction->getTransactionType()) { 60 + case HarbormasterBuildableTransaction::TYPE_CREATE: 61 + case HarbormasterBuildableTransaction::TYPE_COMMAND: 62 + return; 63 + } 64 + 65 + return parent::applyCustomExternalTransaction($object, $xaction); 66 + } 67 + 68 + }
+4 -2
src/applications/harbormaster/engine/HarbormasterBuildEngine.php
··· 408 408 // can look at the results themselves, and other users generally don't 409 409 // care about the outcome. 410 410 411 - if ($did_update && !$buildable->getIsManualBuildable()) { 412 - 411 + $should_publish = $did_update && 412 + $new_status != HarbormasterBuildable::STATUS_BUILDING && 413 + !$buildable->getIsManualBuildable(); 414 + if ($should_publish) { 413 415 $object = id(new PhabricatorObjectQuery()) 414 416 ->setViewer($viewer) 415 417 ->withPHIDs(array($buildable->getBuildablePHID()))
+13
src/applications/harbormaster/query/HarbormasterBuildTransactionQuery.php
··· 1 + <?php 2 + 3 + /** 4 + * @group harbormaster 5 + */ 6 + final class HarbormasterBuildTransactionQuery 7 + extends PhabricatorApplicationTransactionQuery { 8 + 9 + public function getTemplateApplicationTransaction() { 10 + return new HarbormasterBuildTransaction(); 11 + } 12 + 13 + }
+13
src/applications/harbormaster/query/HarbormasterBuildableTransactionQuery.php
··· 1 + <?php 2 + 3 + /** 4 + * @group harbormaster 5 + */ 6 + final class HarbormasterBuildableTransactionQuery 7 + extends PhabricatorApplicationTransactionQuery { 8 + 9 + public function getTemplateApplicationTransaction() { 10 + return new HarbormasterBuildableTransaction(); 11 + } 12 + 13 + }
+87
src/applications/harbormaster/storage/HarbormasterBuildTransaction.php
··· 1 + <?php 2 + 3 + final class HarbormasterBuildTransaction 4 + extends PhabricatorApplicationTransaction { 5 + 6 + const TYPE_CREATE = 'harbormaster:build:create'; 7 + const TYPE_COMMAND = 'harbormaster:build:command'; 8 + 9 + public function getApplicationName() { 10 + return 'harbormaster'; 11 + } 12 + 13 + public function getApplicationTransactionType() { 14 + return HarbormasterPHIDTypeBuild::TYPECONST; 15 + } 16 + 17 + public function getTitle() { 18 + $author_phid = $this->getAuthorPHID(); 19 + 20 + $old = $this->getOldValue(); 21 + $new = $this->getNewValue(); 22 + 23 + switch ($this->getTransactionType()) { 24 + case self::TYPE_CREATE: 25 + return pht( 26 + '%s created this build.', 27 + $this->renderHandleLink($author_phid)); 28 + case self::TYPE_COMMAND: 29 + switch ($new) { 30 + case HarbormasterBuildCommand::COMMAND_RESTART: 31 + return pht( 32 + '%s restarted this build.', 33 + $this->renderHandleLink($author_phid)); 34 + case HarbormasterBuildCommand::COMMAND_RESUME: 35 + return pht( 36 + '%s resumed this build.', 37 + $this->renderHandleLink($author_phid)); 38 + case HarbormasterBuildCommand::COMMAND_STOP: 39 + return pht( 40 + '%s stopped this build.', 41 + $this->renderHandleLink($author_phid)); 42 + } 43 + } 44 + return parent::getTitle(); 45 + } 46 + 47 + public function getIcon() { 48 + $author_phid = $this->getAuthorPHID(); 49 + 50 + $old = $this->getOldValue(); 51 + $new = $this->getNewValue(); 52 + 53 + switch ($this->getTransactionType()) { 54 + case self::TYPE_CREATE: 55 + return 'fa-plus'; 56 + case self::TYPE_COMMAND: 57 + switch ($new) { 58 + case HarbormasterBuildCommand::COMMAND_RESTART: 59 + return 'fa-backward'; 60 + case HarbormasterBuildCommand::COMMAND_RESUME: 61 + return 'fa-play'; 62 + case HarbormasterBuildCommand::COMMAND_STOP: 63 + return 'fa-stop'; 64 + } 65 + } 66 + 67 + return parent::getIcon(); 68 + } 69 + 70 + public function getColor() { 71 + $author_phid = $this->getAuthorPHID(); 72 + 73 + $old = $this->getOldValue(); 74 + $new = $this->getNewValue(); 75 + 76 + switch ($this->getTransactionType()) { 77 + case self::TYPE_CREATE: 78 + return 'green'; 79 + case self::TYPE_COMMAND: 80 + switch ($new) { 81 + case HarbormasterBuildCommand::COMMAND_STOP: 82 + return 'red'; 83 + } 84 + } 85 + return parent::getColor(); 86 + } 87 + }
+87
src/applications/harbormaster/storage/HarbormasterBuildableTransaction.php
··· 1 + <?php 2 + 3 + final class HarbormasterBuildableTransaction 4 + extends PhabricatorApplicationTransaction { 5 + 6 + const TYPE_CREATE = 'harbormaster:buildable:create'; 7 + const TYPE_COMMAND = 'harbormaster:buildable:command'; 8 + 9 + public function getApplicationName() { 10 + return 'harbormaster'; 11 + } 12 + 13 + public function getApplicationTransactionType() { 14 + return HarbormasterPHIDTypeBuildable::TYPECONST; 15 + } 16 + 17 + public function getTitle() { 18 + $author_phid = $this->getAuthorPHID(); 19 + 20 + $old = $this->getOldValue(); 21 + $new = $this->getNewValue(); 22 + 23 + switch ($this->getTransactionType()) { 24 + case self::TYPE_CREATE: 25 + return pht( 26 + '%s created this buildable.', 27 + $this->renderHandleLink($author_phid)); 28 + case self::TYPE_COMMAND: 29 + switch ($new) { 30 + case HarbormasterBuildCommand::COMMAND_RESTART: 31 + return pht( 32 + '%s restarted this buildable.', 33 + $this->renderHandleLink($author_phid)); 34 + case HarbormasterBuildCommand::COMMAND_RESUME: 35 + return pht( 36 + '%s resumed this buildable.', 37 + $this->renderHandleLink($author_phid)); 38 + case HarbormasterBuildCommand::COMMAND_STOP: 39 + return pht( 40 + '%s stopped this buildable.', 41 + $this->renderHandleLink($author_phid)); 42 + } 43 + } 44 + return parent::getTitle(); 45 + } 46 + 47 + public function getIcon() { 48 + $author_phid = $this->getAuthorPHID(); 49 + 50 + $old = $this->getOldValue(); 51 + $new = $this->getNewValue(); 52 + 53 + switch ($this->getTransactionType()) { 54 + case self::TYPE_CREATE: 55 + return 'fa-plus'; 56 + case self::TYPE_COMMAND: 57 + switch ($new) { 58 + case HarbormasterBuildCommand::COMMAND_RESTART: 59 + return 'fa-backward'; 60 + case HarbormasterBuildCommand::COMMAND_RESUME: 61 + return 'fa-play'; 62 + case HarbormasterBuildCommand::COMMAND_STOP: 63 + return 'fa-stop'; 64 + } 65 + } 66 + 67 + return parent::getIcon(); 68 + } 69 + 70 + public function getColor() { 71 + $author_phid = $this->getAuthorPHID(); 72 + 73 + $old = $this->getOldValue(); 74 + $new = $this->getNewValue(); 75 + 76 + switch ($this->getTransactionType()) { 77 + case self::TYPE_CREATE: 78 + return 'green'; 79 + case self::TYPE_COMMAND: 80 + switch ($new) { 81 + case HarbormasterBuildCommand::COMMAND_STOP: 82 + return 'red'; 83 + } 84 + } 85 + return parent::getColor(); 86 + } 87 + }
+20 -5
src/applications/transactions/storage/PhabricatorApplicationTransaction.php
··· 448 448 return true; 449 449 case PhabricatorTransactions::TYPE_BUILDABLE: 450 450 switch ($this->getNewValue()) { 451 - case HarbormasterBuildable::STATUS_PASSED: 452 - // For now, just never send mail when builds pass. We might let 451 + case HarbormasterBuildable::STATUS_FAILED: 452 + // For now, only ever send mail when builds fail. We might let 453 453 // you customize this later, but in most cases this is probably 454 454 // completely uninteresting. 455 - return true; 455 + return false; 456 456 } 457 + return true; 457 458 } 458 459 459 460 return $this->shouldHide(); ··· 465 466 return true; 466 467 case PhabricatorTransactions::TYPE_BUILDABLE: 467 468 switch ($this->getNewValue()) { 468 - case HarbormasterBuildable::STATUS_PASSED: 469 + case HarbormasterBuildable::STATUS_FAILED: 469 470 // For now, don't notify on build passes either. These are pretty 470 471 // high volume and annoying, with very little present value. We 471 472 // might want to turn them back on in the specific case of 472 473 // build successes on the current document? 473 - return true; 474 + return false; 474 475 } 476 + return true; 475 477 } 476 478 477 479 return $this->shouldHide(); ··· 645 647 646 648 case PhabricatorTransactions::TYPE_BUILDABLE: 647 649 switch ($this->getNewValue()) { 650 + case HarbormasterBuildable::STATUS_BUILDING: 651 + return pht( 652 + '%s started building %s.', 653 + $this->renderHandleLink($author_phid), 654 + $this->renderHandleLink( 655 + $this->getMetadataValue('harbormaster:buildablePHID'))); 648 656 case HarbormasterBuildable::STATUS_PASSED: 649 657 return pht( 650 658 '%s completed building %s.', ··· 722 730 } 723 731 case PhabricatorTransactions::TYPE_BUILDABLE: 724 732 switch ($this->getNewValue()) { 733 + case HarbormasterBuildable::STATUS_BUILDING: 734 + return pht( 735 + '%s started building %s for %s.', 736 + $this->renderHandleLink($author_phid), 737 + $this->renderHandleLink( 738 + $this->getMetadataValue('harbormaster:buildablePHID')), 739 + $this->renderHandleLink($object_phid)); 725 740 case HarbormasterBuildable::STATUS_PASSED: 726 741 return pht( 727 742 '%s completed building %s for %s.',