diff --git a/src/applications/diffusion/controller/base/DiffusionController.php b/src/applications/diffusion/controller/base/DiffusionController.php index b128f52dd8..a62d6bb30b 100644 --- a/src/applications/diffusion/controller/base/DiffusionController.php +++ b/src/applications/diffusion/controller/base/DiffusionController.php @@ -253,7 +253,7 @@ abstract class DiffusionController extends PhabricatorController { array( 'href' => $drequest->generateURI( array( - 'path' => null, + 'path' => '', ) + $uri_params), ), $view_name); diff --git a/src/applications/diffusion/controller/browse/DiffusionBrowseController.php b/src/applications/diffusion/controller/browse/DiffusionBrowseController.php index 2b067458f2..64e18bb43e 100644 --- a/src/applications/diffusion/controller/browse/DiffusionBrowseController.php +++ b/src/applications/diffusion/controller/browse/DiffusionBrowseController.php @@ -49,6 +49,8 @@ final class DiffusionBrowseController extends DiffusionController { } else { + $readme = null; + $phids = array(); foreach ($results as $result) { $data = $result->getLastCommitData(); @@ -57,11 +59,53 @@ final class DiffusionBrowseController extends DiffusionController { $phids[$data->getCommitDetail('authorPHID')] = true; } } - } - $phids = array_keys($phids); + $path = $result->getPath(); + if (preg_match('/^readme(|\.txt|\.remarkup)$/i', $path)) { + $readme = $result; + } + } + + $phids = array_keys($phids); $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles(); + if ($readme) { + $readme_request = DiffusionRequest::newFromDictionary( + array( + 'repository' => $drequest->getRepository(), + 'commit' => $drequest->getStableCommitName(), + 'path' => $readme->getFullPath(), + )); + + $content_query = DiffusionFileContentQuery::newFromDiffusionRequest( + $readme_request); + $content_query->loadFileContent(); + $readme_content = $content_query->getRawData(); + + if (preg_match('/.txt$/', $readme->getPath())) { + $readme_content = phutil_escape_html($readme_content); + $readme_content = nl2br($readme_content); + } else { + // Markup extensionless files as remarkup so we get links and such. + + $engine = PhabricatorMarkupEngine::newDiffusionMarkupEngine(); + $readme_content = $engine->markupText($readme_content); + + $readme_content = phutil_render_tag( + 'div', + array( + 'class' => 'phabricator-remarkup', + ), + $readme_content); + } + + $readme_panel = new AphrontPanelView(); + $readme_panel->setHeader('README'); + $readme_panel->appendChild($readme_content); + + $content[] = $readme_panel; + } + $browse_table = new DiffusionBrowseTableView(); $browse_table->setDiffusionRequest($drequest); $browse_table->setHandles($handles); diff --git a/src/applications/diffusion/controller/browse/__init__.php b/src/applications/diffusion/controller/browse/__init__.php index 7d33550a58..1e19848118 100644 --- a/src/applications/diffusion/controller/browse/__init__.php +++ b/src/applications/diffusion/controller/browse/__init__.php @@ -9,11 +9,15 @@ phutil_require_module('phabricator', 'applications/diffusion/controller/base'); phutil_require_module('phabricator', 'applications/diffusion/controller/file'); phutil_require_module('phabricator', 'applications/diffusion/query/browse/base'); +phutil_require_module('phabricator', 'applications/diffusion/query/filecontent/base'); +phutil_require_module('phabricator', 'applications/diffusion/request/base'); phutil_require_module('phabricator', 'applications/diffusion/view/browsetable'); phutil_require_module('phabricator', 'applications/diffusion/view/emptyresult'); +phutil_require_module('phabricator', 'applications/markup/engine'); phutil_require_module('phabricator', 'applications/phid/handle/data'); phutil_require_module('phabricator', 'view/layout/panel'); +phutil_require_module('phutil', 'markup'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/diffusion/query/filecontent/base/DiffusionFileContentQuery.php b/src/applications/diffusion/query/filecontent/base/DiffusionFileContentQuery.php index a159a634f5..17d7668237 100644 --- a/src/applications/diffusion/query/filecontent/base/DiffusionFileContentQuery.php +++ b/src/applications/diffusion/query/filecontent/base/DiffusionFileContentQuery.php @@ -16,41 +16,14 @@ * limitations under the License. */ -abstract class DiffusionFileContentQuery { +abstract class DiffusionFileContentQuery extends DiffusionQuery { - private $request; private $needsBlame; private $fileContent; - final private function __construct() { - // - } - final public static function newFromDiffusionRequest( DiffusionRequest $request) { - - $repository = $request->getRepository(); - - switch ($repository->getVersionControlSystem()) { - case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: - $class = 'DiffusionGitFileContentQuery'; - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: - $class = 'DiffusionMercurialFileContentQuery'; - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: - $class = 'DiffusionSvnFileContentQuery'; - break; - default: - throw new Exception("Unsupported VCS!"); - } - - PhutilSymbolLoader::loadClass($class); - $query = new $class(); - - $query->request = $request; - - return $query; + return parent::newQueryObject(__CLASS__, $request); } public function getSupportsBlameOnBlame() { @@ -63,16 +36,10 @@ abstract class DiffusionFileContentQuery { throw new Exception("Unsupported VCS!"); } - final protected function getRequest() { - return $this->request; - } - final public function loadFileContent() { $this->fileContent = $this->executeQuery(); } - abstract protected function executeQuery(); - final public function getRawData() { return $this->fileContent->getCorpus(); } diff --git a/src/applications/diffusion/query/filecontent/base/__init__.php b/src/applications/diffusion/query/filecontent/base/__init__.php index 19511645dc..cba7efae94 100644 --- a/src/applications/diffusion/query/filecontent/base/__init__.php +++ b/src/applications/diffusion/query/filecontent/base/__init__.php @@ -6,12 +6,11 @@ +phutil_require_module('phabricator', 'applications/diffusion/query/base'); phutil_require_module('phabricator', 'applications/phid/handle/data'); -phutil_require_module('phabricator', 'applications/repository/constants/repositorytype'); phutil_require_module('phabricator', 'applications/repository/storage/commit'); phutil_require_module('phabricator', 'applications/repository/storage/commitdata'); -phutil_require_module('phutil', 'symbols'); phutil_require_module('phutil', 'utils');