diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index b2c44618d0..f69a76d94f 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -504,6 +504,7 @@ phutil_register_library_map(array( 'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php', 'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php', 'DiffusionRepositoryCreateController' => 'applications/diffusion/controller/DiffusionRepositoryCreateController.php', + 'DiffusionRepositoryEditActionsController' => 'applications/diffusion/controller/DiffusionRepositoryEditActionsController.php', 'DiffusionRepositoryEditActivateController' => 'applications/diffusion/controller/DiffusionRepositoryEditActivateController.php', 'DiffusionRepositoryEditBasicController' => 'applications/diffusion/controller/DiffusionRepositoryEditBasicController.php', 'DiffusionRepositoryEditBranchesController' => 'applications/diffusion/controller/DiffusionRepositoryEditBranchesController.php', @@ -2677,6 +2678,7 @@ phutil_register_library_map(array( 'DiffusionRemarkupRule' => 'PhabricatorRemarkupRuleObject', 'DiffusionRepositoryController' => 'DiffusionController', 'DiffusionRepositoryCreateController' => 'DiffusionController', + 'DiffusionRepositoryEditActionsController' => 'DiffusionController', 'DiffusionRepositoryEditActivateController' => 'DiffusionController', 'DiffusionRepositoryEditBasicController' => 'DiffusionController', 'DiffusionRepositoryEditBranchesController' => 'DiffusionController', diff --git a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php index 09d00acad9..8bf0ada033 100644 --- a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php +++ b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php @@ -71,6 +71,7 @@ final class PhabricatorApplicationDiffusion extends PhabricatorApplication { 'policy/' => 'DiffusionRepositoryEditPolicyController', 'branches/' => 'DiffusionRepositoryEditBranchesController', 'subversion/' => 'DiffusionRepositoryEditSubversionController', + 'actions/' => 'DiffusionRepositoryEditActionsController', ), ), 'inline/' => array( diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditActionsController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditActionsController.php new file mode 100644 index 0000000000..7260935c12 --- /dev/null +++ b/src/applications/diffusion/controller/DiffusionRepositoryEditActionsController.php @@ -0,0 +1,126 @@ +getRequest(); + $viewer = $request->getUser(); + $drequest = $this->diffusionRequest; + $repository = $drequest->getRepository(); + + $repository = id(new PhabricatorRepositoryQuery()) + ->setViewer($viewer) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) + ->withIDs(array($repository->getID())) + ->executeOne(); + + if (!$repository) { + return new Aphront404Response(); + } + + $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); + + // NOTE: We're inverting these here, because the storage is silly. + $v_notify = !$repository->getHumanReadableDetail('herald-disabled'); + $v_autoclose = !$repository->getHumanReadableDetail('disable-autoclose'); + + if ($request->isFormPost()) { + $v_notify = $request->getBool('notify'); + $v_autoclose = $request->getBool('autoclose'); + + $xactions = array(); + $template = id(new PhabricatorRepositoryTransaction()); + + $type_notify = PhabricatorRepositoryTransaction::TYPE_NOTIFY; + $type_autoclose = PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE; + + $xactions[] = id(clone $template) + ->setTransactionType($type_notify) + ->setNewValue($v_notify); + + $xactions[] = id(clone $template) + ->setTransactionType($type_autoclose) + ->setNewValue($v_autoclose); + + id(new PhabricatorRepositoryEditor()) + ->setContinueOnNoEffect(true) + ->setContentSourceFromRequest($request) + ->setActor($viewer) + ->applyTransactions($repository, $xactions); + + return id(new AphrontRedirectResponse())->setURI($edit_uri); + } + + $content = array(); + + $crumbs = $this->buildCrumbs(); + $crumbs->addCrumb( + id(new PhabricatorCrumbView()) + ->setName(pht('Edit Actions'))); + + $title = pht('Edit Actions (%s)', $repository->getName()); + + $policies = id(new PhabricatorPolicyQuery()) + ->setViewer($viewer) + ->setObject($repository) + ->execute(); + + $form = id(new AphrontFormView()) + ->setUser($viewer) + ->appendRemarkupInstructions( + pht( + "Normally, Phabricator publishes notifications when it discovers ". + "new commits. You can disable publishing for this repository by ". + "turning off **Notify/Publish**. This will disable notifications, ". + "feed, and Herald for this repository.". + "\n\n". + "When Phabricator discovers a new commit, it can automatically ". + "close associated revisions and tasks. If you don't want ". + "Phabricator to close objects when it discovers new commits in ". + "this repository, you can disable **Autoclose**.")) + ->appendChild( + id(new AphrontFormSelectControl()) + ->setName('notify') + ->setLabel(pht('Notify/Publish')) + ->setValue((int)$v_notify) + ->setOptions( + array( + 1 => pht('Enable Notifications, Feed and Herald'), + 0 => pht('Disable Notifications, Feed and Herald'), + ))) + ->appendChild( + id(new AphrontFormSelectControl()) + ->setName('autoclose') + ->setLabel(pht('Autoclose')) + ->setValue((int)$v_autoclose) + ->setOptions( + array( + 1 => pht('Enable Autoclose'), + 0 => pht('Disable Autoclose'), + ))) + ->appendChild( + id(new AphrontFormSubmitControl()) + ->setValue(pht('Save Actions')) + ->addCancelButton($edit_uri)); + + $form_box = id(new PHUIObjectBoxView()) + ->setHeaderText($title) + ->setForm($form); + + return $this->buildApplicationPage( + array( + $crumbs, + $form_box, + ), + array( + 'title' => $title, + 'device' => true, + )); + } + +} diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditController.php index 752d1406c8..fdbd5cf777 100644 --- a/src/applications/diffusion/controller/DiffusionRepositoryEditController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryEditController.php @@ -68,6 +68,10 @@ final class DiffusionRepositoryEditController extends DiffusionController { $this->buildSubversionActions($repository)); } + $actions_properties = $this->buildActionsProperties( + $repository, + $this->buildActionsActions($repository)); + $xactions = id(new PhabricatorRepositoryTransactionQuery()) ->setViewer($user) ->withObjectPHIDs(array($repository->getPHID())) @@ -104,6 +108,8 @@ final class DiffusionRepositoryEditController extends DiffusionController { $obj_box->addPropertyList($subversion_properties); } + $obj_box->addPropertyList($actions_properties); + return $this->buildApplicationPage( array( $crumbs, @@ -389,4 +395,54 @@ final class DiffusionRepositoryEditController extends DiffusionController { return $view; } + private function buildActionsActions(PhabricatorRepository $repository) { + $viewer = $this->getRequest()->getUser(); + + $view = id(new PhabricatorActionListView()) + ->setObjectURI($this->getRequest()->getRequestURI()) + ->setUser($viewer); + + $can_edit = PhabricatorPolicyFilter::hasCapability( + $viewer, + $repository, + PhabricatorPolicyCapability::CAN_EDIT); + + $edit = id(new PhabricatorActionView()) + ->setIcon('edit') + ->setName(pht('Edit Actions')) + ->setHref( + $this->getRepositoryControllerURI($repository, 'edit/actions/')) + ->setWorkflow(!$can_edit) + ->setDisabled(!$can_edit); + $view->addAction($edit); + + return $view; + } + + private function buildActionsProperties( + PhabricatorRepository $repository, + PhabricatorActionListView $actions) { + + $viewer = $this->getRequest()->getUser(); + + $view = id(new PHUIPropertyListView()) + ->setUser($viewer) + ->setActionList($actions) + ->addSectionHeader(pht('Actions')); + + $notify = $repository->getDetail('herald-disabled') + ? pht('Off') + : pht('On'); + $notify = phutil_tag('em', array(), $notify); + $view->addProperty(pht('Publish/Notify'), $notify); + + $autoclose = $repository->getDetail('disable-autoclose') + ? pht('Off') + : pht('On'); + $autoclose = phutil_tag('em', array(), $autoclose); + $view->addProperty(pht('Autoclose'), $autoclose); + + return $view; + } + } diff --git a/src/applications/repository/editor/PhabricatorRepositoryEditor.php b/src/applications/repository/editor/PhabricatorRepositoryEditor.php index 5683c2e20f..4c813467c7 100644 --- a/src/applications/repository/editor/PhabricatorRepositoryEditor.php +++ b/src/applications/repository/editor/PhabricatorRepositoryEditor.php @@ -15,6 +15,8 @@ final class PhabricatorRepositoryEditor $types[] = PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY; $types[] = PhabricatorRepositoryTransaction::TYPE_UUID; $types[] = PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH; + $types[] = PhabricatorRepositoryTransaction::TYPE_NOTIFY; + $types[] = PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE; $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; @@ -44,6 +46,10 @@ final class PhabricatorRepositoryEditor return $object->getUUID(); case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: return $object->getDetail('svn-subpath'); + case PhabricatorRepositoryTransaction::TYPE_NOTIFY: + return (int)!$object->getDetail('herald-disabled'); + case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: + return (int)!$object->getDetail('disable-autoclose'); } } @@ -62,6 +68,9 @@ final class PhabricatorRepositoryEditor case PhabricatorRepositoryTransaction::TYPE_UUID: case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: return $xaction->getNewValue(); + case PhabricatorRepositoryTransaction::TYPE_NOTIFY: + case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: + return (int)$xaction->getNewValue(); } } @@ -98,6 +107,12 @@ final class PhabricatorRepositoryEditor case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: $object->setDetail('svn-subpath', $xaction->getNewValue()); break; + case PhabricatorRepositoryTransaction::TYPE_NOTIFY: + $object->setDetail('herald-disabled', (int)!$xaction->getNewValue()); + break; + case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: + $object->setDetail('disable-autoclose', (int)!$xaction->getNewValue()); + break; case PhabricatorRepositoryTransaction::TYPE_ENCODING: // Make sure the encoding is valid by converting to UTF-8. This tests // that the user has mbstring installed, and also that they didn't type diff --git a/src/applications/repository/storage/PhabricatorRepositoryTransaction.php b/src/applications/repository/storage/PhabricatorRepositoryTransaction.php index 5bd7957753..a3a4cb54ef 100644 --- a/src/applications/repository/storage/PhabricatorRepositoryTransaction.php +++ b/src/applications/repository/storage/PhabricatorRepositoryTransaction.php @@ -12,6 +12,8 @@ final class PhabricatorRepositoryTransaction const TYPE_AUTOCLOSE_ONLY = 'repo:autoclose-only'; const TYPE_SVN_SUBPATH = 'repo:svn-subpath'; const TYPE_UUID = 'repo:uuid'; + const TYPE_NOTIFY = 'repo:notify'; + const TYPE_AUTOCLOSE = 'repo:autoclose'; public function getApplicationName() { return 'repository'; @@ -163,6 +165,29 @@ final class PhabricatorRepositoryTransaction $new); } break; + case self::TYPE_NOTIFY: + if ($new) { + return pht( + '%s enabled notifications and publishing for this repository.', + $this->renderHandleLink($author_phid)); + } else { + return pht( + '%s disabled notifications and publishing for this repository.', + $this->renderHandleLink($author_phid)); + } + break; + case self::TYPE_AUTOCLOSE: + if ($new) { + return pht( + '%s enabled autoclose for this repository.', + $this->renderHandleLink($author_phid)); + } else { + return pht( + '%s disabled autoclose for this repository.', + $this->renderHandleLink($author_phid)); + } + break; + } return parent::getTitle();