@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.

When the push phase of "Land Revision" fails, show the error in the UI

Summary: T10447

Test Plan: tested on my dev instance

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: Korvin, yelirekim

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

+54 -32
+7 -5
src/__phutil_library_map__.php
··· 27 27 'AlmanacClusterServiceType' => 'applications/almanac/servicetype/AlmanacClusterServiceType.php', 28 28 'AlmanacConsoleController' => 'applications/almanac/controller/AlmanacConsoleController.php', 29 29 'AlmanacController' => 'applications/almanac/controller/AlmanacController.php', 30 + 'AlmanacCreateClusterServicesCapability' => 'applications/almanac/capability/AlmanacCreateClusterServicesCapability.php', 30 31 'AlmanacCreateDevicesCapability' => 'applications/almanac/capability/AlmanacCreateDevicesCapability.php', 31 32 'AlmanacCreateNamespacesCapability' => 'applications/almanac/capability/AlmanacCreateNamespacesCapability.php', 32 33 'AlmanacCreateNetworksCapability' => 'applications/almanac/capability/AlmanacCreateNetworksCapability.php', ··· 57 58 'AlmanacInterfaceQuery' => 'applications/almanac/query/AlmanacInterfaceQuery.php', 58 59 'AlmanacInterfaceTableView' => 'applications/almanac/view/AlmanacInterfaceTableView.php', 59 60 'AlmanacKeys' => 'applications/almanac/util/AlmanacKeys.php', 60 - 'AlmanacManageClusterServicesCapability' => 'applications/almanac/capability/AlmanacManageClusterServicesCapability.php', 61 + 'AlmanacManagementLockWorkflow' => 'applications/almanac/management/AlmanacManagementLockWorkflow.php', 61 62 'AlmanacManagementRegisterWorkflow' => 'applications/almanac/management/AlmanacManagementRegisterWorkflow.php', 62 63 'AlmanacManagementTrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementTrustKeyWorkflow.php', 64 + 'AlmanacManagementUnlockWorkflow' => 'applications/almanac/management/AlmanacManagementUnlockWorkflow.php', 63 65 'AlmanacManagementUntrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementUntrustKeyWorkflow.php', 64 66 'AlmanacManagementWorkflow' => 'applications/almanac/management/AlmanacManagementWorkflow.php', 65 67 'AlmanacNames' => 'applications/almanac/util/AlmanacNames.php', ··· 971 973 'DrydockWebrootInterface' => 'applications/drydock/interface/webroot/DrydockWebrootInterface.php', 972 974 'DrydockWorker' => 'applications/drydock/worker/DrydockWorker.php', 973 975 'DrydockWorkingCopyBlueprintImplementation' => 'applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php', 976 + 'DrydockCommandError' => 'applications/drydock/DrydockCommandError/DrydockCommandError.php', 974 977 'FeedConduitAPIMethod' => 'applications/feed/conduit/FeedConduitAPIMethod.php', 975 978 'FeedPublishConduitAPIMethod' => 'applications/feed/conduit/FeedPublishConduitAPIMethod.php', 976 979 'FeedPublisherHTTPWorker' => 'applications/feed/worker/FeedPublisherHTTPWorker.php', ··· 3994 3997 'PhabricatorApplicationTransactionInterface', 3995 3998 'AlmanacPropertyInterface', 3996 3999 'PhabricatorDestructibleInterface', 3997 - 'PhabricatorExtendedPolicyInterface', 3998 4000 ), 3999 4001 'AlmanacBindingDisableController' => 'AlmanacServiceController', 4000 4002 'AlmanacBindingEditController' => 'AlmanacServiceController', ··· 4012 4014 'AlmanacClusterServiceType' => 'AlmanacServiceType', 4013 4015 'AlmanacConsoleController' => 'AlmanacController', 4014 4016 'AlmanacController' => 'PhabricatorController', 4017 + 'AlmanacCreateClusterServicesCapability' => 'PhabricatorPolicyCapability', 4015 4018 'AlmanacCreateDevicesCapability' => 'PhabricatorPolicyCapability', 4016 4019 'AlmanacCreateNamespacesCapability' => 'PhabricatorPolicyCapability', 4017 4020 'AlmanacCreateNetworksCapability' => 'PhabricatorPolicyCapability', ··· 4028 4031 'PhabricatorDestructibleInterface', 4029 4032 'PhabricatorNgramsInterface', 4030 4033 'PhabricatorConduitResultInterface', 4031 - 'PhabricatorExtendedPolicyInterface', 4032 4034 ), 4033 4035 'AlmanacDeviceController' => 'AlmanacController', 4034 4036 'AlmanacDeviceEditController' => 'AlmanacDeviceController', ··· 4058 4060 'AlmanacInterfaceQuery' => 'AlmanacQuery', 4059 4061 'AlmanacInterfaceTableView' => 'AphrontView', 4060 4062 'AlmanacKeys' => 'Phobject', 4061 - 'AlmanacManageClusterServicesCapability' => 'PhabricatorPolicyCapability', 4063 + 'AlmanacManagementLockWorkflow' => 'AlmanacManagementWorkflow', 4062 4064 'AlmanacManagementRegisterWorkflow' => 'AlmanacManagementWorkflow', 4063 4065 'AlmanacManagementTrustKeyWorkflow' => 'AlmanacManagementWorkflow', 4066 + 'AlmanacManagementUnlockWorkflow' => 'AlmanacManagementWorkflow', 4064 4067 'AlmanacManagementUntrustKeyWorkflow' => 'AlmanacManagementWorkflow', 4065 4068 'AlmanacManagementWorkflow' => 'PhabricatorManagementWorkflow', 4066 4069 'AlmanacNames' => 'Phobject', ··· 4128 4131 'PhabricatorDestructibleInterface', 4129 4132 'PhabricatorNgramsInterface', 4130 4133 'PhabricatorConduitResultInterface', 4131 - 'PhabricatorExtendedPolicyInterface', 4132 4134 ), 4133 4135 'AlmanacServiceController' => 'AlmanacController', 4134 4136 'AlmanacServiceDatasource' => 'PhabricatorTypeaheadDatasource',
+18
src/applications/drydock/DrydockCommandError/DrydockCommandError.php
··· 1 + <?php 2 + 3 + class DrydockCommandError { 4 + public static function newFromCommandException( 5 + $phase, 6 + $command, 7 + CommandException $ex) { 8 + $error = array( 9 + 'phase' => $phase, 10 + 'command' => (string)$command, 11 + 'raw' => (string)$ex->getCommand(), 12 + 'err' => $ex->getError(), 13 + 'stdout' => $ex->getStdout(), 14 + 'stderr' => $ex->getStderr(), 15 + ); 16 + return $error; 17 + } 18 + }
+3 -21
src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php
··· 448 448 try { 449 449 $interface->execx('%C', $real_command); 450 450 } catch (CommandException $ex) { 451 - $this->setWorkingCopyVCSErrorFromCommandException( 452 - $lease, 451 + $error = DrydockCommandError::newFromCommandException( 453 452 self::PHASE_SQUASHMERGE, 454 453 $show_command, 455 454 $ex); 456 455 456 + $lease->setAttribute('workingcopy.vcs.error', $error); 457 457 throw $ex; 458 458 } 459 459 } 460 460 461 - protected function setWorkingCopyVCSErrorFromCommandException( 462 - DrydockLease $lease, 463 - $phase, 464 - $command, 465 - CommandException $ex) { 466 - 467 - $error = array( 468 - 'phase' => $phase, 469 - 'command' => (string)$command, 470 - 'raw' => (string)$ex->getCommand(), 471 - 'err' => $ex->getError(), 472 - 'stdout' => $ex->getStdout(), 473 - 'stderr' => $ex->getStderr(), 474 - ); 475 - 476 - $lease->setAttribute('workingcopy.vcs.error', $error); 477 - } 478 - 479 - public function getWorkingCopyVCSError(DrydockLease $lease) { 461 + public function getCommandError(DrydockLease $lease) { 480 462 $error = $lease->getAttribute('workingcopy.vcs.error'); 481 463 if (!$error) { 482 464 return null;
+15 -1
src/applications/drydock/operation/DrydockLandRepositoryOperation.php
··· 4 4 extends DrydockRepositoryOperationType { 5 5 6 6 const OPCONST = 'land'; 7 + const PHASE_PUSH = 'push'; 7 8 8 9 public function getOperationDescription( 9 10 DrydockRepositoryOperation $operation, ··· 122 123 ->write($commit_message) 123 124 ->resolvex(); 124 125 125 - $interface->execx( 126 + try { 127 + $interface->execx( 128 + 'git push origin -- %s:%s', 129 + 'HEAD', 130 + $push_dst); 131 + } catch (CommandException $ex) { 132 + $show_command = csprintf( 126 133 'git push origin -- %s:%s', 127 134 'HEAD', 128 135 $push_dst); 136 + $error = DrydockCommandError::newFromCommandException( 137 + self::PHASE_PUSH, 138 + $show_command, 139 + $ex); 140 + $operation->setCommandError($error); 141 + throw $ex; 142 + } 129 143 } 130 144 131 145 private function getCommitterInfo(DrydockRepositoryOperation $operation) {
+2 -2
src/applications/drydock/storage/DrydockRepositoryOperation.php
··· 178 178 return $this->getProperty('exec.leasePHID'); 179 179 } 180 180 181 - public function setWorkingCopyVCSError(array $error) { 181 + public function setCommandError(array $error) { 182 182 return $this->setProperty('exec.workingcopy.error', $error); 183 183 } 184 184 185 - public function getWorkingCopyVCSError() { 185 + public function getCommandError() { 186 186 return $this->getProperty('exec.workingcopy.error'); 187 187 } 188 188
+7 -1
src/applications/drydock/view/DrydockRepositoryOperationStatusView.php
··· 74 74 if ($state != DrydockRepositoryOperation::STATE_FAIL) { 75 75 $item->addAttribute($operation->getOperationCurrentStatus($viewer)); 76 76 } else { 77 - $vcs_error = $operation->getWorkingCopyVCSError(); 77 + $vcs_error = $operation->getCommandError(); 78 78 if ($vcs_error) { 79 79 switch ($vcs_error['phase']) { 80 80 case DrydockWorkingCopyBlueprintImplementation::PHASE_SQUASHMERGE: 81 81 $message = pht( 82 82 'This change did not merge cleanly. This usually indicates '. 83 83 'that the change is out of date and needs to be updated.'); 84 + break; 85 + case DrydockLandRepositoryOperation::PHASE_PUSH: 86 + $message = pht( 87 + 'The push failed. This usually indicates '. 88 + 'that the change is breaking some rules or '. 89 + 'some custom commit hook has failed.'); 84 90 break; 85 91 default: 86 92 $message = pht(
+2 -2
src/applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php
··· 138 138 } 139 139 140 140 if (!$lease->isActive()) { 141 - $vcs_error = $working_copy->getWorkingCopyVCSError($lease); 141 + $vcs_error = $working_copy->getCommandError($lease); 142 142 if ($vcs_error) { 143 143 $operation 144 - ->setWorkingCopyVCSError($vcs_error) 144 + ->setCommandError($vcs_error) 145 145 ->save(); 146 146 } 147 147