Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13959129
D11099.id26643.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
15 KB
Referenced Files
None
Subscribers
None
D11099.id26643.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -542,7 +542,7 @@
'DiffusionQueryPathsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryPathsConduitAPIMethod.php',
'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionRawDiffQuery.php',
'DiffusionRawDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRawDiffQueryConduitAPIMethod.php',
- 'DiffusionReadmeQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionReadmeQueryConduitAPIMethod.php',
+ 'DiffusionReadmeView' => 'applications/diffusion/view/DiffusionReadmeView.php',
'DiffusionRefNotFoundException' => 'applications/diffusion/exception/DiffusionRefNotFoundException.php',
'DiffusionRefsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRefsQueryConduitAPIMethod.php',
'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php',
@@ -3572,7 +3572,7 @@
'DiffusionQueryPathsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
'DiffusionRawDiffQuery' => 'DiffusionQuery',
'DiffusionRawDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
- 'DiffusionReadmeQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
+ 'DiffusionReadmeView' => 'DiffusionView',
'DiffusionRefNotFoundException' => 'Exception',
'DiffusionRefsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
'DiffusionRepositoryController' => 'DiffusionController',
diff --git a/src/applications/diffusion/conduit/DiffusionReadmeQueryConduitAPIMethod.php b/src/applications/diffusion/conduit/DiffusionReadmeQueryConduitAPIMethod.php
deleted file mode 100644
--- a/src/applications/diffusion/conduit/DiffusionReadmeQueryConduitAPIMethod.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-
-final class DiffusionReadmeQueryConduitAPIMethod
- extends DiffusionQueryConduitAPIMethod {
-
- public function getAPIMethodName() {
- return 'diffusion.readmequery';
- }
-
- public function getMethodDescription() {
- return
- pht('Retrieve any "readme" that can be found for a set of paths in '.
- 'repository.');
- }
-
- public function defineReturnType() {
- return 'string';
- }
-
- protected function defineCustomParamTypes() {
- return array(
- 'paths' => 'required array <string>',
- 'commit' => 'optional string',
- );
- }
-
- protected function getResult(ConduitAPIRequest $request) {
- $drequest = $this->getDiffusionRequest();
- $path_dicts = $request->getValue('paths', array());
- $paths = array();
- foreach ($path_dicts as $dict) {
- $paths[] = DiffusionRepositoryPath::newFromDictionary($dict);
- }
-
- $best = -1;
- $readme = '';
- $best_render_type = 'plain';
- foreach ($paths as $result_path) {
- $file_type = $result_path->getFileType();
- if (($file_type != ArcanistDiffChangeType::FILE_NORMAL) &&
- ($file_type != ArcanistDiffChangeType::FILE_TEXT)) {
- // Skip directories, etc.
- continue;
- }
-
- $path = strtolower($result_path->getPath());
-
- if ($path === 'readme') {
- $path .= '.remarkup';
- }
-
- if (strncmp($path, 'readme.', 7) !== 0) {
- continue;
- }
-
- $priority = 0;
- switch (substr($path, 7)) {
- case 'remarkup':
- $priority = 100;
- $render_type = 'remarkup';
- break;
- case 'rainbow':
- $priority = 90;
- $render_type = 'rainbow';
- break;
- case 'md':
- $priority = 50;
- $render_type = 'remarkup';
- break;
- case 'txt':
- $priority = 10;
- $render_type = 'plain';
- break;
- default:
- $priority = 0;
- $render_type = 'plain';
- break;
- }
-
- if ($priority > $best) {
- $best = $priority;
- $readme = $result_path;
- $best_render_type = $render_type;
- }
- }
-
- if (!$readme) {
- return '';
- }
-
- $readme_request = DiffusionRequest::newFromDictionary(
- array(
- 'user' => $request->getUser(),
- 'repository' => $drequest->getRepository(),
- 'commit' => $drequest->getStableCommit(),
- 'path' => $readme->getFullPath(),
- ));
-
- $file_content = DiffusionFileContent::newFromConduit(
- DiffusionQuery::callConduitWithDiffusionRequest(
- $request->getUser(),
- $readme_request,
- 'diffusion.filecontentquery',
- array(
- 'commit' => $drequest->getStableCommit(),
- 'path' => $readme->getFullPath(),
- 'needsBlame' => false,
- )));
- $readme_content = $file_content->getCorpus();
-
- switch ($best_render_type) {
- case 'plain':
- $readme_content = phutil_escape_html_newlines($readme_content);
- $class = null;
- break;
- case 'rainbow':
- $highlighter = new PhutilRainbowSyntaxHighlighter();
- $readme_content = $highlighter
- ->getHighlightFuture($readme_content)
- ->resolve();
- $readme_content = phutil_escape_html_newlines($readme_content);
-
- require_celerity_resource('syntax-highlighting-css');
- $class = 'remarkup-code';
- break;
- case 'remarkup':
- // TODO: This is sketchy, but make sure we hit the markup cache.
- $markup_object = id(new PhabricatorMarkupOneOff())
- ->setEngineRuleset('diffusion-readme')
- ->setContent($readme_content);
- $markup_field = 'default';
-
- $readme_content = id(new PhabricatorMarkupEngine())
- ->setViewer($request->getUser())
- ->addObject($markup_object, $markup_field)
- ->process()
- ->getOutput($markup_object, $markup_field);
-
- $engine = $markup_object->newMarkupEngine($markup_field);
- $toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
- if ($toc) {
- $toc = phutil_tag_div(
- 'phabricator-remarkup-toc',
- array(
- phutil_tag_div(
- 'phabricator-remarkup-toc-header',
- pht('Table of Contents')),
- $toc,
- ));
- $readme_content = array($toc, $readme_content);
- }
-
- $class = 'phabricator-remarkup';
- break;
- }
-
- $readme_content = phutil_tag(
- 'div',
- array(
- 'class' => $class,
- ),
- $readme_content);
-
- return $readme_content;
- }
-
-}
diff --git a/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php b/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php
--- a/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php
@@ -66,22 +66,21 @@
$content[] = $this->buildOpenRevisions();
- $readme = $this->callConduitWithDiffusionRequest(
- 'diffusion.readmequery',
- array(
- 'paths' => $results->getPathDicts(),
- 'commit' => $drequest->getStableCommit(),
- ));
- if ($readme) {
- $box = new PHUIBoxView();
- $box->appendChild($readme);
- $box->addPadding(PHUI::PADDING_LARGE);
- $object_box = id(new PHUIObjectBoxView())
- ->setHeaderText(pht('README'))
- ->appendChild($box);
-
- $content[] = $object_box;
+ $readme_path = $results->getReadmePath();
+ if ($readme_path) {
+ $readme_content = $this->callConduitWithDiffusionRequest(
+ 'diffusion.filecontentquery',
+ array(
+ 'path' => $readme_path,
+ 'commit' => $drequest->getStableCommit(),
+ ));
+ if ($readme_content) {
+ $content[] = id(new DiffusionReadmeView())
+ ->setUser($this->getViewer())
+ ->setPath($readme_path)
+ ->setContent($readme_content['corpus']);
+ }
}
$crumbs = $this->buildCrumbs(
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php
--- a/src/applications/diffusion/controller/DiffusionRepositoryController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php
@@ -151,15 +151,23 @@
$phids = array_keys($phids);
$handles = $this->loadViewerHandles($phids);
+ $readme = null;
if ($browse_results) {
- $readme = $this->callConduitWithDiffusionRequest(
- 'diffusion.readmequery',
- array(
- 'paths' => $browse_results->getPathDicts(),
- 'commit' => $drequest->getStableCommit(),
- ));
- } else {
- $readme = null;
+ $readme_path = $browse_results->getReadmePath();
+ if ($readme_path) {
+ $readme_content = $this->callConduitWithDiffusionRequest(
+ 'diffusion.filecontentquery',
+ array(
+ 'path' => $readme_path,
+ 'commit' => $drequest->getStableCommit(),
+ ));
+ if ($readme_content) {
+ $readme = id(new DiffusionReadmeView())
+ ->setUser($this->getViewer())
+ ->setPath($readme_path)
+ ->setContent($readme_content['corpus']);
+ }
+ }
}
$content[] = $this->buildBrowseTable(
@@ -195,14 +203,7 @@
}
if ($readme) {
- $box = new PHUIBoxView();
- $box->appendChild($readme);
- $box->addPadding(PHUI::PADDING_LARGE);
-
- $panel = new PHUIObjectBoxView();
- $panel->setHeaderText(pht('README'));
- $panel->appendChild($box);
- $content[] = $panel;
+ $content[] = $readme;
}
return $content;
diff --git a/src/applications/diffusion/data/DiffusionBrowseResultSet.php b/src/applications/diffusion/data/DiffusionBrowseResultSet.php
--- a/src/applications/diffusion/data/DiffusionBrowseResultSet.php
+++ b/src/applications/diffusion/data/DiffusionBrowseResultSet.php
@@ -76,6 +76,76 @@
return array();
}
+ /**
+ * Get the best README file in this result set, if one exists.
+ *
+ * Callers should normally use `diffusion.filecontentquery` to pull README
+ * content.
+ *
+ * @return string|null Full path to best README, or null if one does not
+ * exist.
+ */
+ public function getReadmePath() {
+ $allowed_types = array(
+ ArcanistDiffChangeType::FILE_NORMAL => true,
+ ArcanistDiffChangeType::FILE_TEXT => true,
+ );
+
+ $candidates = array();
+ foreach ($this->getPaths() as $path_object) {
+ if (empty($allowed_types[$path_object->getFileType()])) {
+ // Skip directories, images, etc.
+ continue;
+ }
+
+ $local_path = $path_object->getPath();
+ if (!preg_match('/^readme(\.|$)/i', $local_path)) {
+ // Skip files not named "README".
+ continue;
+ }
+
+ $full_path = $path_object->getFullPath();
+ $candidates[$full_path] = self::getReadmePriority($local_path);
+ }
+
+ if (!$candidates) {
+ return null;
+ }
+
+ arsort($candidates);
+ return head_key($candidates);
+ }
+
+ /**
+ * Get the priority of a README file.
+ *
+ * When a directory contains several README files, this function scores them
+ * so the caller can select a preferred file. See @{method:getReadmePath}.
+ *
+ * @param string Local README path, like "README.txt".
+ * @return int Priority score, with higher being more preferred.
+ */
+ public static function getReadmePriority($path) {
+ $path = phutil_utf8_strtolower($path);
+ if ($path == 'readme') {
+ return 90;
+ }
+
+ $ext = last(explode('.', $path));
+ switch ($ext) {
+ case 'remarkup':
+ return 100;
+ case 'rainbow':
+ return 80;
+ case 'md':
+ return 70;
+ case 'txt':
+ return 60;
+ default:
+ return 50;
+ }
+ }
+
public static function newFromConduit(array $data) {
$paths = array();
$path_dicts = $data['paths'];
diff --git a/src/applications/diffusion/view/DiffusionReadmeView.php b/src/applications/diffusion/view/DiffusionReadmeView.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/view/DiffusionReadmeView.php
@@ -0,0 +1,124 @@
+<?php
+
+final class DiffusionReadmeView extends DiffusionView {
+
+ private $path;
+ private $content;
+
+ public function setPath($path) {
+ $this->path = $path;
+ return $this;
+ }
+
+ public function getPath() {
+ return $this->path;
+ }
+
+ public function setContent($content) {
+ $this->content = $content;
+ return $this;
+ }
+
+ public function getContent() {
+ return $this->content;
+ }
+
+ /**
+ * Get the markup language a README should be interpreted as.
+ *
+ * @param string Local README path, like "README.txt".
+ * @return string Best markup interpreter (like "remarkup") for this file.
+ */
+ private function getReadmeLanguage($path) {
+ $path = phutil_utf8_strtolower($path);
+ if ($path == 'readme') {
+ return 'remarkup';
+ }
+
+ $ext = last(explode('.', $path));
+ switch ($ext) {
+ case 'remarkup':
+ case 'md':
+ return 'remarkup';
+ case 'rainbow':
+ return 'rainbow';
+ case 'txt':
+ default:
+ return 'text';
+ }
+ }
+
+
+ public function render() {
+ $readme_path = $this->getPath();
+ $readme_name = basename($readme_path);
+ $interpreter = $this->getReadmeLanguage($readme_name);
+
+ $content = $this->getContent();
+
+ $class = null;
+ switch ($interpreter) {
+ case 'remarkup':
+ // TODO: This is sketchy, but make sure we hit the markup cache.
+ $markup_object = id(new PhabricatorMarkupOneOff())
+ ->setEngineRuleset('diffusion-readme')
+ ->setContent($content);
+ $markup_field = 'default';
+
+ $content = id(new PhabricatorMarkupEngine())
+ ->setViewer($this->getUser())
+ ->addObject($markup_object, $markup_field)
+ ->process()
+ ->getOutput($markup_object, $markup_field);
+
+ $engine = $markup_object->newMarkupEngine($markup_field);
+ $toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
+ if ($toc) {
+ $toc = phutil_tag_div(
+ 'phabricator-remarkup-toc',
+ array(
+ phutil_tag_div(
+ 'phabricator-remarkup-toc-header',
+ pht('Table of Contents')),
+ $toc,
+ ));
+ $content = array($toc, $content);
+ }
+
+ $readme_content = $content;
+ $class = 'phabricator-remarkup';
+ break;
+ case 'rainbow':
+ $content = id(new PhutilRainbowSyntaxHighlighter())
+ ->getHighlightFuture($content)
+ ->resolve();
+ $readme_content = phutil_escape_html_newlines($content);
+
+ require_celerity_resource('syntax-highlighting-css');
+ $class = 'remarkup-code';
+ break;
+ default:
+ case 'text':
+ $readme_content = phutil_escape_html_newlines($content);
+ break;
+ }
+
+ $readme_content = phutil_tag(
+ 'div',
+ array(
+ 'class' => $class,
+ ),
+ $readme_content);
+
+ $box = new PHUIBoxView();
+ $box->appendChild($readme_content);
+ $box->addPadding(PHUI::PADDING_LARGE);
+
+ $object_box = id(new PHUIObjectBoxView())
+ ->setHeaderText($readme_name)
+ ->appendChild($box);
+
+ return $object_box;
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Oct 15 2024, 5:56 PM (4 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6713794
Default Alt Text
D11099.id26643.diff (15 KB)
Attached To
Mode
D11099: Fix diffusion.readmequery to work in a cluster enviroment
Attached
Detach File
Event Timeline
Log In to Comment