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

Add hosting, serving, and push policy options to repository edit

Summary:
Basically straight from D7391. The differences are basically:

- Policy stuff is all application-scope instead of global-scope.
- Made a few strings a little nicer.
- Deleted a bit of dead code.
- Added a big "THIS DOESN'T WORK YET" warning.

Test Plan: See screenshots.

Reviewers: hach-que, btrahan

Reviewed By: hach-que

CC: aran

Maniphest Tasks: T2230

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

+458 -6
+2
src/__phutil_library_map__.php
··· 516 516 'DiffusionRepositoryEditController' => 'applications/diffusion/controller/DiffusionRepositoryEditController.php', 517 517 'DiffusionRepositoryEditDeleteController' => 'applications/diffusion/controller/DiffusionRepositoryEditDeleteController.php', 518 518 'DiffusionRepositoryEditEncodingController' => 'applications/diffusion/controller/DiffusionRepositoryEditEncodingController.php', 519 + 'DiffusionRepositoryEditHostingController' => 'applications/diffusion/controller/DiffusionRepositoryEditHostingController.php', 519 520 'DiffusionRepositoryEditLocalController' => 'applications/diffusion/controller/DiffusionRepositoryEditLocalController.php', 520 521 'DiffusionRepositoryEditMainController' => 'applications/diffusion/controller/DiffusionRepositoryEditMainController.php', 521 522 'DiffusionRepositoryEditPolicyController' => 'applications/diffusion/controller/DiffusionRepositoryEditPolicyController.php', ··· 2697 2698 'DiffusionRepositoryEditController' => 'DiffusionController', 2698 2699 'DiffusionRepositoryEditDeleteController' => 'DiffusionRepositoryEditController', 2699 2700 'DiffusionRepositoryEditEncodingController' => 'DiffusionRepositoryEditController', 2701 + 'DiffusionRepositoryEditHostingController' => 'DiffusionRepositoryEditController', 2700 2702 'DiffusionRepositoryEditLocalController' => 'DiffusionRepositoryEditController', 2701 2703 'DiffusionRepositoryEditMainController' => 'DiffusionRepositoryEditController', 2702 2704 'DiffusionRepositoryEditPolicyController' => 'DiffusionRepositoryEditController',
+4
src/applications/diffusion/application/PhabricatorApplicationDiffusion.php
··· 75 75 '(?P<edit>remote)/' => 'DiffusionRepositoryCreateController', 76 76 'local/' => 'DiffusionRepositoryEditLocalController', 77 77 'delete/' => 'DiffusionRepositoryEditDeleteController', 78 + 'hosting/' => 'DiffusionRepositoryEditHostingController', 79 + '(?P<serve>serve)/' => 'DiffusionRepositoryEditHostingController', 78 80 ), 79 81 ), 80 82 'inline/' => array( ··· 109 111 ), 110 112 DiffusionCapabilityDefaultEdit::CAPABILITY => array( 111 113 'default' => PhabricatorPolicies::POLICY_ADMIN, 114 + ), 115 + DiffusionCapabilityDefaultPush::CAPABILITY => array( 112 116 ), 113 117 DiffusionCapabilityCreateRepositories::CAPABILITY => array( 114 118 'default' => PhabricatorPolicies::POLICY_ADMIN,
+229
src/applications/diffusion/controller/DiffusionRepositoryEditHostingController.php
··· 1 + <?php 2 + 3 + final class DiffusionRepositoryEditHostingController 4 + extends DiffusionRepositoryEditController { 5 + 6 + private $serve; 7 + 8 + public function willProcessRequest(array $data) { 9 + parent::willProcessRequest($data); 10 + $this->serve = idx($data, 'serve'); 11 + } 12 + 13 + public function processRequest() { 14 + $request = $this->getRequest(); 15 + $user = $request->getUser(); 16 + $drequest = $this->diffusionRequest; 17 + $repository = $drequest->getRepository(); 18 + 19 + $repository = id(new PhabricatorRepositoryQuery()) 20 + ->setViewer($user) 21 + ->requireCapabilities( 22 + array( 23 + PhabricatorPolicyCapability::CAN_VIEW, 24 + PhabricatorPolicyCapability::CAN_EDIT, 25 + )) 26 + ->withIDs(array($repository->getID())) 27 + ->executeOne(); 28 + if (!$repository) { 29 + return new Aphront404Response(); 30 + } 31 + 32 + if (!$this->serve) { 33 + return $this->handleHosting($repository); 34 + } else { 35 + return $this->handleProtocols($repository); 36 + } 37 + } 38 + 39 + public function handleHosting(PhabricatorRepository $repository) { 40 + $request = $this->getRequest(); 41 + $user = $request->getUser(); 42 + 43 + $v_hosting = $repository->isHosted(); 44 + 45 + $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); 46 + $next_uri = $this->getRepositoryControllerURI($repository, 'edit/serve/'); 47 + 48 + if ($request->isFormPost()) { 49 + $v_hosting = $request->getBool('hosting'); 50 + 51 + $xactions = array(); 52 + $template = id(new PhabricatorRepositoryTransaction()); 53 + 54 + $type_hosting = PhabricatorRepositoryTransaction::TYPE_HOSTING; 55 + 56 + $xactions[] = id(clone $template) 57 + ->setTransactionType($type_hosting) 58 + ->setNewValue($v_hosting); 59 + 60 + id(new PhabricatorRepositoryEditor()) 61 + ->setContinueOnNoEffect(true) 62 + ->setContentSourceFromRequest($request) 63 + ->setActor($user) 64 + ->applyTransactions($repository, $xactions); 65 + 66 + return id(new AphrontRedirectResponse())->setURI($next_uri); 67 + } 68 + 69 + $crumbs = $this->buildApplicationCrumbs(); 70 + $crumbs->addCrumb( 71 + id(new PhabricatorCrumbView()) 72 + ->setName(pht('Edit Hosting'))); 73 + 74 + $title = pht('Edit Hosting (%s)', $repository->getName()); 75 + 76 + $hosted_control = id(new AphrontFormRadioButtonControl()) 77 + ->setName('hosting') 78 + ->setLabel(pht('Hosting')) 79 + ->addButton( 80 + true, 81 + pht('Host Repository on Phabricator'), 82 + pht( 83 + 'Phabricator will host this repository. Users will be able to '. 84 + 'push commits to Phabricator. Phabricator will not pull '. 85 + 'changes from elsewhere.')) 86 + ->addButton( 87 + false, 88 + pht('Host Repository Elsewhere'), 89 + pht( 90 + 'Phabricator will pull updates to this repository from a master '. 91 + 'repository elsewhere (for example, on GitHub or Bitbucket). '. 92 + 'Users will not be able to push commits to this repository.')) 93 + ->setValue($v_hosting); 94 + 95 + $form = id(new AphrontFormView()) 96 + ->setUser($user) 97 + ->appendRemarkupInstructions( 98 + pht( 99 + 'NOTE: Hosting is extremely new and barely works! Use it at '. 100 + 'your own risk.'. 101 + "\n\n". 102 + 'Phabricator can host repositories, or it can track repositories '. 103 + 'hosted elsewhere (like on GitHub or Bitbucket).')) 104 + ->appendChild($hosted_control) 105 + ->appendChild( 106 + id(new AphrontFormSubmitControl()) 107 + ->setValue(pht('Save and Continue')) 108 + ->addCancelButton($edit_uri)); 109 + 110 + $object_box = id(new PHUIObjectBoxView()) 111 + ->setHeaderText($title) 112 + ->setForm($form); 113 + 114 + return $this->buildApplicationPage( 115 + array( 116 + $crumbs, 117 + $object_box, 118 + ), 119 + array( 120 + 'title' => $title, 121 + 'device' => true, 122 + )); 123 + } 124 + 125 + public function handleProtocols(PhabricatorRepository $repository) { 126 + $request = $this->getRequest(); 127 + $user = $request->getUser(); 128 + 129 + $v_http_mode = $repository->getServeOverHTTP(); 130 + $v_ssh_mode = $repository->getServeOverSSH(); 131 + 132 + $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); 133 + $prev_uri = $this->getRepositoryControllerURI($repository, 'edit/hosting/'); 134 + 135 + if ($request->isFormPost()) { 136 + $v_http_mode = $request->getStr('http'); 137 + $v_ssh_mode = PhabricatorRepository::SERVE_OFF; 138 + 139 + $xactions = array(); 140 + $template = id(new PhabricatorRepositoryTransaction()); 141 + 142 + $type_http = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP; 143 + $type_ssh = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH; 144 + 145 + $xactions[] = id(clone $template) 146 + ->setTransactionType($type_http) 147 + ->setNewValue($v_http_mode); 148 + 149 + $xactions[] = id(clone $template) 150 + ->setTransactionType($type_ssh) 151 + ->setNewValue($v_ssh_mode); 152 + 153 + id(new PhabricatorRepositoryEditor()) 154 + ->setContinueOnNoEffect(true) 155 + ->setContentSourceFromRequest($request) 156 + ->setActor($user) 157 + ->applyTransactions($repository, $xactions); 158 + 159 + return id(new AphrontRedirectResponse())->setURI($edit_uri); 160 + } 161 + 162 + $crumbs = $this->buildApplicationCrumbs(); 163 + $crumbs->addCrumb( 164 + id(new PhabricatorCrumbView()) 165 + ->setName(pht('Edit Protocols'))); 166 + 167 + $title = pht('Edit Protocols (%s)', $repository->getName()); 168 + 169 + 170 + if ($repository->isHosted()) { 171 + $rw_message = pht( 172 + 'Phabricator will serve a read-write copy of this repository'); 173 + } else { 174 + $rw_message = pht( 175 + 'This repository is hosted elsewhere, so Phabricator can not perform '. 176 + 'writes.'); 177 + } 178 + 179 + $http_control = 180 + id(new AphrontFormRadioButtonControl()) 181 + ->setName('http') 182 + ->setLabel(pht('HTTP')) 183 + ->setValue($v_http_mode) 184 + ->addButton( 185 + PhabricatorRepository::SERVE_OFF, 186 + PhabricatorRepository::getProtocolAvailabilityName( 187 + PhabricatorRepository::SERVE_OFF), 188 + pht('Phabricator will not serve this repository.')) 189 + ->addButton( 190 + PhabricatorRepository::SERVE_READONLY, 191 + PhabricatorRepository::getProtocolAvailabilityName( 192 + PhabricatorRepository::SERVE_READONLY), 193 + pht('Phabricator will serve a read-only copy of this repository.')) 194 + ->addButton( 195 + PhabricatorRepository::SERVE_READWRITE, 196 + PhabricatorRepository::getProtocolAvailabilityName( 197 + PhabricatorRepository::SERVE_READWRITE), 198 + $rw_message, 199 + $repository->isHosted() ? null : 'disabled', 200 + $repository->isHosted() ? null : true); 201 + 202 + $form = id(new AphrontFormView()) 203 + ->setUser($user) 204 + ->appendRemarkupInstructions( 205 + pht( 206 + 'Phabricator can serve repositories over various protocols. You can '. 207 + 'configure server protocols here.')) 208 + ->appendChild($http_control) 209 + ->appendChild( 210 + id(new AphrontFormSubmitControl()) 211 + ->setValue(pht('Save Changes')) 212 + ->addCancelButton($prev_uri, pht('Back'))); 213 + 214 + $object_box = id(new PHUIObjectBoxView()) 215 + ->setHeaderText($title) 216 + ->setForm($form); 217 + 218 + return $this->buildApplicationPage( 219 + array( 220 + $crumbs, 221 + $object_box, 222 + ), 223 + array( 224 + 'title' => $title, 225 + 'device' => true, 226 + )); 227 + } 228 + 229 + }
+63 -2
src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
··· 23 23 $is_git = true; 24 24 break; 25 25 case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: 26 - // TOOD: This will be true for hosted SVN repositories. 27 - $has_local = false; 26 + $has_local = $repository->isHosted(); 28 27 $is_svn = true; 29 28 break; 30 29 case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: ··· 62 61 $encoding_actions = $this->buildEncodingActions($repository); 63 62 $encoding_properties = 64 63 $this->buildEncodingProperties($repository, $encoding_actions); 64 + 65 + $hosting_properties = $this->buildHostingProperties( 66 + $repository, 67 + $this->buildHostingActions($repository)); 65 68 66 69 $branches_properties = null; 67 70 if ($has_branches) { ··· 114 117 ->setHeader($header) 115 118 ->addPropertyList($basic_properties) 116 119 ->addPropertyList($policy_properties) 120 + ->addPropertyList($hosting_properties) 117 121 ->addPropertyList($remote_properties); 118 122 119 123 if ($local_properties) { ··· 298 302 pht('Editable By'), 299 303 $descriptions[PhabricatorPolicyCapability::CAN_EDIT]); 300 304 305 + $pushable = $repository->isHosted() 306 + ? $descriptions[DiffusionCapabilityPush::CAPABILITY] 307 + : phutil_tag('em', array(), pht('Not a Hosted Repository')); 308 + $view->addProperty(pht('Pushable By'), $pushable); 301 309 302 310 return $view; 303 311 } ··· 501 509 502 510 return $view; 503 511 } 512 + 513 + private function buildHostingActions(PhabricatorRepository $repository) { 514 + $user = $this->getRequest()->getUser(); 515 + 516 + $view = id(new PhabricatorActionListView()) 517 + ->setObjectURI($this->getRequest()->getRequestURI()) 518 + ->setUser($user); 519 + 520 + $edit = id(new PhabricatorActionView()) 521 + ->setIcon('edit') 522 + ->setName(pht('Edit Hosting')) 523 + ->setHref( 524 + $this->getRepositoryControllerURI($repository, 'edit/hosting/')); 525 + $view->addAction($edit); 526 + 527 + return $view; 528 + } 529 + 530 + private function buildHostingProperties( 531 + PhabricatorRepository $repository, 532 + PhabricatorActionListView $actions) { 533 + 534 + $user = $this->getRequest()->getUser(); 535 + 536 + $view = id(new PHUIPropertyListView()) 537 + ->setUser($user) 538 + ->setActionList($actions) 539 + ->addSectionHeader(pht('Hosting')); 540 + 541 + $hosting = $repository->isHosted() 542 + ? pht('Hosted on Phabricator') 543 + : pht('Hosted Elsewhere'); 544 + $view->addProperty(pht('Hosting'), phutil_tag('em', array(), $hosting)); 545 + 546 + $view->addProperty( 547 + pht('Serve over HTTP'), 548 + phutil_tag( 549 + 'em', 550 + array(), 551 + PhabricatorRepository::getProtocolAvailabilityName( 552 + $repository->getServeOverHTTP()))); 553 + 554 + $view->addProperty( 555 + pht('Serve over SSH'), 556 + phutil_tag( 557 + 'em', 558 + array(), 559 + PhabricatorRepository::getProtocolAvailabilityName( 560 + $repository->getServeOverSSH()))); 561 + 562 + return $view; 563 + } 564 + 504 565 }
+29 -2
src/applications/diffusion/controller/DiffusionRepositoryEditPolicyController.php
··· 27 27 28 28 $v_view = $repository->getViewPolicy(); 29 29 $v_edit = $repository->getEditPolicy(); 30 + $v_push = $repository->getPushPolicy(); 30 31 31 32 if ($request->isFormPost()) { 32 33 $v_view = $request->getStr('viewPolicy'); 33 34 $v_edit = $request->getStr('editPolicy'); 35 + $v_push = $request->getStr('pushPolicy'); 34 36 35 37 $xactions = array(); 36 38 $template = id(new PhabricatorRepositoryTransaction()); 37 39 38 40 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 39 41 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 42 + $type_push = PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY; 40 43 41 44 $xactions[] = id(clone $template) 42 45 ->setTransactionType($type_view) ··· 46 49 ->setTransactionType($type_edit) 47 50 ->setNewValue($v_edit); 48 51 52 + if ($repository->isHosted()) { 53 + $xactions[] = id(clone $template) 54 + ->setTransactionType($type_push) 55 + ->setNewValue($v_push); 56 + } 57 + 49 58 id(new PhabricatorRepositoryEditor()) 50 59 ->setContinueOnNoEffect(true) 51 60 ->setContentSourceFromRequest($request) ··· 62 71 id(new PhabricatorCrumbView()) 63 72 ->setName(pht('Edit Policies'))); 64 73 65 - $title = pht('Edit %s', $repository->getName()); 74 + $title = pht('Edit Policies (%s)', $repository->getName()); 66 75 67 76 $policies = id(new PhabricatorPolicyQuery()) 68 77 ->setViewer($viewer) ··· 84 93 ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) 85 94 ->setPolicyObject($repository) 86 95 ->setPolicies($policies) 87 - ->setName('editPolicy')) 96 + ->setName('editPolicy')); 97 + 98 + if ($repository->isHosted()) { 99 + $form->appendChild( 100 + id(new AphrontFormPolicyControl()) 101 + ->setUser($viewer) 102 + ->setCapability(DiffusionCapabilityPush::CAPABILITY) 103 + ->setPolicyObject($repository) 104 + ->setPolicies($policies) 105 + ->setName('pushPolicy')); 106 + } else { 107 + $form->appendChild( 108 + id(new AphrontFormMarkupControl()) 109 + ->setLabel(pht('Can Push')) 110 + ->setValue( 111 + phutil_tag('em', array(), pht('Not a Hosted Repository')))); 112 + } 113 + 114 + $form 88 115 ->appendChild( 89 116 id(new AphrontFormSubmitControl()) 90 117 ->setValue(pht('Save Policies'))
+28
src/applications/repository/editor/PhabricatorRepositoryEditor.php
··· 25 25 $types[] = PhabricatorRepositoryTransaction::TYPE_HTTP_LOGIN; 26 26 $types[] = PhabricatorRepositoryTransaction::TYPE_HTTP_PASS; 27 27 $types[] = PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH; 28 + $types[] = PhabricatorRepositoryTransaction::TYPE_HOSTING; 29 + $types[] = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP; 30 + $types[] = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH; 31 + $types[] = PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY; 28 32 29 33 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 30 34 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; ··· 75 79 return $object->getDetail('http-pass'); 76 80 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 77 81 return $object->getDetail('local-path'); 82 + case PhabricatorRepositoryTransaction::TYPE_HOSTING: 83 + return $object->isHosted(); 84 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 85 + return $object->getServeOverHTTP(); 86 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 87 + return $object->getServeOverSSH(); 88 + case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 89 + return $object->getPushPolicy(); 78 90 } 79 91 } 80 92 ··· 100 112 case PhabricatorRepositoryTransaction::TYPE_HTTP_PASS: 101 113 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 102 114 case PhabricatorRepositoryTransaction::TYPE_VCS: 115 + case PhabricatorRepositoryTransaction::TYPE_HOSTING: 116 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 117 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 118 + case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 103 119 return $xaction->getNewValue(); 104 120 case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 105 121 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: ··· 170 186 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 171 187 $object->setDetail('local-path', $xaction->getNewValue()); 172 188 break; 189 + case PhabricatorRepositoryTransaction::TYPE_HOSTING: 190 + return $object->setHosted($xaction->getNewValue()); 191 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 192 + return $object->setServeOverHTTP($xaction->getNewValue()); 193 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 194 + return $object->setServeOverSSH($xaction->getNewValue()); 195 + case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 196 + return $object->setPushPolicy($xaction->getNewValue()); 173 197 case PhabricatorRepositoryTransaction::TYPE_ENCODING: 174 198 // Make sure the encoding is valid by converting to UTF-8. This tests 175 199 // that the user has mbstring installed, and also that they didn't type ··· 250 274 case PhabricatorRepositoryTransaction::TYPE_VCS: 251 275 case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 252 276 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 277 + case PhabricatorRepositoryTransaction::TYPE_HOSTING: 278 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 279 + case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 280 + case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 253 281 PhabricatorPolicyFilter::requireCapability( 254 282 $this->requireActor(), 255 283 $object,
+41
src/applications/repository/storage/PhabricatorRepository.php
··· 26 26 const TABLE_BADCOMMIT = 'repository_badcommit'; 27 27 const TABLE_LINTMESSAGE = 'repository_lintmessage'; 28 28 29 + const SERVE_OFF = 'off'; 30 + const SERVE_READONLY = 'readonly'; 31 + const SERVE_READWRITE = 'readwrite'; 32 + 29 33 protected $name; 30 34 protected $callsign; 31 35 protected $uuid; ··· 706 710 public function isHg() { 707 711 $vcs = $this->getVersionControlSystem(); 708 712 return ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL); 713 + } 714 + 715 + public function isHosted() { 716 + return (bool)$this->getDetail('hosting-enabled', false); 717 + } 718 + 719 + public function setHosted($enabled) { 720 + return $this->setDetail('hosting-enabled', $enabled); 721 + } 722 + 723 + public function getServeOverHTTP() { 724 + return $this->getDetail('serve-over-http', self::SERVE_OFF); 725 + } 726 + 727 + public function setServeOverHTTP($mode) { 728 + return $this->setDetail('serve-over-http', $mode); 729 + } 730 + 731 + public function getServeOverSSH() { 732 + return $this->getDetail('serve-over-ssh', self::SERVE_OFF); 733 + } 734 + 735 + public function setServeOverSSH($mode) { 736 + return $this->setDetail('serve-over-ssh', $mode); 737 + } 738 + 739 + public static function getProtocolAvailabilityName($constant) { 740 + switch ($constant) { 741 + case self::SERVE_OFF: 742 + return pht('Off'); 743 + case self::SERVE_READONLY: 744 + return pht('Read Only'); 745 + case self::SERVE_READWRITE: 746 + return pht('Read/Write'); 747 + default: 748 + return pht('Unknown'); 749 + } 709 750 } 710 751 711 752
+50 -1
src/applications/repository/storage/PhabricatorRepositoryTransaction.php
··· 22 22 const TYPE_HTTP_LOGIN = 'repo:http-login'; 23 23 const TYPE_HTTP_PASS = 'repo:http-pass'; 24 24 const TYPE_LOCAL_PATH = 'repo:local-path'; 25 + const TYPE_HOSTING = 'repo:hosting'; 26 + const TYPE_PROTOCOL_HTTP = 'repo:serve-http'; 27 + const TYPE_PROTOCOL_SSH = 'repo:serve-ssh'; 28 + const TYPE_PUSH_POLICY = 'repo:push-policy'; 25 29 26 30 public function getApplicationName() { 27 31 return 'repository'; ··· 33 37 34 38 public function getApplicationTransactionCommentObject() { 35 39 return null; 40 + } 41 + 42 + public function getRequiredHandlePHIDs() { 43 + $phids = parent::getRequiredHandlePHIDs(); 44 + 45 + $old = $this->getOldValue(); 46 + $new = $this->getNewValue(); 47 + 48 + switch ($this->getTransactionType()) { 49 + case self::TYPE_PUSH_POLICY: 50 + $phids[] = $old; 51 + $phids[] = $new; 52 + break; 53 + } 54 + 55 + return $phids; 36 56 } 37 57 38 58 public function shouldHide() { ··· 285 305 $this->renderHandleLink($author_phid), 286 306 $old, 287 307 $new); 308 + case self::TYPE_HOSTING: 309 + if ($new) { 310 + return pht( 311 + '%s changed this repository to be hosted on Phabricator.', 312 + $this->renderHandleLink($author_phid)); 313 + } else { 314 + return pht( 315 + '%s changed this repository to track a remote elsewhere.', 316 + $this->renderHandleLink($author_phid)); 317 + } 318 + case self::TYPE_PROTOCOL_HTTP: 319 + return pht( 320 + '%s changed the availability of this repository over HTTP from '. 321 + '"%s" to "%s".', 322 + $this->renderHandleLink($author_phid), 323 + PhabricatorRepository::getProtocolAvailabilityName($old), 324 + PhabricatorRepository::getProtocolAvailabilityName($new)); 325 + case self::TYPE_PROTOCOL_SSH: 326 + return pht( 327 + '%s changed the availability of this repository over SSH from '. 328 + '"%s" to "%s".', 329 + $this->renderHandleLink($author_phid), 330 + PhabricatorRepository::getProtocolAvailabilityName($old), 331 + PhabricatorRepository::getProtocolAvailabilityName($new)); 332 + case self::TYPE_PUSH_POLICY: 333 + return pht( 334 + '%s changed the push policy of this repository from "%s" to "%s".', 335 + $this->renderHandleLink($author_phid), 336 + $this->renderPolicyName($old), 337 + $this->renderPolicyName($new)); 288 338 } 289 339 290 340 return parent::getTitle(); ··· 309 359 310 360 return $view->render(); 311 361 } 312 - 313 362 314 363 } 315 364
+12 -1
src/view/form/control/AphrontFormPolicyControl.php
··· 26 26 PhabricatorPolicyCapability::CAN_JOIN => pht('Joinable By'), 27 27 ); 28 28 29 - $this->setLabel(idx($labels, $this->capability, pht('Unknown Policy'))); 29 + if (isset($labels[$capability])) { 30 + $label = $labels[$capability]; 31 + } else { 32 + $capobj = PhabricatorPolicyCapability::getCapabilityByKey($capability); 33 + if ($capobj) { 34 + $label = $capobj->getCapabilityName(); 35 + } else { 36 + $label = pht('Capability "%s"', $capability); 37 + } 38 + } 39 + 40 + $this->setLabel($label); 30 41 31 42 return $this; 32 43 }