diff --git a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php index f80ad75057..ff0f1cb83e 100644 --- a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php +++ b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php @@ -100,7 +100,8 @@ class AphrontDefaultApplicationConfiguration '/D(?P\d+)' => 'DifferentialRevisionViewController', '/differential/' => array( '' => 'DifferentialRevisionListController', - 'filter/(?P\w+)/' => 'DifferentialRevisionListController', + 'filter/(?P\w+)/(?:(?P\w+)/)?' => + 'DifferentialRevisionListController', 'stats/(?P\w+)/' => 'DifferentialRevisionStatsController', 'diff/' => array( '(?P\d+)/' => 'DifferentialDiffViewController', diff --git a/src/applications/differential/controller/revisionlist/DifferentialRevisionListController.php b/src/applications/differential/controller/revisionlist/DifferentialRevisionListController.php index f48e260b89..4fb04347f5 100644 --- a/src/applications/differential/controller/revisionlist/DifferentialRevisionListController.php +++ b/src/applications/differential/controller/revisionlist/DifferentialRevisionListController.php @@ -19,6 +19,7 @@ class DifferentialRevisionListController extends DifferentialController { private $filter; + private $username; public function shouldRequireLogin() { return !$this->allowsAnonymousAccess(); @@ -26,6 +27,7 @@ class DifferentialRevisionListController extends DifferentialController { public function willProcessRequest(array $data) { $this->filter = idx($data, 'filter'); + $this->username = idx($data, 'username'); } public function processRequest() { @@ -33,18 +35,8 @@ class DifferentialRevisionListController extends DifferentialController { $user = $request->getUser(); $viewer_is_anonymous = !$user->isLoggedIn(); - $phid_arr = $request->getArr('view_user'); - if ($phid_arr) { - $view_target = head($phid_arr); - return id(new AphrontRedirectResponse()) - ->setURI($request->getRequestURI() - ->alter('phid', $view_target) - ->setQueryParam('view_user', null)); - } - $params = array_filter( array( - 'phid' => $request->getStr('phid'), 'status' => $request->getStr('status'), 'order' => $request->getStr('order'), )); @@ -56,9 +48,35 @@ class DifferentialRevisionListController extends DifferentialController { $this->filter, $default_filter); + // Redirect from search to canonical URL. + $phid_arr = $request->getArr('view_user'); + if ($phid_arr) { + $view_user = id(new PhabricatorUser()) + ->loadOneWhere('phid = %s', head($phid_arr)); + if (!$view_user) { + return new Aphront404Response(); + } + $uri = id(new PhutilURI('/differential/filter/'.$this->filter.'/'. + phutil_escape_uri($view_user->getUserName()).'/')) + ->setQueryParams($params); + return id(new AphrontRedirectResponse())->setURI($uri); + } + $uri = new PhutilURI('/differential/filter/'.$this->filter.'/'); $uri->setQueryParams($params); + $username = ''; + if ($this->username) { + $view_user = id(new PhabricatorUser()) + ->loadOneWhere('userName = %s', $this->username); + if (!$view_user) { + return new Aphront404Response(); + } + $username = phutil_escape_uri($this->username).'/'; + $uri->setPath('/differential/filter/'.$this->filter.'/'.$username); + $params['phid'] = $view_user->getPHID(); + } + // Fill in the defaults we'll actually use for calculations if any // parameters are missing. $params += array( @@ -72,7 +90,7 @@ class DifferentialRevisionListController extends DifferentialController { list($filter_name, $display_name) = $filter; if ($filter_name) { $href = clone $uri; - $href->setPath('/differential/filter/'.$filter_name.'/'); + $href->setPath('/differential/filter/'.$filter_name.'/'.$username); if ($filter_name == $this->filter) { $class = 'aphront-side-nav-selected'; } else { diff --git a/src/applications/differential/controller/revisionlist/__init__.php b/src/applications/differential/controller/revisionlist/__init__.php index a0972ce79f..202761bb78 100644 --- a/src/applications/differential/controller/revisionlist/__init__.php +++ b/src/applications/differential/controller/revisionlist/__init__.php @@ -6,10 +6,12 @@ +phutil_require_module('phabricator', 'aphront/response/404'); phutil_require_module('phabricator', 'aphront/response/redirect'); phutil_require_module('phabricator', 'applications/differential/controller/base'); phutil_require_module('phabricator', 'applications/differential/query/revision'); phutil_require_module('phabricator', 'applications/differential/view/revisionlist'); +phutil_require_module('phabricator', 'applications/people/storage/user'); phutil_require_module('phabricator', 'applications/phid/handle/data'); phutil_require_module('phabricator', 'view/control/pager'); phutil_require_module('phabricator', 'view/form/base'); diff --git a/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php b/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php index 43369cea89..066c9448bc 100644 --- a/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php +++ b/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php @@ -45,9 +45,10 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { if (!$profile) { $profile = new PhabricatorUserProfile(); } + $username = phutil_escape_uri($user->getUserName()); $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI(new PhutilURI('/p/'.$user->getUserName().'/')); + $nav->setBaseURI(new PhutilURI('/p/'.$username.'/')); $nav->addFilter('feed', 'Feed'); $nav->addFilter('about', 'About'); @@ -58,7 +59,7 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { $nav->addFilter( null, "Revisions {$external_arrow}", - '/differential/filter/revisions/?phid='.$user->getPHID()); + '/differential/filter/revisions/'.$username.'/'); $nav->addFilter( null, @@ -68,7 +69,7 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { $nav->addFilter( null, "Commits {$external_arrow}", - '/audit/view/author/'.phutil_escape_uri($user->getUserName()).'/'); + '/audit/view/author/'.$username.'/'); $oauths = id(new PhabricatorUserOAuthInfo())->loadAllWhere( 'userID = %d',