diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index deb788f089..f4c439d217 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -309,6 +309,7 @@ phutil_register_library_map(array( 'DifferentialBranchFieldSpecification' => 'applications/differential/field/specification/DifferentialBranchFieldSpecification.php', 'DifferentialCCWelcomeMail' => 'applications/differential/mail/DifferentialCCWelcomeMail.php', 'DifferentialCCsFieldSpecification' => 'applications/differential/field/specification/DifferentialCCsFieldSpecification.php', + 'DifferentialCapabilityDefaultView' => 'applications/differential/capability/DifferentialCapabilityDefaultView.php', 'DifferentialChangeType' => 'applications/differential/constants/DifferentialChangeType.php', 'DifferentialChangeset' => 'applications/differential/storage/DifferentialChangeset.php', 'DifferentialChangesetDetailView' => 'applications/differential/view/DifferentialChangesetDetailView.php', @@ -2410,6 +2411,7 @@ phutil_register_library_map(array( 'DifferentialBranchFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail', 'DifferentialCCsFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialCapabilityDefaultView' => 'PhabricatorPolicyCapability', 'DifferentialChangeset' => 'DifferentialDAO', 'DifferentialChangesetDetailView' => 'AphrontView', 'DifferentialChangesetHTMLRenderer' => 'DifferentialChangesetRenderer', diff --git a/src/applications/differential/application/PhabricatorApplicationDifferential.php b/src/applications/differential/application/PhabricatorApplicationDifferential.php index 3fa471c9ab..e5a013aad1 100644 --- a/src/applications/differential/application/PhabricatorApplicationDifferential.php +++ b/src/applications/differential/application/PhabricatorApplicationDifferential.php @@ -118,5 +118,14 @@ final class PhabricatorApplicationDifferential extends PhabricatorApplication { return $status; } + protected function getCustomCapabilities() { + return array( + DifferentialCapabilityDefaultView::CAPABILITY => array( + 'caption' => pht( + 'Default view policy for newly created revisions.') + ), + ); + } + } diff --git a/src/applications/differential/capability/DifferentialCapabilityDefaultView.php b/src/applications/differential/capability/DifferentialCapabilityDefaultView.php new file mode 100644 index 0000000000..c33fdc7a03 --- /dev/null +++ b/src/applications/differential/capability/DifferentialCapabilityDefaultView.php @@ -0,0 +1,16 @@ +getValue('revision_id'); + $viewer = $request->getUser(); if ($id) { $revision = id(new DifferentialRevisionQuery()) ->withIDs(array($id)) - ->setViewer($request->getUser()) + ->setViewer($viewer) ->needRelationships(true) ->needReviewerStatus(true) ->executeOne(); @@ -43,8 +44,7 @@ final class ConduitAPI_differential_getcommitmessage_Method throw new ConduitException('ERR_NOT_FOUND'); } } else { - $revision = new DifferentialRevision(); - $revision->attachRelationships(array()); + $revision = DifferentialRevision::initializeNewRevision($viewer); } @@ -57,7 +57,7 @@ final class ConduitAPI_differential_getcommitmessage_Method $pro_tips = array(); foreach ($aux_fields as $key => $aux_field) { - $aux_field->setUser($request->getUser()); + $aux_field->setUser($viewer); $aux_field->setRevision($revision); $pro_tips[] = $aux_field->getCommitMessageTips(); if (!$aux_field->shouldAppearOnCommitMessage()) { diff --git a/src/applications/differential/controller/DifferentialRevisionEditController.php b/src/applications/differential/controller/DifferentialRevisionEditController.php index ed4886643c..a136274dea 100644 --- a/src/applications/differential/controller/DifferentialRevisionEditController.php +++ b/src/applications/differential/controller/DifferentialRevisionEditController.php @@ -32,8 +32,7 @@ final class DifferentialRevisionEditController extends DifferentialController { return new Aphront404Response(); } } else { - $revision = new DifferentialRevision(); - $revision->attachRelationships(array()); + $revision = DifferentialRevision::initializeNewRevision($viewer); } $aux_fields = $this->loadAuxiliaryFields($revision); diff --git a/src/applications/differential/editor/DifferentialRevisionEditor.php b/src/applications/differential/editor/DifferentialRevisionEditor.php index bfa438e1b6..b79bcf7ce9 100644 --- a/src/applications/differential/editor/DifferentialRevisionEditor.php +++ b/src/applications/differential/editor/DifferentialRevisionEditor.php @@ -40,10 +40,8 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { DifferentialDiff $diff, PhabricatorUser $actor) { - $revision = new DifferentialRevision(); + $revision = DifferentialRevision::initializeNewRevision($actor); $revision->setPHID($revision->generatePHID()); - $revision->setAuthorPHID($actor->getPHID()); - $revision->setStatus(ArcanistDifferentialRevisionStatus::NEEDS_REVIEW); $editor = new DifferentialRevisionEditor($revision); $editor->setActor($actor); @@ -168,9 +166,6 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { $revision = $this->getRevision(); $is_new = $this->isNewRevision(); - if ($is_new) { - $this->initializeNewRevision($revision); - } $revision->loadRelationships(); @@ -1101,29 +1096,6 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { } } - private function initializeNewRevision(DifferentialRevision $revision) { - // These fields aren't nullable; set them to sensible defaults if they - // haven't been configured. We're just doing this so we can generate an - // ID for the revision if we don't have one already. - $revision->setLineCount(0); - if ($revision->getStatus() === null) { - $revision->setStatus(ArcanistDifferentialRevisionStatus::NEEDS_REVIEW); - } - if ($revision->getTitle() === null) { - $revision->setTitle('Untitled Revision'); - } - if ($revision->getAuthorPHID() === null) { - $revision->setAuthorPHID($this->getActorPHID()); - } - if ($revision->getSummary() === null) { - $revision->setSummary(''); - } - if ($revision->getTestPlan() === null) { - $revision->setTestPlan(''); - } - } - - /** * Try to move a revision to "accepted". We look for: * diff --git a/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php b/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php index 627e9251dd..853934a63d 100644 --- a/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php +++ b/src/applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php @@ -6,7 +6,7 @@ final class PhabricatorDifferentialRevisionTestDataGenerator public function generate() { $author = $this->loadPhabrictorUser(); $authorPHID = $author->getPHID(); - $revision = new DifferentialRevision(); + $revision = DifferentialRevision::initializeNewRevision($author); $revision->setTitle($this->generateTitle()); $revision->setSummary($this->generateDescription()); $revision->setTestPlan($this->generateDescription()); diff --git a/src/applications/differential/storage/DifferentialRevision.php b/src/applications/differential/storage/DifferentialRevision.php index cf50fba48f..3e12ad9e28 100644 --- a/src/applications/differential/storage/DifferentialRevision.php +++ b/src/applications/differential/storage/DifferentialRevision.php @@ -6,12 +6,12 @@ final class DifferentialRevision extends DifferentialDAO PhabricatorPolicyInterface, PhrequentTrackableInterface { - protected $title; + protected $title = ''; protected $originalTitle; protected $status; - protected $summary; - protected $testPlan; + protected $summary = ''; + protected $testPlan = ''; protected $phid; protected $authorPHID; @@ -19,7 +19,7 @@ final class DifferentialRevision extends DifferentialDAO protected $dateCommitted; - protected $lineCount; + protected $lineCount = 0; protected $attached = array(); protected $mailKey; @@ -44,6 +44,22 @@ final class DifferentialRevision extends DifferentialDAO const RELATION_REVIEWER = 'revw'; const RELATION_SUBSCRIBED = 'subd'; + public static function initializeNewRevision(PhabricatorUser $actor) { + $app = id(new PhabricatorApplicationQuery()) + ->setViewer($actor) + ->withClasses(array('PhabricatorApplicationDifferential')) + ->executeOne(); + + $view_policy = $app->getPolicy( + DifferentialCapabilityDefaultView::CAPABILITY); + + return id(new DifferentialRevision()) + ->setViewPolicy($view_policy) + ->setAuthorPHID($actor->getPHID()) + ->attachRelationships(array()) + ->setStatus(ArcanistDifferentialRevisionStatus::NEEDS_REVIEW); + } + public function getConfiguration() { return array( self::CONFIG_AUX_PHID => true,