diff --git a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php --- a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php +++ b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php @@ -64,7 +64,7 @@ '(?:query/(?P[^/]+)/)?' => 'DiffusionPushLogListController', 'view/(?P\d+)/' => 'DiffusionPushEventViewController', ), - '(?P(?P[A-Z]+))/' => array( + '(?P[A-Z]+)/' => array( '' => 'DiffusionRepositoryController', 'repository/(?P.*)' => 'DiffusionRepositoryController', @@ -115,7 +115,8 @@ // catch-all for serving repositories over HTTP. We must accept // requests without the trailing "/" because SVN commands don't // necessarily include it. - '(?P[A-Z]+)(/|$).*' => 'DiffusionRepositoryDefaultController', + '(?P[A-Z]+)(?:/.*)?' => + 'DiffusionRepositoryDefaultController', 'inline/' => array( 'edit/(?P[^/]+)/' => 'DiffusionInlineCommentController', diff --git a/src/applications/diffusion/controller/DiffusionController.php b/src/applications/diffusion/controller/DiffusionController.php --- a/src/applications/diffusion/controller/DiffusionController.php +++ b/src/applications/diffusion/controller/DiffusionController.php @@ -2,56 +2,34 @@ abstract class DiffusionController extends PhabricatorController { - protected $diffusionRequest; - - public function setDiffusionRequest(DiffusionRequest $request) { - $this->diffusionRequest = $request; - return $this; - } + private $diffusionRequest; protected function getDiffusionRequest() { if (!$this->diffusionRequest) { - throw new Exception(pht('No Diffusion request object!')); + throw new PhutilInvalidStateException('loadDiffusionContext'); } return $this->diffusionRequest; } + protected function hasDiffusionRequest() { + return (bool)$this->diffusionRequest; + } + public function willBeginExecution() { $request = $this->getRequest(); // Check if this is a VCS request, e.g. from "git clone", "hg clone", or // "svn checkout". If it is, we jump off into repository serving code to // process the request. - if (DiffusionServeController::isVCSRequest($request)) { - $serve_controller = id(new DiffusionServeController()) - ->setCurrentApplication($this->getCurrentApplication()); + + $serve_controller = new DiffusionServeController(); + if ($serve_controller->isVCSRequest($request)) { return $this->delegateToController($serve_controller); } return parent::willBeginExecution(); } - protected function shouldLoadDiffusionRequest() { - return true; - } - - public function handleRequest(AphrontRequest $request) { - if ($request->getURIData('callsign') && - $this->shouldLoadDiffusionRequest()) { - try { - $drequest = DiffusionRequest::newFromAphrontRequestDictionary( - $request->getURIMap(), - $request); - } catch (Exception $ex) { - return id(new Aphront404Response()) - ->setRequest($request); - } - $this->setDiffusionRequest($drequest); - } - - return $this->processDiffusionRequest($request); - } - protected function loadDiffusionContextForEdit() { return $this->loadContext( array( @@ -103,11 +81,12 @@ return $identifier; } - return (int)$request->getURIData('repositoryID'); - } + $id = $request->getURIData('repositoryID'); + if (strlen($id)) { + return (int)$id; + } - protected function processDiffusionRequest(AphrontRequest $request) { - throw new PhutilMethodNotImplementedException(); + return null; } public function buildCrumbs(array $spec = array()) { diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditController.php --- a/src/applications/diffusion/controller/DiffusionRepositoryEditController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryEditController.php @@ -6,8 +6,9 @@ protected function buildApplicationCrumbs($is_main = false) { $crumbs = parent::buildApplicationCrumbs(); - if ($this->diffusionRequest) { - $repository = $this->getDiffusionRequest()->getRepository(); + if ($this->hasDiffusionRequest()) { + $drequest = $this->getDiffusionRequest(); + $repository = $drequest->getRepository(); $repo_uri = $repository->getURI(); $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/'); diff --git a/src/applications/diffusion/controller/DiffusionServeController.php b/src/applications/diffusion/controller/DiffusionServeController.php --- a/src/applications/diffusion/controller/DiffusionServeController.php +++ b/src/applications/diffusion/controller/DiffusionServeController.php @@ -2,12 +2,9 @@ final class DiffusionServeController extends DiffusionController { - protected function shouldLoadDiffusionRequest() { - return false; - } - - public static function isVCSRequest(AphrontRequest $request) { - if (!self::getCallsign($request)) { + public function isVCSRequest(AphrontRequest $request) { + $identifier = $this->getRepositoryIdentifierFromRequest($request); + if ($identifier === null) { return null; } @@ -47,20 +44,8 @@ return $vcs; } - private static function getCallsign(AphrontRequest $request) { - $uri = $request->getRequestURI(); - - $regex = '@^/diffusion/(?P[A-Z]+)(/|$)@'; - $matches = null; - if (!preg_match($regex, (string)$uri, $matches)) { - return null; - } - - return $matches['callsign']; - } - - protected function processDiffusionRequest(AphrontRequest $request) { - $callsign = self::getCallsign($request); + public function handleRequest(AphrontRequest $request) { + $identifier = $this->getRepositoryIdentifierFromRequest($request); // If authentication credentials have been provided, try to find a user // that actually matches those credentials. @@ -99,7 +84,7 @@ try { $repository = id(new PhabricatorRepositoryQuery()) ->setViewer($viewer) - ->withCallsigns(array($callsign)) + ->withIdentifiers(array($identifier)) ->executeOne(); if (!$repository) { return new PhabricatorVCSResponse( diff --git a/src/applications/diffusion/request/DiffusionRequest.php b/src/applications/diffusion/request/DiffusionRequest.php --- a/src/applications/diffusion/request/DiffusionRequest.php +++ b/src/applications/diffusion/request/DiffusionRequest.php @@ -117,43 +117,6 @@ return $object; } - - /** - * Create a new request from an Aphront request dictionary. This is an - * internal method that you generally should not call directly; instead, - * call @{method:newFromDictionary}. - * - * @param map Map of Aphront request data. - * @return DiffusionRequest New request object. - * @task new - */ - final public static function newFromAphrontRequestDictionary( - array $data, - AphrontRequest $request) { - - $identifier = phutil_unescape_uri_path_component(idx($data, 'callsign')); - $object = self::newFromIdentifier($identifier, $request->getUser()); - - $use_branches = $object->supportsBranches(); - - if (isset($data['dblob'])) { - $parsed = self::parseRequestBlob(idx($data, 'dblob'), $use_branches); - } else { - $parsed = array( - 'commit' => idx($data, 'commit'), - 'path' => idx($data, 'path'), - 'line' => idx($data, 'line'), - 'branch' => idx($data, 'branch'), - ); - } - - $object->setUser($request->getUser()); - $object->initializeFromDictionary($parsed); - $object->lint = $request->getStr('lint'); - return $object; - } - - /** * Internal. *