private function buildCorpus($selected, DiffusionFileContentQuery $file_query, $needs_blame, DiffusionRequest $drequest, $path, $data)
 {
     if (ArcanistDiffUtils::isHeuristicBinaryFile($data)) {
         $file = $this->loadFileForData($path, $data);
         $file_uri = $file->getBestURI();
         if ($file->isViewableImage()) {
             $this->corpusType = 'image';
             return $this->buildImageCorpus($file_uri);
         } else {
             $this->corpusType = 'binary';
             return $this->buildBinaryCorpus($file_uri, $data);
         }
     }
     switch ($selected) {
         case 'plain':
             $style = "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
             $corpus = phutil_render_tag('textarea', array('style' => $style), phutil_escape_html($file_query->getRawData()));
             break;
         case 'plainblame':
             $style = "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
             list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
             $rows = array();
             foreach ($text_list as $k => $line) {
                 $rev = $rev_list[$k];
                 if (isset($blame_dict[$rev]['handle'])) {
                     $author = $blame_dict[$rev]['handle']->getName();
                 } else {
                     $author = $blame_dict[$rev]['author'];
                 }
                 $rows[] = sprintf("%-10s %-20s %s", substr($rev, 0, 7), $author, $line);
             }
             $corpus = phutil_render_tag('textarea', array('style' => $style), phutil_escape_html(implode("\n", $rows)));
             break;
         case 'highlighted':
         case 'blame':
         default:
             require_celerity_resource('syntax-highlighting-css');
             list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
             $text_list = implode("\n", $text_list);
             $text_list = PhabricatorSyntaxHighlighter::highlightWithFilename($path, $text_list);
             $text_list = explode("\n", $text_list);
             $rows = $this->buildDisplayRows($text_list, $rev_list, $blame_dict, $needs_blame, $drequest, $file_query, $selected);
             $corpus_table = phutil_render_tag('table', array('class' => "diffusion-source remarkup-code PhabricatorMonospaced"), implode("\n", $rows));
             $corpus = phutil_render_tag('div', array('style' => 'padding: 0 2em;'), $corpus_table);
             break;
     }
     return $corpus;
 }
 protected function getResult(ConduitAPIRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $file_query = DiffusionFileContentQuery::newFromDiffusionRequest($drequest);
     $timeout = $request->getValue('timeout');
     if ($timeout) {
         $file_query->setTimeout($timeout);
     }
     $byte_limit = $request->getValue('byteLimit');
     if ($byte_limit) {
         $file_query->setByteLimit($byte_limit);
     }
     $file = $file_query->execute();
     $too_slow = (bool) $file_query->getExceededTimeLimit();
     $too_huge = (bool) $file_query->getExceededByteLimit();
     $file_phid = null;
     if (!$too_slow && !$too_huge) {
         $repository = $drequest->getRepository();
         $repository_phid = $repository->getPHID();
         $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
         $file->attachToObject($repository_phid);
         unset($unguarded);
         $file_phid = $file->getPHID();
     }
     return array('tooSlow' => $too_slow, 'tooHuge' => $too_huge, 'filePHID' => $file_phid);
 }
 public function processRequest()
 {
     // Build the view selection form.
     $select_map = array('highlighted' => 'View as Highlighted Text', 'blame' => 'View as Highlighted Text with Blame', 'plain' => 'View as Plain Text', 'plainblame' => 'View as Plain Text with Blame', 'raw' => 'View as raw document');
     $request = $this->getRequest();
     $drequest = $this->getDiffusionRequest();
     $path = $drequest->getPath();
     $selected = $request->getStr('view');
     $needs_blame = $selected == 'blame' || $selected == 'plainblame';
     $file_query = DiffusionFileContentQuery::newFromDiffusionRequest($this->diffusionRequest);
     $file_query->setNeedsBlame($needs_blame);
     $file_query->loadFileContent();
     $data = $file_query->getRawData();
     if ($selected === 'raw') {
         $response = new AphrontFileResponse();
         $response->setContent($data);
         $mime_type = $this->getDocumentType($path);
         if ($mime_type) {
             $response->setMimeType($mime_type);
         } else {
             $as_filename = idx(pathinfo($path), 'basename');
             $response->setDownload($as_filename);
         }
         return $response;
     }
     $select = '<select name="view">';
     foreach ($select_map as $k => $v) {
         $option = phutil_render_tag('option', array('value' => $k, 'selected' => $k == $selected ? 'selected' : null), phutil_escape_html($v));
         $select .= $option;
     }
     $select .= '</select>';
     require_celerity_resource('diffusion-source-css');
     $view_select_panel = new AphrontPanelView();
     $view_select_form = phutil_render_tag('form', array('action' => $request->getRequestURI(), 'method' => 'get', 'class' => 'diffusion-browse-type-form'), $select . '<button>View</button>');
     $view_select_panel->appendChild($view_select_form);
     $view_select_panel->appendChild('<div style="clear: both;"></div>');
     // Build the content of the file.
     $corpus = $this->buildCorpus($selected, $file_query, $needs_blame, $drequest, $path, $data);
     // Render the page.
     $content = array();
     $content[] = $this->buildCrumbs(array('branch' => true, 'path' => true, 'view' => 'browse'));
     $content[] = $view_select_panel;
     $content[] = $corpus;
     $content[] = $this->buildOpenRevisions();
     $nav = $this->buildSideNav('browse', true);
     $nav->appendChild($content);
     $basename = basename($this->getDiffusionRequest()->getPath());
     return $this->buildStandardPageResponse($nav, array('title' => $basename));
 }
 protected function getResult(ConduitAPIRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $needs_blame = $request->getValue('needsBlame');
     $file_query = DiffusionFileContentQuery::newFromDiffusionRequest($drequest);
     $file_query->setViewer($request->getUser())->setNeedsBlame($needs_blame);
     $file_content = $file_query->loadFileContent();
     if ($needs_blame) {
         list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
     } else {
         $text_list = $rev_list = $blame_dict = array();
     }
     $file_content->setBlameDict($blame_dict)->setRevList($rev_list)->setTextList($text_list);
     return $file_content->toDictionary();
 }
 protected function getResult(ConduitAPIRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $file_query = DiffusionFileContentQuery::newFromDiffusionRequest($drequest)->setViewer($request->getUser());
     $timeout = $request->getValue('timeout');
     if ($timeout) {
         $file_query->setTimeout($timeout);
     }
     $byte_limit = $request->getValue('byteLimit');
     if ($byte_limit) {
         $file_query->setByteLimit($byte_limit);
     }
     $file_content = $file_query->loadFileContent();
     $text_list = $rev_list = $blame_dict = array();
     $file_content->setBlameDict($blame_dict)->setRevList($rev_list)->setTextList($text_list);
     return $file_content->toDictionary();
 }
 private function buildCorpus($selected)
 {
     $needs_blame = $selected == 'blame' || $selected == 'plainblame';
     $file_query = DiffusionFileContentQuery::newFromDiffusionRequest($this->diffusionRequest);
     $file_query->setNeedsBlame($needs_blame);
     $file_query->loadFileContent();
     $drequest = $this->getDiffusionRequest();
     $path = $drequest->getPath();
     $image_type = $this->getImageType($path);
     if ($image_type && !$selected) {
         $data = $file_query->getRawData();
         $corpus = phutil_render_tag('img', array('style' => 'padding-bottom: 10px', 'src' => 'data:' . $image_type . ';base64,' . base64_encode($data)));
         return $corpus;
     }
     // TODO: blame of blame.
     switch ($selected) {
         case 'plain':
             $style = "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
             $corpus = phutil_render_tag('textarea', array('style' => $style), phutil_escape_html($file_query->getRawData()));
             break;
         case 'plainblame':
             $style = "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
             list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
             $rows = array();
             foreach ($text_list as $k => $line) {
                 $rev = $rev_list[$k];
                 $author = $blame_dict[$rev]['author'];
                 $rows[] = sprintf("%-10s %-20s %s", substr($rev, 0, 7), $author, $line);
             }
             $corpus = phutil_render_tag('textarea', array('style' => $style), phutil_escape_html(implode("\n", $rows)));
             break;
         case 'highlighted':
         case 'blame':
         default:
             require_celerity_resource('syntax-highlighting-css');
             list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
             $text_list = implode("\n", $text_list);
             $text_list = PhabricatorSyntaxHighlighter::highlightWithFilename($path, $text_list);
             $text_list = explode("\n", $text_list);
             $rows = $this->buildDisplayRows($text_list, $rev_list, $blame_dict, $needs_blame, $drequest, $file_query, $selected);
             $corpus_table = phutil_render_tag('table', array('class' => "diffusion-source remarkup-code PhabricatorMonospaced"), implode("\n", $rows));
             $corpus = phutil_render_tag('div', array('style' => 'padding: 0pt 2em;'), $corpus_table);
             break;
     }
     return $corpus;
 }
 protected function getResult(ConduitAPIRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $file_query = DiffusionFileContentQuery::newFromDiffusionRequest($drequest);
     $timeout = $request->getValue('timeout');
     if ($timeout) {
         $file_query->setTimeout($timeout);
     }
     $byte_limit = $request->getValue('byteLimit');
     if ($byte_limit) {
         $file_query->setByteLimit($byte_limit);
     }
     $content = $file_query->execute();
     $too_slow = (bool) $file_query->getExceededTimeLimit();
     $too_huge = (bool) $file_query->getExceededByteLimit();
     $file_phid = null;
     if (!$too_slow && !$too_huge) {
         $file = $this->newFile($drequest, $content);
         $file_phid = $file->getPHID();
     }
     return array('tooSlow' => $too_slow, 'tooHuge' => $too_huge, 'filePHID' => $file_phid);
 }
 private function blameAuthors()
 {
     $repository = id(new PhabricatorRepositoryQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withIDs(array($this->branch->getRepositoryID()))->executeOne();
     $queries = array();
     $futures = array();
     foreach ($this->blame as $path => $lines) {
         $drequest = DiffusionRequest::newFromDictionary(array('user' => PhabricatorUser::getOmnipotentUser(), 'repository' => $repository, 'branch' => $this->branch->getName(), 'path' => $path, 'commit' => $this->lintCommit));
         // TODO: Restore blame information / generally fix this workflow.
         $query = DiffusionFileContentQuery::newFromDiffusionRequest($drequest);
         $queries[$path] = $query;
         $futures[$path] = $query->getFileContentFuture();
     }
     $authors = array();
     $futures = id(new FutureIterator($futures))->limit(8);
     foreach ($futures as $path => $future) {
         $queries[$path]->loadFileContentFromFuture($future);
         list(, $rev_list, $blame_dict) = $queries[$path]->getBlameData();
         foreach (array_keys($this->blame[$path]) as $line) {
             $commit_identifier = $rev_list[$line - 1];
             $author = idx($blame_dict[$commit_identifier], 'authorPHID');
             if ($author) {
                 $authors[$author][$path][] = $line;
             }
         }
     }
     if ($authors) {
         $this->conn->openTransaction();
         foreach ($authors as $author => $paths) {
             $where = array();
             foreach ($paths as $path => $lines) {
                 $where[] = qsprintf($this->conn, '(path = %s AND line IN (%Ld))', $this->svnRoot . '/' . $path, $lines);
             }
             queryfx($this->conn, 'UPDATE %T SET authorPHID = %s WHERE %Q', PhabricatorRepository::TABLE_LINTMESSAGE, $author, implode(' OR ', $where));
         }
         $this->conn->saveTransaction();
     }
 }
 private function loadChangedByCommit(DifferentialDiff $diff)
 {
     $repository = $this->repository;
     $vs_changesets = array();
     $vs_diff = id(new DifferentialDiff())->loadOneWhere('revisionID = %d AND creationMethod != %s ORDER BY id DESC LIMIT 1', $diff->getRevisionID(), 'commit');
     foreach ($vs_diff->loadChangesets() as $changeset) {
         $path = $changeset->getAbsoluteRepositoryPath($repository, $vs_diff);
         $path = ltrim($path, '/');
         $vs_changesets[$path] = $changeset;
     }
     $changesets = array();
     foreach ($diff->getChangesets() as $changeset) {
         $path = $changeset->getAbsoluteRepositoryPath($repository, $diff);
         $path = ltrim($path, '/');
         $changesets[$path] = $changeset;
     }
     if (array_fill_keys(array_keys($changesets), true) != array_fill_keys(array_keys($vs_changesets), true)) {
         return $vs_diff;
     }
     $hunks = id(new DifferentialHunk())->loadAllWhere('changesetID IN (%Ld)', mpull($vs_changesets, 'getID'));
     $hunks = mgroup($hunks, 'getChangesetID');
     foreach ($vs_changesets as $changeset) {
         $changeset->attachHunks(idx($hunks, $changeset->getID(), array()));
     }
     $file_phids = array();
     foreach ($vs_changesets as $changeset) {
         $metadata = $changeset->getMetadata();
         $file_phid = idx($metadata, 'new:binary-phid');
         if ($file_phid) {
             $file_phids[$file_phid] = $file_phid;
         }
     }
     $files = array();
     if ($file_phids) {
         $files = id(new PhabricatorFile())->loadAllWhere('phid IN (%Ls)', $file_phids);
         $files = mpull($files, null, 'getPHID');
     }
     foreach ($changesets as $path => $changeset) {
         $vs_changeset = $vs_changesets[$path];
         $file_phid = idx($vs_changeset->getMetadata(), 'new:binary-phid');
         if ($file_phid) {
             if (!isset($files[$file_phid])) {
                 return $vs_diff;
             }
             $drequest = DiffusionRequest::newFromDictionary(array('repository' => $this->repository, 'commit' => $this->commit->getCommitIdentifier(), 'path' => $path));
             $corpus = DiffusionFileContentQuery::newFromDiffusionRequest($drequest)->loadFileContent()->getCorpus();
             if ($files[$file_phid]->loadFileData() != $corpus) {
                 return $vs_diff;
             }
         } else {
             $context = implode("\n", $changeset->makeChangesWithContext());
             $vs_context = implode("\n", $vs_changeset->makeChangesWithContext());
             // We couldn't just compare $context and $vs_context because following
             // diffs will be considered different:
             //
             //   -(empty line)
             //   -echo 'test';
             //    (empty line)
             //
             //    (empty line)
             //   -echo "test";
             //   -(empty line)
             $hunk = id(new DifferentialHunk())->setChanges($context);
             $vs_hunk = id(new DifferentialHunk())->setChanges($vs_context);
             if ($hunk->makeOldFile() != $vs_hunk->makeOldFile() || $hunk->makeNewFile() != $vs_hunk->makeNewFile()) {
                 return $vs_diff;
             }
         }
     }
     return null;
 }
 private function buildCorpus($selected, DiffusionFileContentQuery $file_query, $needs_blame, DiffusionRequest $drequest, $path, $data)
 {
     if (ArcanistDiffUtils::isHeuristicBinaryFile($data)) {
         $file = $this->loadFileForData($path, $data);
         $file_uri = $file->getBestURI();
         if ($file->isViewableImage()) {
             $this->corpusType = 'image';
             return $this->buildImageCorpus($file_uri);
         } else {
             $this->corpusType = 'binary';
             return $this->buildBinaryCorpus($file_uri, $data);
         }
     }
     switch ($selected) {
         case 'plain':
             $style = "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
             $corpus = phutil_render_tag('textarea', array('style' => $style), phutil_escape_html($file_query->getRawData()));
             break;
         case 'plainblame':
             $style = "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
             list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
             $rows = array();
             foreach ($text_list as $k => $line) {
                 $rev = $rev_list[$k];
                 if (isset($blame_dict[$rev]['handle'])) {
                     $author = $blame_dict[$rev]['handle']->getName();
                 } else {
                     $author = $blame_dict[$rev]['author'];
                 }
                 $rows[] = sprintf("%-10s %-20s %s", substr($rev, 0, 7), $author, $line);
             }
             $corpus = phutil_render_tag('textarea', array('style' => $style), phutil_escape_html(implode("\n", $rows)));
             break;
         case 'highlighted':
         case 'blame':
         default:
             require_celerity_resource('syntax-highlighting-css');
             list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData();
             $text_list = implode("\n", $text_list);
             $text_list = PhabricatorSyntaxHighlighter::highlightWithFilename($path, $text_list);
             $text_list = explode("\n", $text_list);
             $rows = $this->buildDisplayRows($text_list, $rev_list, $blame_dict, $needs_blame, $drequest, $file_query, $selected);
             $id = celerity_generate_unique_node_id();
             $projects = $drequest->loadArcanistProjects();
             $langs = array();
             foreach ($projects as $project) {
                 $ls = $project->getSymbolIndexLanguages();
                 if (!$ls) {
                     continue;
                 }
                 $dep_projects = $project->getSymbolIndexProjects();
                 $dep_projects[] = $project->getPHID();
                 foreach ($ls as $lang) {
                     if (!isset($langs[$lang])) {
                         $langs[$lang] = array();
                     }
                     $langs[$lang] += $dep_projects + array($project);
                 }
             }
             $lang = last(explode('.', $drequest->getPath()));
             $prefs = $this->getRequest()->getUser()->loadPreferences();
             $pref_symbols = $prefs->getPreference(PhabricatorUserPreferences::PREFERENCE_DIFFUSION_SYMBOLS);
             if (isset($langs[$lang]) && $pref_symbols != 'disabled') {
                 Javelin::initBehavior('repository-crossreference', array('container' => $id, 'lang' => $lang, 'projects' => $langs[$lang]));
             }
             $corpus_table = javelin_render_tag('table', array('class' => "diffusion-source remarkup-code PhabricatorMonospaced", 'sigil' => 'diffusion-source'), implode("\n", $rows));
             $corpus = phutil_render_tag('div', array('style' => 'padding: 0 2em;', 'id' => $id), $corpus_table);
             break;
     }
     return $corpus;
 }
 private function loadChangedByCommit(DifferentialRevision $revision, DifferentialDiff $diff)
 {
     $repository = $this->repository;
     $vs_diff = id(new DifferentialDiffQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withRevisionIDs(array($revision->getID()))->needChangesets(true)->setLimit(1)->executeOne();
     if (!$vs_diff) {
         return null;
     }
     if ($vs_diff->getCreationMethod() == 'commit') {
         return null;
     }
     $vs_changesets = array();
     foreach ($vs_diff->getChangesets() as $changeset) {
         $path = $changeset->getAbsoluteRepositoryPath($repository, $vs_diff);
         $path = ltrim($path, '/');
         $vs_changesets[$path] = $changeset;
     }
     $changesets = array();
     foreach ($diff->getChangesets() as $changeset) {
         $path = $changeset->getAbsoluteRepositoryPath($repository, $diff);
         $path = ltrim($path, '/');
         $changesets[$path] = $changeset;
     }
     if (array_fill_keys(array_keys($changesets), true) != array_fill_keys(array_keys($vs_changesets), true)) {
         return $vs_diff;
     }
     $file_phids = array();
     foreach ($vs_changesets as $changeset) {
         $metadata = $changeset->getMetadata();
         $file_phid = idx($metadata, 'new:binary-phid');
         if ($file_phid) {
             $file_phids[$file_phid] = $file_phid;
         }
     }
     $files = array();
     if ($file_phids) {
         $files = id(new PhabricatorFileQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withPHIDs($file_phids)->execute();
         $files = mpull($files, null, 'getPHID');
     }
     foreach ($changesets as $path => $changeset) {
         $vs_changeset = $vs_changesets[$path];
         $file_phid = idx($vs_changeset->getMetadata(), 'new:binary-phid');
         if ($file_phid) {
             if (!isset($files[$file_phid])) {
                 return $vs_diff;
             }
             $drequest = DiffusionRequest::newFromDictionary(array('user' => PhabricatorUser::getOmnipotentUser(), 'repository' => $this->repository, 'commit' => $this->commit->getCommitIdentifier(), 'path' => $path));
             $corpus = DiffusionFileContentQuery::newFromDiffusionRequest($drequest)->setViewer(PhabricatorUser::getOmnipotentUser())->loadFileContent()->getCorpus();
             if ($files[$file_phid]->loadFileData() != $corpus) {
                 return $vs_diff;
             }
         } else {
             $context = implode("\n", $changeset->makeChangesWithContext());
             $vs_context = implode("\n", $vs_changeset->makeChangesWithContext());
             // We couldn't just compare $context and $vs_context because following
             // diffs will be considered different:
             //
             //   -(empty line)
             //   -echo 'test';
             //    (empty line)
             //
             //    (empty line)
             //   -echo "test";
             //   -(empty line)
             $hunk = id(new DifferentialModernHunk())->setChanges($context);
             $vs_hunk = id(new DifferentialModernHunk())->setChanges($vs_context);
             if ($hunk->makeOldFile() != $vs_hunk->makeOldFile() || $hunk->makeNewFile() != $vs_hunk->makeNewFile()) {
                 return $vs_diff;
             }
         }
     }
     return null;
 }
 public function processRequest()
 {
     $drequest = $this->diffusionRequest;
     $browse_query = DiffusionBrowseQuery::newFromDiffusionRequest($drequest);
     $results = $browse_query->loadPaths();
     $content = array();
     $content[] = $this->buildCrumbs(array('branch' => true, 'path' => true, 'view' => 'browse'));
     if (!$results) {
         if ($browse_query->getReasonForEmptyResultSet() == DiffusionBrowseQuery::REASON_IS_FILE) {
             $controller = new DiffusionBrowseFileController($this->getRequest());
             $controller->setDiffusionRequest($drequest);
             return $this->delegateToController($controller);
         }
         $empty_result = new DiffusionEmptyResultView();
         $empty_result->setDiffusionRequest($drequest);
         $empty_result->setBrowseQuery($browse_query);
         $empty_result->setView($this->getRequest()->getStr('view'));
         $content[] = $empty_result;
     } else {
         $readme = null;
         $phids = array();
         foreach ($results as $result) {
             $data = $result->getLastCommitData();
             if ($data) {
                 if ($data->getCommitDetail('authorPHID')) {
                     $phids[$data->getCommitDetail('authorPHID')] = true;
                 }
             }
             $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);
         $browse_table->setPaths($results);
         $browse_panel = new AphrontPanelView();
         $browse_panel->appendChild($browse_table);
         $content[] = $browse_panel;
     }
     $content[] = $this->buildOpenRevisions();
     $nav = $this->buildSideNav('browse', false);
     $nav->appendChild($content);
     return $this->buildStandardPageResponse($nav, array('title' => basename($drequest->getPath())));
 }
 protected function getResult(ConduitAPIRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     return DiffusionFileContentQuery::newFromDiffusionRequest($drequest)->respondToConduitRequest($request);
 }
 public final function renderReadme(array $results)
 {
     $drequest = $this->getRequest();
     $readme = null;
     foreach ($results as $result) {
         $file_type = $result->getFileType();
         if ($file_type != ArcanistDiffChangeType::FILE_NORMAL && $file_type != ArcanistDiffChangeType::FILE_TEXT) {
             // Skip directories, etc.
             continue;
         }
         $path = $result->getPath();
         if (preg_match('/^readme(|\\.txt|\\.remarkup|\\.rainbow)$/i', $path)) {
             $readme = $result;
             break;
         }
     }
     if (!$readme) {
         return null;
     }
     $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);
         $class = null;
     } else {
         if (preg_match('/\\.rainbow$/', $readme->getPath())) {
             $highlighter = new PhutilRainbowSyntaxHighlighter();
             $readme_content = $highlighter->getHighlightFuture($readme_content)->resolve();
             $readme_content = nl2br($readme_content);
             require_celerity_resource('syntax-highlighting-css');
             $class = 'remarkup-code';
         } else {
             // Markup extensionless files as remarkup so we get links and such.
             $engine = PhabricatorMarkupEngine::newDiffusionMarkupEngine();
             $readme_content = $engine->markupText($readme_content);
             $class = 'phabricator-remarkup';
         }
     }
     $readme_content = phutil_render_tag('div', array('class' => $class), $readme_content);
     return $readme_content;
 }