2011-03-08 02:25:47 +01:00
|
|
|
<?php
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
final class DiffusionBrowseController extends DiffusionController {
|
|
|
|
|
|
|
|
private $lintCommit;
|
|
|
|
private $lintMessages;
|
|
|
|
private $coverage;
|
2013-09-19 20:57:33 +02:00
|
|
|
|
2013-09-23 21:53:41 +02:00
|
|
|
public function shouldAllowPublic() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
public function handleRequest(AphrontRequest $request) {
|
|
|
|
$response = $this->loadDiffusionContext();
|
|
|
|
if ($response) {
|
|
|
|
return $response;
|
|
|
|
}
|
|
|
|
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
// Figure out if we're browsing a directory, a file, or a search result
|
|
|
|
// list.
|
|
|
|
|
|
|
|
$grep = $request->getStr('grep');
|
|
|
|
$find = $request->getStr('find');
|
|
|
|
if (strlen($grep) || strlen($find)) {
|
|
|
|
return $this->browseSearch();
|
|
|
|
}
|
|
|
|
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$pager = id(new PHUIPagerView())
|
|
|
|
->readFromRequest($request);
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$results = DiffusionBrowseResultSet::newFromConduit(
|
|
|
|
$this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.browsequery',
|
|
|
|
array(
|
|
|
|
'path' => $drequest->getPath(),
|
|
|
|
'commit' => $drequest->getStableCommit(),
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
'offset' => $pager->getOffset(),
|
|
|
|
'limit' => $pager->getPageSize() + 1,
|
2016-01-05 14:18:59 +01:00
|
|
|
)));
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$reason = $results->getReasonForEmptyResultSet();
|
|
|
|
$is_file = ($reason == DiffusionBrowseResultSet::REASON_IS_FILE);
|
|
|
|
|
|
|
|
if ($is_file) {
|
|
|
|
return $this->browseFile($results);
|
|
|
|
} else {
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$paths = $results->getPaths();
|
|
|
|
$paths = $pager->sliceResults($paths);
|
|
|
|
$results->setPaths($paths);
|
|
|
|
|
|
|
|
return $this->browseDirectory($results, $pager);
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private function browseSearch() {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
$actions = $this->buildActionView($drequest);
|
|
|
|
$properties = $this->buildPropertyView($drequest, $actions);
|
|
|
|
|
|
|
|
$object_box = id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($this->buildHeaderView($drequest))
|
|
|
|
->addPropertyList($properties);
|
|
|
|
|
|
|
|
$content = array();
|
|
|
|
|
|
|
|
$content[] = $object_box;
|
|
|
|
$content[] = $this->renderSearchForm($collapsed = false);
|
|
|
|
$content[] = $this->renderSearchResults();
|
|
|
|
|
|
|
|
$crumbs = $this->buildCrumbs(
|
|
|
|
array(
|
|
|
|
'branch' => true,
|
|
|
|
'path' => true,
|
|
|
|
'view' => 'browse',
|
|
|
|
));
|
|
|
|
|
|
|
|
return $this->newPage()
|
|
|
|
->setTitle(
|
|
|
|
array(
|
|
|
|
nonempty(basename($drequest->getPath()), '/'),
|
|
|
|
$drequest->getRepository()->getDisplayName(),
|
|
|
|
))
|
|
|
|
->setCrumbs($crumbs)
|
|
|
|
->appendChild($content);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function browseFile() {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
$request = $this->getRequest();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
$before = $request->getStr('before');
|
|
|
|
if ($before) {
|
|
|
|
return $this->buildBeforeResponse($before);
|
|
|
|
}
|
|
|
|
|
|
|
|
$path = $drequest->getPath();
|
|
|
|
|
|
|
|
$preferences = $viewer->loadPreferences();
|
|
|
|
|
|
|
|
$show_blame = $request->getBool(
|
|
|
|
'blame',
|
|
|
|
$preferences->getPreference(
|
|
|
|
PhabricatorUserPreferences::PREFERENCE_DIFFUSION_BLAME,
|
|
|
|
false));
|
|
|
|
$show_color = $request->getBool(
|
|
|
|
'color',
|
|
|
|
$preferences->getPreference(
|
|
|
|
PhabricatorUserPreferences::PREFERENCE_DIFFUSION_COLOR,
|
|
|
|
true));
|
|
|
|
|
|
|
|
$view = $request->getStr('view');
|
|
|
|
if ($request->isFormPost() && $view != 'raw' && $viewer->isLoggedIn()) {
|
|
|
|
$preferences->setPreference(
|
|
|
|
PhabricatorUserPreferences::PREFERENCE_DIFFUSION_BLAME,
|
|
|
|
$show_blame);
|
|
|
|
$preferences->setPreference(
|
|
|
|
PhabricatorUserPreferences::PREFERENCE_DIFFUSION_COLOR,
|
|
|
|
$show_color);
|
|
|
|
$preferences->save();
|
|
|
|
|
|
|
|
$uri = $request->getRequestURI()
|
|
|
|
->alter('blame', null)
|
|
|
|
->alter('color', null);
|
|
|
|
|
|
|
|
return id(new AphrontRedirectResponse())->setURI($uri);
|
|
|
|
}
|
|
|
|
|
|
|
|
// We need the blame information if blame is on and we're building plain
|
|
|
|
// text, or blame is on and this is an Ajax request. If blame is on and
|
|
|
|
// this is a colorized request, we don't show blame at first (we ajax it
|
|
|
|
// in afterward) so we don't need to query for it.
|
|
|
|
$needs_blame = ($show_blame && !$show_color) ||
|
|
|
|
($show_blame && $request->isAjax());
|
|
|
|
|
|
|
|
$params = array(
|
|
|
|
'commit' => $drequest->getCommit(),
|
|
|
|
'path' => $drequest->getPath(),
|
|
|
|
);
|
|
|
|
|
|
|
|
$byte_limit = null;
|
|
|
|
if ($view !== 'raw') {
|
|
|
|
$byte_limit = PhabricatorFileStorageEngine::getChunkThreshold();
|
|
|
|
$time_limit = 10;
|
|
|
|
|
|
|
|
$params += array(
|
|
|
|
'timeout' => $time_limit,
|
|
|
|
'byteLimit' => $byte_limit,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
$file_content = DiffusionFileContent::newFromConduit(
|
|
|
|
$this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.filecontentquery',
|
|
|
|
$params));
|
|
|
|
$data = $file_content->getCorpus();
|
|
|
|
|
|
|
|
if ($view === 'raw') {
|
|
|
|
return $this->buildRawResponse($path, $data);
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->loadLintMessages();
|
|
|
|
$this->coverage = $drequest->loadCoverage();
|
|
|
|
|
|
|
|
if ($byte_limit && (strlen($data) == $byte_limit)) {
|
|
|
|
$corpus = $this->buildErrorCorpus(
|
|
|
|
pht(
|
|
|
|
'This file is larger than %s byte(s), and too large to display '.
|
|
|
|
'in the web UI.',
|
|
|
|
$byte_limit));
|
|
|
|
} else if (ArcanistDiffUtils::isHeuristicBinaryFile($data)) {
|
|
|
|
$file = $this->loadFileForData($path, $data);
|
|
|
|
$file_uri = $file->getBestURI();
|
|
|
|
|
|
|
|
if ($file->isViewableImage()) {
|
|
|
|
$corpus = $this->buildImageCorpus($file_uri);
|
|
|
|
} else {
|
|
|
|
$corpus = $this->buildBinaryCorpus($file_uri, $data);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Build the content of the file.
|
|
|
|
$corpus = $this->buildCorpus(
|
|
|
|
$show_blame,
|
|
|
|
$show_color,
|
|
|
|
$file_content,
|
|
|
|
$needs_blame,
|
|
|
|
$drequest,
|
|
|
|
$path,
|
|
|
|
$data);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($request->isAjax()) {
|
|
|
|
return id(new AphrontAjaxResponse())->setContent($corpus);
|
|
|
|
}
|
|
|
|
|
|
|
|
require_celerity_resource('diffusion-source-css');
|
|
|
|
|
|
|
|
// Render the page.
|
|
|
|
$view = $this->buildActionView($drequest);
|
|
|
|
$action_list = $this->enrichActionView(
|
|
|
|
$view,
|
|
|
|
$drequest,
|
|
|
|
$show_blame,
|
|
|
|
$show_color);
|
|
|
|
|
|
|
|
$properties = $this->buildPropertyView($drequest, $action_list);
|
|
|
|
$object_box = id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($this->buildHeaderView($drequest))
|
|
|
|
->addPropertyList($properties);
|
|
|
|
|
|
|
|
$content = array();
|
|
|
|
$content[] = $object_box;
|
|
|
|
|
|
|
|
$follow = $request->getStr('follow');
|
|
|
|
if ($follow) {
|
|
|
|
$notice = new PHUIInfoView();
|
|
|
|
$notice->setSeverity(PHUIInfoView::SEVERITY_WARNING);
|
|
|
|
$notice->setTitle(pht('Unable to Continue'));
|
|
|
|
switch ($follow) {
|
|
|
|
case 'first':
|
|
|
|
$notice->appendChild(
|
|
|
|
pht(
|
|
|
|
'Unable to continue tracing the history of this file because '.
|
|
|
|
'this commit is the first commit in the repository.'));
|
|
|
|
break;
|
|
|
|
case 'created':
|
|
|
|
$notice->appendChild(
|
|
|
|
pht(
|
|
|
|
'Unable to continue tracing the history of this file because '.
|
|
|
|
'this commit created the file.'));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$content[] = $notice;
|
|
|
|
}
|
|
|
|
|
|
|
|
$renamed = $request->getStr('renamed');
|
|
|
|
if ($renamed) {
|
|
|
|
$notice = new PHUIInfoView();
|
|
|
|
$notice->setSeverity(PHUIInfoView::SEVERITY_NOTICE);
|
|
|
|
$notice->setTitle(pht('File Renamed'));
|
|
|
|
$notice->appendChild(
|
|
|
|
pht(
|
|
|
|
'File history passes through a rename from "%s" to "%s".',
|
|
|
|
$drequest->getPath(),
|
|
|
|
$renamed));
|
|
|
|
$content[] = $notice;
|
|
|
|
}
|
|
|
|
|
|
|
|
$content[] = $corpus;
|
|
|
|
$content[] = $this->buildOpenRevisions();
|
|
|
|
|
|
|
|
$crumbs = $this->buildCrumbs(
|
|
|
|
array(
|
|
|
|
'branch' => true,
|
|
|
|
'path' => true,
|
|
|
|
'view' => 'browse',
|
|
|
|
));
|
|
|
|
|
|
|
|
$basename = basename($this->getDiffusionRequest()->getPath());
|
|
|
|
|
|
|
|
return $this->newPage()
|
|
|
|
->setTitle(
|
|
|
|
array(
|
|
|
|
$basename,
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
))
|
|
|
|
->setCrumbs($crumbs)
|
|
|
|
->appendChild($content);
|
|
|
|
}
|
|
|
|
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
public function browseDirectory(
|
|
|
|
DiffusionBrowseResultSet $results,
|
|
|
|
PHUIPagerView $pager) {
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$request = $this->getRequest();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
$reason = $results->getReasonForEmptyResultSet();
|
|
|
|
|
|
|
|
$content = array();
|
|
|
|
$actions = $this->buildActionView($drequest);
|
|
|
|
$properties = $this->buildPropertyView($drequest, $actions);
|
|
|
|
|
|
|
|
$object_box = id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($this->buildHeaderView($drequest))
|
|
|
|
->addPropertyList($properties);
|
|
|
|
|
|
|
|
$content[] = $object_box;
|
|
|
|
$content[] = $this->renderSearchForm($collapsed = true);
|
|
|
|
|
|
|
|
if (!$results->isValidResults()) {
|
|
|
|
$empty_result = new DiffusionEmptyResultView();
|
|
|
|
$empty_result->setDiffusionRequest($drequest);
|
|
|
|
$empty_result->setDiffusionBrowseResultSet($results);
|
|
|
|
$empty_result->setView($request->getStr('view'));
|
|
|
|
$content[] = $empty_result;
|
|
|
|
} else {
|
|
|
|
$phids = array();
|
|
|
|
foreach ($results->getPaths() as $result) {
|
|
|
|
$data = $result->getLastCommitData();
|
|
|
|
if ($data) {
|
|
|
|
if ($data->getCommitDetail('authorPHID')) {
|
|
|
|
$phids[$data->getCommitDetail('authorPHID')] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$phids = array_keys($phids);
|
|
|
|
$handles = $this->loadViewerHandles($phids);
|
|
|
|
|
|
|
|
$browse_table = new DiffusionBrowseTableView();
|
|
|
|
$browse_table->setDiffusionRequest($drequest);
|
|
|
|
$browse_table->setHandles($handles);
|
|
|
|
$browse_table->setPaths($results->getPaths());
|
|
|
|
$browse_table->setUser($request->getUser());
|
|
|
|
|
|
|
|
$browse_panel = new PHUIObjectBoxView();
|
|
|
|
$browse_panel->setHeaderText($drequest->getPath(), '/');
|
|
|
|
$browse_panel->setTable($browse_table);
|
|
|
|
|
|
|
|
$content[] = $browse_panel;
|
|
|
|
}
|
|
|
|
|
|
|
|
$content[] = $this->buildOpenRevisions();
|
|
|
|
|
|
|
|
|
|
|
|
$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(
|
|
|
|
array(
|
|
|
|
'branch' => true,
|
|
|
|
'path' => true,
|
|
|
|
'view' => 'browse',
|
|
|
|
));
|
|
|
|
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$pager_box = $this->renderTablePagerBox($pager);
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
return $this->newPage()
|
|
|
|
->setTitle(
|
|
|
|
array(
|
|
|
|
nonempty(basename($drequest->getPath()), '/'),
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
))
|
|
|
|
->setCrumbs($crumbs)
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
->appendChild(
|
|
|
|
array(
|
|
|
|
$content,
|
|
|
|
$pager_box,
|
|
|
|
));
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private function renderSearchResults() {
|
2016-01-05 14:56:35 +01:00
|
|
|
$request = $this->getRequest();
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
$results = array();
|
|
|
|
|
2016-01-05 14:56:35 +01:00
|
|
|
$pager = id(new PHUIPagerView())
|
|
|
|
->readFromRequest($request);
|
2016-01-05 14:18:59 +01:00
|
|
|
|
|
|
|
$search_mode = null;
|
|
|
|
switch ($repository->getVersionControlSystem()) {
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
|
|
|
$results = array();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (strlen($this->getRequest()->getStr('grep'))) {
|
|
|
|
$search_mode = 'grep';
|
2016-01-05 14:56:35 +01:00
|
|
|
$query_string = $request->getStr('grep');
|
2016-01-05 14:18:59 +01:00
|
|
|
$results = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.searchquery',
|
|
|
|
array(
|
|
|
|
'grep' => $query_string,
|
|
|
|
'commit' => $drequest->getStableCommit(),
|
|
|
|
'path' => $drequest->getPath(),
|
2016-01-05 14:56:35 +01:00
|
|
|
'limit' => $pager->getPageSize() + 1,
|
|
|
|
'offset' => $pager->getOffset(),
|
2016-01-05 14:18:59 +01:00
|
|
|
));
|
|
|
|
} else { // Filename search.
|
|
|
|
$search_mode = 'find';
|
2016-01-05 14:56:35 +01:00
|
|
|
$query_string = $request->getStr('find');
|
2016-01-05 14:18:59 +01:00
|
|
|
$results = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.querypaths',
|
|
|
|
array(
|
|
|
|
'pattern' => $query_string,
|
|
|
|
'commit' => $drequest->getStableCommit(),
|
|
|
|
'path' => $drequest->getPath(),
|
2016-01-05 14:56:35 +01:00
|
|
|
'limit' => $pager->getPageSize() + 1,
|
|
|
|
'offset' => $pager->getOffset(),
|
2016-01-05 14:18:59 +01:00
|
|
|
));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$results = $pager->sliceResults($results);
|
|
|
|
|
|
|
|
if ($search_mode == 'grep') {
|
|
|
|
$table = $this->renderGrepResults($results, $query_string);
|
|
|
|
$header = pht(
|
|
|
|
'File content matching "%s" under "%s"',
|
|
|
|
$query_string,
|
|
|
|
nonempty($drequest->getPath(), '/'));
|
|
|
|
} else {
|
|
|
|
$table = $this->renderFindResults($results);
|
|
|
|
$header = pht(
|
|
|
|
'Paths matching "%s" under "%s"',
|
|
|
|
$query_string,
|
|
|
|
nonempty($drequest->getPath(), '/'));
|
|
|
|
}
|
|
|
|
|
|
|
|
$box = id(new PHUIObjectBoxView())
|
|
|
|
->setHeaderText($header)
|
|
|
|
->setTable($table);
|
|
|
|
|
|
|
|
$pager_box = $this->renderTablePagerBox($pager);
|
|
|
|
|
|
|
|
return array($box, $pager_box);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderGrepResults(array $results, $pattern) {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
require_celerity_resource('phabricator-search-results-css');
|
|
|
|
|
|
|
|
$rows = array();
|
|
|
|
foreach ($results as $result) {
|
|
|
|
list($path, $line, $string) = $result;
|
|
|
|
|
|
|
|
$href = $drequest->generateURI(array(
|
|
|
|
'action' => 'browse',
|
|
|
|
'path' => $path,
|
|
|
|
'line' => $line,
|
|
|
|
));
|
|
|
|
|
|
|
|
$matches = null;
|
|
|
|
$count = @preg_match_all(
|
|
|
|
'('.$pattern.')u',
|
|
|
|
$string,
|
|
|
|
$matches,
|
|
|
|
PREG_OFFSET_CAPTURE);
|
|
|
|
|
|
|
|
if (!$count) {
|
|
|
|
$output = ltrim($string);
|
|
|
|
} else {
|
|
|
|
$output = array();
|
|
|
|
$cursor = 0;
|
|
|
|
$length = strlen($string);
|
|
|
|
foreach ($matches[0] as $match) {
|
|
|
|
$offset = $match[1];
|
|
|
|
if ($cursor != $offset) {
|
|
|
|
$output[] = array(
|
|
|
|
'text' => substr($string, $cursor, $offset),
|
|
|
|
'highlight' => false,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$output[] = array(
|
|
|
|
'text' => $match[0],
|
|
|
|
'highlight' => true,
|
|
|
|
);
|
|
|
|
$cursor = $offset + strlen($match[0]);
|
|
|
|
}
|
|
|
|
if ($cursor != $length) {
|
|
|
|
$output[] = array(
|
|
|
|
'text' => substr($string, $cursor),
|
|
|
|
'highlight' => false,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($output) {
|
|
|
|
$output[0]['text'] = ltrim($output[0]['text']);
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($output as $key => $segment) {
|
|
|
|
if ($segment['highlight']) {
|
|
|
|
$output[$key] = phutil_tag('strong', array(), $segment['text']);
|
|
|
|
} else {
|
|
|
|
$output[$key] = $segment['text'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$string = phutil_tag(
|
|
|
|
'pre',
|
|
|
|
array('class' => 'PhabricatorMonospaced phui-source-fragment'),
|
|
|
|
$output);
|
|
|
|
|
|
|
|
$path = Filesystem::readablePath($path, $drequest->getPath());
|
|
|
|
|
|
|
|
$rows[] = array(
|
|
|
|
phutil_tag('a', array('href' => $href), $path),
|
|
|
|
$line,
|
|
|
|
$string,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
$table = id(new AphrontTableView($rows))
|
|
|
|
->setClassName('remarkup-code')
|
|
|
|
->setHeaders(array(pht('Path'), pht('Line'), pht('String')))
|
|
|
|
->setColumnClasses(array('', 'n', 'wide'))
|
|
|
|
->setNoDataString(
|
|
|
|
pht(
|
|
|
|
'The pattern you searched for was not found in the content of any '.
|
|
|
|
'files.'));
|
|
|
|
|
|
|
|
return $table;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderFindResults(array $results) {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
$rows = array();
|
|
|
|
foreach ($results as $result) {
|
|
|
|
$href = $drequest->generateURI(array(
|
|
|
|
'action' => 'browse',
|
|
|
|
'path' => $result,
|
|
|
|
));
|
|
|
|
|
|
|
|
$readable = Filesystem::readablePath($result, $drequest->getPath());
|
|
|
|
|
|
|
|
$rows[] = array(
|
|
|
|
phutil_tag('a', array('href' => $href), $readable),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
$table = id(new AphrontTableView($rows))
|
|
|
|
->setHeaders(array(pht('Path')))
|
|
|
|
->setColumnClasses(array('wide'))
|
|
|
|
->setNoDataString(
|
|
|
|
pht(
|
|
|
|
'The pattern you searched for did not match the names of any '.
|
|
|
|
'files.'));
|
|
|
|
|
|
|
|
return $table;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function loadLintMessages() {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$branch = $drequest->loadBranch();
|
|
|
|
|
|
|
|
if (!$branch || !$branch->getLintCommit()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->lintCommit = $branch->getLintCommit();
|
|
|
|
|
|
|
|
$conn = id(new PhabricatorRepository())->establishConnection('r');
|
|
|
|
|
|
|
|
$where = '';
|
|
|
|
if ($drequest->getLint()) {
|
|
|
|
$where = qsprintf(
|
|
|
|
$conn,
|
|
|
|
'AND code = %s',
|
|
|
|
$drequest->getLint());
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->lintMessages = queryfx_all(
|
|
|
|
$conn,
|
|
|
|
'SELECT * FROM %T WHERE branchID = %d %Q AND path = %s',
|
|
|
|
PhabricatorRepository::TABLE_LINTMESSAGE,
|
|
|
|
$branch->getID(),
|
|
|
|
$where,
|
|
|
|
'/'.$drequest->getPath());
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildCorpus(
|
|
|
|
$show_blame,
|
|
|
|
$show_color,
|
|
|
|
DiffusionFileContent $file_content,
|
|
|
|
$needs_blame,
|
|
|
|
DiffusionRequest $drequest,
|
|
|
|
$path,
|
|
|
|
$data) {
|
|
|
|
|
2016-01-06 15:15:25 +01:00
|
|
|
$viewer = $this->getViewer();
|
2016-01-07 03:08:07 +01:00
|
|
|
$blame_timeout = 15;
|
|
|
|
$blame_failed = false;
|
2016-01-06 15:15:25 +01:00
|
|
|
|
2016-01-07 03:08:07 +01:00
|
|
|
$file_corpus = $file_content->getCorpus();
|
|
|
|
$highlight_limit = DifferentialChangesetParser::HIGHLIGHT_BYTE_LIMIT;
|
|
|
|
$blame_limit = DifferentialChangesetParser::HIGHLIGHT_BYTE_LIMIT;
|
|
|
|
$can_highlight = (strlen($file_corpus) <= $highlight_limit);
|
|
|
|
$can_blame = (strlen($file_corpus) <= $blame_limit);
|
|
|
|
|
|
|
|
if ($needs_blame && $can_blame) {
|
|
|
|
$blame = $this->loadBlame($path, $drequest->getCommit(), $blame_timeout);
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
list($blame_list, $blame_commits) = $blame;
|
2016-01-07 03:08:07 +01:00
|
|
|
if ($blame_list === null) {
|
|
|
|
$blame_failed = true;
|
|
|
|
$blame_list = array();
|
|
|
|
}
|
2016-01-06 15:15:25 +01:00
|
|
|
} else {
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$blame_list = array();
|
|
|
|
$blame_commits = array();
|
2016-01-06 15:15:25 +01:00
|
|
|
}
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
if (!$show_color) {
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$corpus = $this->renderPlaintextCorpus(
|
|
|
|
$file_corpus,
|
|
|
|
$blame_list,
|
|
|
|
$blame_commits,
|
|
|
|
$show_blame);
|
2016-01-05 14:18:59 +01:00
|
|
|
} else {
|
2016-01-06 15:41:38 +01:00
|
|
|
if ($can_highlight) {
|
|
|
|
require_celerity_resource('syntax-highlighting-css');
|
2016-01-05 14:18:59 +01:00
|
|
|
|
2016-01-06 15:41:38 +01:00
|
|
|
$highlighted = PhabricatorSyntaxHighlighter::highlightWithFilename(
|
|
|
|
$path,
|
|
|
|
$file_corpus);
|
|
|
|
$lines = phutil_split_lines($highlighted);
|
|
|
|
} else {
|
|
|
|
$lines = phutil_split_lines($file_corpus);
|
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
|
2016-01-06 15:15:25 +01:00
|
|
|
$rows = $this->buildDisplayRows(
|
|
|
|
$lines,
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$blame_list,
|
|
|
|
$blame_commits,
|
2016-01-06 15:15:25 +01:00
|
|
|
$show_blame,
|
|
|
|
$show_color);
|
2016-01-05 14:18:59 +01:00
|
|
|
|
|
|
|
$corpus_table = javelin_tag(
|
|
|
|
'table',
|
|
|
|
array(
|
|
|
|
'class' => 'diffusion-source remarkup-code PhabricatorMonospaced',
|
|
|
|
'sigil' => 'phabricator-source',
|
|
|
|
),
|
|
|
|
$rows);
|
|
|
|
|
|
|
|
if ($this->getRequest()->isAjax()) {
|
|
|
|
return $corpus_table;
|
|
|
|
}
|
|
|
|
|
|
|
|
$id = celerity_generate_unique_node_id();
|
|
|
|
|
|
|
|
$repo = $drequest->getRepository();
|
|
|
|
$symbol_repos = nonempty($repo->getSymbolSources(), array());
|
|
|
|
$symbol_repos[] = $repo->getPHID();
|
|
|
|
|
|
|
|
$lang = last(explode('.', $drequest->getPath()));
|
|
|
|
$repo_languages = $repo->getSymbolLanguages();
|
|
|
|
$repo_languages = nonempty($repo_languages, array());
|
|
|
|
$repo_languages = array_fill_keys($repo_languages, true);
|
|
|
|
|
|
|
|
$needs_symbols = true;
|
|
|
|
if ($repo_languages && $symbol_repos) {
|
|
|
|
$have_symbols = id(new DiffusionSymbolQuery())
|
|
|
|
->existsSymbolsInRepository($repo->getPHID());
|
|
|
|
if (!$have_symbols) {
|
|
|
|
$needs_symbols = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($needs_symbols && $repo_languages) {
|
|
|
|
$needs_symbols = isset($repo_languages[$lang]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($needs_symbols) {
|
|
|
|
Javelin::initBehavior(
|
|
|
|
'repository-crossreference',
|
|
|
|
array(
|
|
|
|
'container' => $id,
|
|
|
|
'lang' => $lang,
|
|
|
|
'repositories' => $symbol_repos,
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
$corpus = phutil_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'id' => $id,
|
|
|
|
),
|
|
|
|
$corpus_table);
|
|
|
|
|
|
|
|
Javelin::initBehavior('load-blame', array('id' => $id));
|
|
|
|
}
|
|
|
|
|
|
|
|
$edit = $this->renderEditButton();
|
|
|
|
$file = $this->renderFileButton();
|
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('File Contents'))
|
|
|
|
->addActionLink($edit)
|
|
|
|
->addActionLink($file);
|
|
|
|
|
|
|
|
$corpus = id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($header)
|
|
|
|
->appendChild($corpus)
|
|
|
|
->setCollapsed(true);
|
|
|
|
|
2016-01-07 03:08:07 +01:00
|
|
|
$messages = array();
|
|
|
|
|
2016-01-06 15:41:38 +01:00
|
|
|
if (!$can_highlight) {
|
2016-01-07 03:08:07 +01:00
|
|
|
$messages[] = pht(
|
2016-01-06 15:41:38 +01:00
|
|
|
'This file is larger than %s, so syntax highlighting is disabled '.
|
|
|
|
'by default.',
|
|
|
|
phutil_format_bytes($highlight_limit));
|
2016-01-07 03:08:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($show_blame && !$can_blame) {
|
|
|
|
$messages[] = pht(
|
|
|
|
'This file is larger than %s, so blame is disabled.',
|
|
|
|
phutil_format_bytes($blame_limit));
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($blame_failed) {
|
|
|
|
$messages[] = pht(
|
|
|
|
'Failed to load blame information for this file in %s second(s).',
|
|
|
|
new PhutilNumber($blame_timeout));
|
|
|
|
}
|
2016-01-06 15:41:38 +01:00
|
|
|
|
2016-01-07 03:08:07 +01:00
|
|
|
if ($messages) {
|
2016-01-06 15:41:38 +01:00
|
|
|
$corpus->setInfoView(
|
|
|
|
id(new PHUIInfoView())
|
|
|
|
->setSeverity(PHUIInfoView::SEVERITY_WARNING)
|
2016-01-07 03:08:07 +01:00
|
|
|
->setErrors($messages));
|
2016-01-06 15:41:38 +01:00
|
|
|
}
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
return $corpus;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function enrichActionView(
|
|
|
|
PhabricatorActionListView $view,
|
|
|
|
DiffusionRequest $drequest,
|
|
|
|
$show_blame,
|
|
|
|
$show_color) {
|
|
|
|
|
|
|
|
$viewer = $this->getRequest()->getUser();
|
|
|
|
$base_uri = $this->getRequest()->getRequestURI();
|
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName(pht('Show Last Change'))
|
|
|
|
->setHref(
|
|
|
|
$drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'change',
|
|
|
|
)))
|
|
|
|
->setIcon('fa-backward'));
|
|
|
|
|
|
|
|
if ($show_blame) {
|
|
|
|
$blame_text = pht('Disable Blame');
|
|
|
|
$blame_icon = 'fa-exclamation-circle lightgreytext';
|
|
|
|
$blame_value = 0;
|
|
|
|
} else {
|
|
|
|
$blame_text = pht('Enable Blame');
|
|
|
|
$blame_icon = 'fa-exclamation-circle';
|
|
|
|
$blame_value = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName($blame_text)
|
|
|
|
->setHref($base_uri->alter('blame', $blame_value))
|
|
|
|
->setIcon($blame_icon)
|
|
|
|
->setUser($viewer)
|
|
|
|
->setRenderAsForm($viewer->isLoggedIn()));
|
|
|
|
|
|
|
|
if ($show_color) {
|
|
|
|
$highlight_text = pht('Disable Highlighting');
|
|
|
|
$highlight_icon = 'fa-star-o grey';
|
|
|
|
$highlight_value = 0;
|
|
|
|
} else {
|
|
|
|
$highlight_text = pht('Enable Highlighting');
|
|
|
|
$highlight_icon = 'fa-star';
|
|
|
|
$highlight_value = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName($highlight_text)
|
|
|
|
->setHref($base_uri->alter('color', $highlight_value))
|
|
|
|
->setIcon($highlight_icon)
|
|
|
|
->setUser($viewer)
|
|
|
|
->setRenderAsForm($viewer->isLoggedIn()));
|
|
|
|
|
|
|
|
$href = null;
|
|
|
|
if ($this->getRequest()->getStr('lint') !== null) {
|
|
|
|
$lint_text = pht('Hide %d Lint Message(s)', count($this->lintMessages));
|
|
|
|
$href = $base_uri->alter('lint', null);
|
|
|
|
|
|
|
|
} else if ($this->lintCommit === null) {
|
|
|
|
$lint_text = pht('Lint not Available');
|
|
|
|
} else {
|
|
|
|
$lint_text = pht(
|
|
|
|
'Show %d Lint Message(s)',
|
|
|
|
count($this->lintMessages));
|
|
|
|
$href = $this->getDiffusionRequest()->generateURI(array(
|
|
|
|
'action' => 'browse',
|
|
|
|
'commit' => $this->lintCommit,
|
|
|
|
))->alter('lint', '');
|
|
|
|
}
|
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName($lint_text)
|
|
|
|
->setHref($href)
|
|
|
|
->setIcon('fa-exclamation-triangle')
|
|
|
|
->setDisabled(!$href));
|
|
|
|
|
|
|
|
return $view;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderEditButton() {
|
|
|
|
$request = $this->getRequest();
|
|
|
|
$user = $request->getUser();
|
|
|
|
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
$path = $drequest->getPath();
|
|
|
|
$line = nonempty((int)$drequest->getLine(), 1);
|
|
|
|
|
|
|
|
$editor_link = $user->loadEditorLink($path, $line, $repository);
|
|
|
|
$template = $user->loadEditorLink($path, '%l', $repository);
|
|
|
|
|
|
|
|
$icon_edit = id(new PHUIIconView())
|
|
|
|
->setIconFont('fa-pencil');
|
|
|
|
$button = id(new PHUIButtonView())
|
|
|
|
->setTag('a')
|
|
|
|
->setText(pht('Open in Editor'))
|
|
|
|
->setHref($editor_link)
|
|
|
|
->setIcon($icon_edit)
|
|
|
|
->setID('editor_link')
|
|
|
|
->setMetadata(array('link_template' => $template))
|
|
|
|
->setDisabled(!$editor_link);
|
|
|
|
|
|
|
|
return $button;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderFileButton($file_uri = null) {
|
|
|
|
|
|
|
|
$base_uri = $this->getRequest()->getRequestURI();
|
|
|
|
|
|
|
|
if ($file_uri) {
|
|
|
|
$text = pht('Download Raw File');
|
|
|
|
$href = $file_uri;
|
|
|
|
$icon = 'fa-download';
|
|
|
|
} else {
|
|
|
|
$text = pht('View Raw File');
|
|
|
|
$href = $base_uri->alter('view', 'raw');
|
|
|
|
$icon = 'fa-file-text';
|
|
|
|
}
|
|
|
|
|
|
|
|
$iconview = id(new PHUIIconView())
|
|
|
|
->setIconFont($icon);
|
|
|
|
$button = id(new PHUIButtonView())
|
|
|
|
->setTag('a')
|
|
|
|
->setText($text)
|
|
|
|
->setHref($href)
|
|
|
|
->setIcon($iconview);
|
|
|
|
|
|
|
|
return $button;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private function buildDisplayRows(
|
2016-01-06 15:15:25 +01:00
|
|
|
array $lines,
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
array $blame_list,
|
|
|
|
array $blame_commits,
|
2016-01-06 15:15:25 +01:00
|
|
|
$show_color,
|
|
|
|
$show_blame) {
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$request = $this->getRequest();
|
|
|
|
$viewer = $this->getViewer();
|
2016-01-06 15:15:25 +01:00
|
|
|
$drequest = $this->getDiffusionRequest();
|
2016-01-06 15:41:38 +01:00
|
|
|
$repository = $drequest->getRepository();
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$revision_map = array();
|
|
|
|
$revisions = array();
|
|
|
|
if ($blame_commits) {
|
|
|
|
$commit_map = mpull($blame_commits, 'getCommitIdentifier', 'getPHID');
|
|
|
|
|
|
|
|
$revision_ids = id(new DifferentialRevision())
|
|
|
|
->loadIDsByCommitPHIDs(array_keys($commit_map));
|
|
|
|
if ($revision_ids) {
|
|
|
|
$revisions = id(new DifferentialRevisionQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withIDs($revision_ids)
|
|
|
|
->execute();
|
|
|
|
$revisions = mpull($revisions, null, 'getID');
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($revision_ids as $commit_phid => $revision_id) {
|
|
|
|
$revision_map[$commit_map[$commit_phid]] = $revision_id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$phids = array();
|
|
|
|
foreach ($blame_commits as $commit) {
|
|
|
|
$author_phid = $commit->getAuthorPHID();
|
|
|
|
if ($author_phid === null) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$phids[$author_phid] = $author_phid;
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($revisions as $revision) {
|
|
|
|
$author_phid = $revision->getAuthorPHID();
|
|
|
|
if ($author_phid === null) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$phids[$author_phid] = $author_phid;
|
|
|
|
}
|
|
|
|
|
|
|
|
$handles = $viewer->loadHandles($phids);
|
|
|
|
|
|
|
|
$colors = array();
|
|
|
|
if ($blame_commits) {
|
|
|
|
$epochs = array();
|
|
|
|
|
|
|
|
foreach ($blame_commits as $identifier => $commit) {
|
|
|
|
$epochs[$identifier] = $commit->getEpoch();
|
|
|
|
}
|
|
|
|
|
|
|
|
$epoch_list = array_filter($epochs);
|
2016-01-06 15:15:25 +01:00
|
|
|
$epoch_list = array_unique($epoch_list);
|
|
|
|
$epoch_list = array_values($epoch_list);
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$epoch_min = min($epoch_list);
|
|
|
|
$epoch_max = max($epoch_list);
|
|
|
|
$epoch_range = ($epoch_max - $epoch_min) + 1;
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
|
|
|
|
foreach ($blame_commits as $identifier => $commit) {
|
|
|
|
$epoch = $epochs[$identifier];
|
|
|
|
if (!$epoch) {
|
|
|
|
$color = '#ffffdd'; // Warning color, missing data.
|
|
|
|
} else {
|
|
|
|
$color_ratio = ($epoch - $epoch_min) / $epoch_range;
|
|
|
|
$color_value = 0xE6 * (1.0 - $color_ratio);
|
|
|
|
$color = sprintf(
|
|
|
|
'#%02x%02x%02x',
|
|
|
|
$color_value,
|
|
|
|
0xF6,
|
|
|
|
$color_value);
|
|
|
|
}
|
|
|
|
|
|
|
|
$colors[$identifier] = $color;
|
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$display = array();
|
|
|
|
$last_identifier = null;
|
|
|
|
$last_color = null;
|
|
|
|
foreach ($lines as $line_index => $line) {
|
|
|
|
$color = '#f6f6f6';
|
|
|
|
$duplicate = false;
|
|
|
|
if (isset($blame_list[$line_index])) {
|
|
|
|
$identifier = $blame_list[$line_index];
|
|
|
|
if (isset($colors[$identifier])) {
|
|
|
|
$color = $colors[$identifier];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($identifier === $last_identifier) {
|
|
|
|
$duplicate = true;
|
|
|
|
} else {
|
|
|
|
$last_identifier = $identifier;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$display[$line_index] = array(
|
|
|
|
'data' => $line,
|
|
|
|
'target' => false,
|
|
|
|
'highlighted' => false,
|
|
|
|
'color' => $color,
|
|
|
|
'duplicate' => $duplicate,
|
|
|
|
);
|
|
|
|
}
|
2016-01-06 15:15:25 +01:00
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$line_arr = array();
|
|
|
|
$line_str = $drequest->getLine();
|
|
|
|
$ranges = explode(',', $line_str);
|
|
|
|
foreach ($ranges as $range) {
|
|
|
|
if (strpos($range, '-') !== false) {
|
|
|
|
list($min, $max) = explode('-', $range, 2);
|
|
|
|
$line_arr[] = array(
|
|
|
|
'min' => min($min, $max),
|
|
|
|
'max' => max($min, $max),
|
|
|
|
);
|
|
|
|
} else if (strlen($range)) {
|
|
|
|
$line_arr[] = array(
|
|
|
|
'min' => $range,
|
|
|
|
'max' => $range,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
// Mark the first highlighted line as the target line.
|
|
|
|
if ($line_arr) {
|
|
|
|
$target_line = $line_arr[0]['min'];
|
|
|
|
if (isset($display[$target_line - 1])) {
|
|
|
|
$display[$target_line - 1]['target'] = true;
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
// Mark all other highlighted lines as highlighted.
|
|
|
|
foreach ($line_arr as $range) {
|
|
|
|
for ($ii = $range['min']; $ii <= $range['max']; $ii++) {
|
|
|
|
if (isset($display[$ii - 1])) {
|
|
|
|
$display[$ii - 1]['highlighted'] = true;
|
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$engine = null;
|
|
|
|
$inlines = array();
|
|
|
|
if ($this->getRequest()->getStr('lint') !== null && $this->lintMessages) {
|
|
|
|
$engine = new PhabricatorMarkupEngine();
|
|
|
|
$engine->setViewer($viewer);
|
|
|
|
|
|
|
|
foreach ($this->lintMessages as $message) {
|
|
|
|
$inline = id(new PhabricatorAuditInlineComment())
|
|
|
|
->setSyntheticAuthor(
|
|
|
|
ArcanistLintSeverity::getStringForSeverity($message['severity']).
|
|
|
|
' '.$message['code'].' ('.$message['name'].')')
|
|
|
|
->setLineNumber($message['line'])
|
|
|
|
->setContent($message['description']);
|
|
|
|
$inlines[$message['line']][] = $inline;
|
|
|
|
|
|
|
|
$engine->addObject(
|
|
|
|
$inline,
|
|
|
|
PhabricatorInlineCommentInterface::MARKUP_FIELD_BODY);
|
|
|
|
}
|
|
|
|
|
|
|
|
$engine->process();
|
|
|
|
require_celerity_resource('differential-changeset-view-css');
|
|
|
|
}
|
|
|
|
|
|
|
|
$rows = $this->renderInlines(
|
|
|
|
idx($inlines, 0, array()),
|
|
|
|
$show_blame,
|
|
|
|
(bool)$this->coverage,
|
|
|
|
$engine);
|
|
|
|
|
2016-01-06 15:41:38 +01:00
|
|
|
// NOTE: We're doing this manually because rendering is otherwise
|
|
|
|
// dominated by URI generation for very large files.
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$line_base = (string)$drequest->generateURI(
|
2016-01-06 15:41:38 +01:00
|
|
|
array(
|
|
|
|
'action' => 'browse',
|
|
|
|
'stable' => true,
|
|
|
|
));
|
|
|
|
|
|
|
|
require_celerity_resource('aphront-tooltip-css');
|
|
|
|
Javelin::initBehavior('phabricator-oncopy');
|
|
|
|
Javelin::initBehavior('phabricator-tooltips');
|
|
|
|
Javelin::initBehavior('phabricator-line-linker');
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
// Render these once, since they tend to get repeated many times in large
|
|
|
|
// blame outputs.
|
|
|
|
$commit_links = $this->renderCommitLinks($blame_commits, $handles);
|
|
|
|
$revision_links = $this->renderRevisionLinks($revisions, $handles);
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$skip_text = pht('Skip Past This Commit');
|
|
|
|
foreach ($display as $line_index => $line) {
|
|
|
|
$row = array();
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$line_number = $line_index + 1;
|
|
|
|
$line_href = $line_base.'$'.$line_number;
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
if (isset($blame_list[$line_index])) {
|
|
|
|
$identifier = $blame_list[$line_index];
|
|
|
|
} else {
|
|
|
|
$identifier = null;
|
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$revision_link = null;
|
|
|
|
$commit_link = null;
|
|
|
|
$before_link = null;
|
|
|
|
$style = null;
|
|
|
|
if ($identifier && !$line['duplicate']) {
|
|
|
|
$style = 'background: '.$line['color'].';';
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
if (isset($commit_links[$identifier])) {
|
|
|
|
$commit_link = $commit_links[$identifier];
|
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
if (isset($revision_map[$identifier])) {
|
|
|
|
$revision_id = $revision_map[$identifier];
|
|
|
|
if (isset($revision_links[$revision_id])) {
|
|
|
|
$revision_link = $revision_links[$revision_id];
|
2016-01-06 15:41:38 +01:00
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$skip_href = $line_href.'?before='.$identifier.'&view=blame';
|
|
|
|
$before_link = javelin_tag(
|
|
|
|
'a',
|
2016-01-05 14:18:59 +01:00
|
|
|
array(
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
'href' => $skip_href,
|
|
|
|
'sigil' => 'has-tooltip',
|
|
|
|
'meta' => array(
|
|
|
|
'tip' => $skip_text,
|
|
|
|
'align' => 'E',
|
|
|
|
'size' => 300,
|
|
|
|
),
|
2016-01-05 14:18:59 +01:00
|
|
|
),
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
"\xC2\xAB");
|
|
|
|
}
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$row[] = phutil_tag(
|
|
|
|
'th',
|
|
|
|
array(
|
|
|
|
'class' => 'diffusion-blame-link',
|
|
|
|
),
|
|
|
|
$before_link);
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$object_links = array();
|
|
|
|
$object_links[] = $commit_link;
|
|
|
|
if ($revision_link) {
|
|
|
|
$object_links[] = phutil_tag('span', array(), '/');
|
|
|
|
$object_links[] = $revision_link;
|
2016-01-05 14:18:59 +01:00
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$row[] = phutil_tag(
|
|
|
|
'th',
|
|
|
|
array(
|
|
|
|
'class' => 'diffusion-rev-link',
|
|
|
|
),
|
|
|
|
$object_links);
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
$line_link = phutil_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => $line_href,
|
|
|
|
'style' => $style,
|
|
|
|
),
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$line_number);
|
2016-01-05 14:18:59 +01:00
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$row[] = javelin_tag(
|
2016-01-05 14:18:59 +01:00
|
|
|
'th',
|
|
|
|
array(
|
|
|
|
'class' => 'diffusion-line-link',
|
|
|
|
'sigil' => 'phabricator-source-line',
|
|
|
|
'style' => $style,
|
|
|
|
),
|
|
|
|
$line_link);
|
|
|
|
|
|
|
|
if ($line['target']) {
|
|
|
|
Javelin::initBehavior(
|
|
|
|
'diffusion-jump-to',
|
|
|
|
array(
|
|
|
|
'target' => 'scroll_target',
|
|
|
|
));
|
|
|
|
$anchor_text = phutil_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'id' => 'scroll_target',
|
|
|
|
),
|
|
|
|
'');
|
|
|
|
} else {
|
|
|
|
$anchor_text = null;
|
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$row[] = phutil_tag(
|
2016-01-05 14:18:59 +01:00
|
|
|
'td',
|
|
|
|
array(
|
|
|
|
),
|
|
|
|
array(
|
|
|
|
$anchor_text,
|
|
|
|
|
|
|
|
// NOTE: See phabricator-oncopy behavior.
|
|
|
|
"\xE2\x80\x8B",
|
|
|
|
|
|
|
|
// TODO: [HTML] Not ideal.
|
|
|
|
phutil_safe_html(str_replace("\t", ' ', $line['data'])),
|
|
|
|
));
|
|
|
|
|
|
|
|
if ($this->coverage) {
|
|
|
|
require_celerity_resource('differential-changeset-view-css');
|
|
|
|
$cov_index = $line['line'] - 1;
|
|
|
|
|
|
|
|
if (isset($this->coverage[$cov_index])) {
|
|
|
|
$cov_class = $this->coverage[$cov_index];
|
|
|
|
} else {
|
|
|
|
$cov_class = 'N';
|
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$row[] = phutil_tag(
|
2016-01-05 14:18:59 +01:00
|
|
|
'td',
|
|
|
|
array(
|
|
|
|
'class' => 'cov cov-'.$cov_class,
|
|
|
|
),
|
|
|
|
'');
|
|
|
|
}
|
|
|
|
|
|
|
|
$rows[] = phutil_tag(
|
|
|
|
'tr',
|
|
|
|
array(
|
|
|
|
'class' => ($line['highlighted'] ?
|
|
|
|
'phabricator-source-highlight' :
|
|
|
|
null),
|
|
|
|
),
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$row);
|
2016-01-05 14:18:59 +01:00
|
|
|
|
|
|
|
$cur_inlines = $this->renderInlines(
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
idx($inlines, $line_number, array()),
|
2016-01-05 14:18:59 +01:00
|
|
|
$show_blame,
|
|
|
|
$this->coverage,
|
|
|
|
$engine);
|
|
|
|
foreach ($cur_inlines as $cur_inline) {
|
|
|
|
$rows[] = $cur_inline;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $rows;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderInlines(
|
|
|
|
array $inlines,
|
2016-01-06 15:15:25 +01:00
|
|
|
$show_blame,
|
2016-01-05 14:18:59 +01:00
|
|
|
$has_coverage,
|
|
|
|
$engine) {
|
|
|
|
|
|
|
|
$rows = array();
|
|
|
|
foreach ($inlines as $inline) {
|
|
|
|
|
|
|
|
// TODO: This should use modern scaffolding code.
|
|
|
|
|
|
|
|
$inline_view = id(new PHUIDiffInlineCommentDetailView())
|
|
|
|
->setUser($this->getViewer())
|
|
|
|
->setMarkupEngine($engine)
|
|
|
|
->setInlineComment($inline)
|
|
|
|
->render();
|
|
|
|
|
2016-01-06 15:15:25 +01:00
|
|
|
$row = array_fill(0, ($show_blame ? 3 : 1), phutil_tag('th'));
|
2016-01-05 14:18:59 +01:00
|
|
|
|
|
|
|
$row[] = phutil_tag('td', array(), $inline_view);
|
|
|
|
|
|
|
|
if ($has_coverage) {
|
|
|
|
$row[] = phutil_tag(
|
|
|
|
'td',
|
|
|
|
array(
|
|
|
|
'class' => 'cov cov-I',
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
$rows[] = phutil_tag('tr', array('class' => 'inline'), $row);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $rows;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function loadFileForData($path, $data) {
|
|
|
|
$file = PhabricatorFile::buildFromFileDataOrHash(
|
|
|
|
$data,
|
|
|
|
array(
|
|
|
|
'name' => basename($path),
|
|
|
|
'ttl' => time() + 60 * 60 * 24,
|
|
|
|
'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,
|
|
|
|
));
|
|
|
|
|
|
|
|
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
|
|
|
|
$file->attachToObject(
|
|
|
|
$this->getDiffusionRequest()->getRepository()->getPHID());
|
|
|
|
unset($unguarded);
|
|
|
|
|
|
|
|
return $file;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildRawResponse($path, $data) {
|
|
|
|
$file = $this->loadFileForData($path, $data);
|
|
|
|
return $file->getRedirectResponse();
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildImageCorpus($file_uri) {
|
|
|
|
$properties = new PHUIPropertyListView();
|
|
|
|
|
|
|
|
$properties->addImageContent(
|
|
|
|
phutil_tag(
|
|
|
|
'img',
|
|
|
|
array(
|
|
|
|
'src' => $file_uri,
|
|
|
|
)));
|
|
|
|
|
|
|
|
$file = $this->renderFileButton($file_uri);
|
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Image'))
|
|
|
|
->addActionLink($file);
|
|
|
|
|
|
|
|
return id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($header)
|
|
|
|
->addPropertyList($properties);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildBinaryCorpus($file_uri, $data) {
|
|
|
|
|
|
|
|
$size = new PhutilNumber(strlen($data));
|
|
|
|
$text = pht('This is a binary file. It is %s byte(s) in length.', $size);
|
|
|
|
$text = id(new PHUIBoxView())
|
|
|
|
->addPadding(PHUI::PADDING_LARGE)
|
|
|
|
->appendChild($text);
|
|
|
|
|
|
|
|
$file = $this->renderFileButton($file_uri);
|
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Details'))
|
|
|
|
->addActionLink($file);
|
|
|
|
|
|
|
|
$box = id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($header)
|
|
|
|
->appendChild($text);
|
|
|
|
|
|
|
|
return $box;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildErrorCorpus($message) {
|
|
|
|
$text = id(new PHUIBoxView())
|
|
|
|
->addPadding(PHUI::PADDING_LARGE)
|
|
|
|
->appendChild($message);
|
|
|
|
|
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Details'));
|
|
|
|
|
|
|
|
$box = id(new PHUIObjectBoxView())
|
|
|
|
->setHeader($header)
|
|
|
|
->appendChild($text);
|
|
|
|
|
|
|
|
return $box;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildBeforeResponse($before) {
|
|
|
|
$request = $this->getRequest();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
// NOTE: We need to get the grandparent so we can capture filename changes
|
|
|
|
// in the parent.
|
|
|
|
|
|
|
|
$parent = $this->loadParentCommitOf($before);
|
|
|
|
$old_filename = null;
|
|
|
|
$was_created = false;
|
|
|
|
if ($parent) {
|
|
|
|
$grandparent = $this->loadParentCommitOf($parent);
|
|
|
|
|
|
|
|
if ($grandparent) {
|
|
|
|
$rename_query = new DiffusionRenameHistoryQuery();
|
|
|
|
$rename_query->setRequest($drequest);
|
|
|
|
$rename_query->setOldCommit($grandparent);
|
|
|
|
$rename_query->setViewer($request->getUser());
|
|
|
|
$old_filename = $rename_query->loadOldFilename();
|
|
|
|
$was_created = $rename_query->getWasCreated();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$follow = null;
|
|
|
|
if ($was_created) {
|
|
|
|
// If the file was created in history, that means older commits won't
|
|
|
|
// have it. Since we know it existed at 'before', it must have been
|
|
|
|
// created then; jump there.
|
|
|
|
$target_commit = $before;
|
|
|
|
$follow = 'created';
|
|
|
|
} else if ($parent) {
|
|
|
|
// If we found a parent, jump to it. This is the normal case.
|
|
|
|
$target_commit = $parent;
|
|
|
|
} else {
|
|
|
|
// If there's no parent, this was probably created in the initial commit?
|
|
|
|
// And the "was_created" check will fail because we can't identify the
|
|
|
|
// grandparent. Keep the user at 'before'.
|
|
|
|
$target_commit = $before;
|
|
|
|
$follow = 'first';
|
|
|
|
}
|
|
|
|
|
|
|
|
$path = $drequest->getPath();
|
|
|
|
$renamed = null;
|
|
|
|
if ($old_filename !== null &&
|
|
|
|
$old_filename !== '/'.$path) {
|
|
|
|
$renamed = $path;
|
|
|
|
$path = $old_filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
$line = null;
|
|
|
|
// If there's a follow error, drop the line so the user sees the message.
|
|
|
|
if (!$follow) {
|
|
|
|
$line = $this->getBeforeLineNumber($target_commit);
|
|
|
|
}
|
|
|
|
|
|
|
|
$before_uri = $drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'browse',
|
|
|
|
'commit' => $target_commit,
|
|
|
|
'line' => $line,
|
|
|
|
'path' => $path,
|
|
|
|
));
|
|
|
|
|
|
|
|
$before_uri->setQueryParams($request->getRequestURI()->getQueryParams());
|
|
|
|
$before_uri = $before_uri->alter('before', null);
|
|
|
|
$before_uri = $before_uri->alter('renamed', $renamed);
|
|
|
|
$before_uri = $before_uri->alter('follow', $follow);
|
|
|
|
|
|
|
|
return id(new AphrontRedirectResponse())->setURI($before_uri);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function getBeforeLineNumber($target_commit) {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
$line = $drequest->getLine();
|
|
|
|
if (!$line) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
$raw_diff = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.rawdiffquery',
|
|
|
|
array(
|
|
|
|
'commit' => $drequest->getCommit(),
|
|
|
|
'path' => $drequest->getPath(),
|
|
|
|
'againstCommit' => $target_commit,
|
|
|
|
));
|
|
|
|
$old_line = 0;
|
|
|
|
$new_line = 0;
|
|
|
|
|
|
|
|
foreach (explode("\n", $raw_diff) as $text) {
|
|
|
|
if ($text[0] == '-' || $text[0] == ' ') {
|
|
|
|
$old_line++;
|
|
|
|
}
|
|
|
|
if ($text[0] == '+' || $text[0] == ' ') {
|
|
|
|
$new_line++;
|
|
|
|
}
|
|
|
|
if ($new_line == $line) {
|
|
|
|
return $old_line;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// We didn't find the target line.
|
|
|
|
return $line;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function loadParentCommitOf($commit) {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$user = $this->getRequest()->getUser();
|
|
|
|
|
|
|
|
$before_req = DiffusionRequest::newFromDictionary(
|
|
|
|
array(
|
|
|
|
'user' => $user,
|
|
|
|
'repository' => $drequest->getRepository(),
|
|
|
|
'commit' => $commit,
|
|
|
|
));
|
|
|
|
|
|
|
|
$parents = DiffusionQuery::callConduitWithDiffusionRequest(
|
|
|
|
$user,
|
|
|
|
$before_req,
|
|
|
|
'diffusion.commitparentsquery',
|
|
|
|
array(
|
|
|
|
'commit' => $commit,
|
|
|
|
));
|
|
|
|
|
|
|
|
return head($parents);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderRevisionTooltip(
|
|
|
|
DifferentialRevision $revision,
|
2016-01-07 03:52:13 +01:00
|
|
|
$handles) {
|
2016-01-05 14:18:59 +01:00
|
|
|
$viewer = $this->getRequest()->getUser();
|
|
|
|
|
|
|
|
$date = phabricator_date($revision->getDateModified(), $viewer);
|
|
|
|
$id = $revision->getID();
|
|
|
|
$title = $revision->getTitle();
|
|
|
|
$header = "D{$id} {$title}";
|
|
|
|
|
|
|
|
$author = $handles[$revision->getAuthorPHID()]->getName();
|
|
|
|
|
|
|
|
return "{$header}\n{$date} \xC2\xB7 {$author}";
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderCommitTooltip(
|
|
|
|
PhabricatorRepositoryCommit $commit,
|
|
|
|
$author) {
|
|
|
|
|
|
|
|
$viewer = $this->getRequest()->getUser();
|
|
|
|
|
|
|
|
$date = phabricator_date($commit->getEpoch(), $viewer);
|
|
|
|
$summary = trim($commit->getSummary());
|
|
|
|
|
|
|
|
return "{$summary}\n{$date} \xC2\xB7 {$author}";
|
|
|
|
}
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
protected function renderSearchForm($collapsed) {
|
2013-04-23 20:12:02 +02:00
|
|
|
$drequest = $this->getDiffusionRequest();
|
2014-02-01 20:48:28 +01:00
|
|
|
|
|
|
|
$forms = array();
|
2013-04-23 20:12:02 +02:00
|
|
|
$form = id(new AphrontFormView())
|
|
|
|
->setUser($this->getRequest()->getUser())
|
2013-08-26 20:53:11 +02:00
|
|
|
->setMethod('GET');
|
2013-04-23 20:12:02 +02:00
|
|
|
|
|
|
|
switch ($drequest->getRepository()->getVersionControlSystem()) {
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
2014-02-01 20:48:28 +01:00
|
|
|
$forms[] = id(clone $form)
|
|
|
|
->appendChild(pht('Search is not available in Subversion.'));
|
2013-04-23 20:12:02 +02:00
|
|
|
break;
|
|
|
|
default:
|
2014-02-01 20:48:28 +01:00
|
|
|
$forms[] = id(clone $form)
|
2013-04-23 20:12:02 +02:00
|
|
|
->appendChild(
|
2014-02-01 20:48:28 +01:00
|
|
|
id(new AphrontFormTextWithSubmitControl())
|
|
|
|
->setLabel(pht('File Name'))
|
|
|
|
->setSubmitLabel(pht('Search File Names'))
|
|
|
|
->setName('find')
|
|
|
|
->setValue($this->getRequest()->getStr('find')));
|
|
|
|
$forms[] = id(clone $form)
|
2013-04-23 20:12:02 +02:00
|
|
|
->appendChild(
|
2014-02-01 20:48:28 +01:00
|
|
|
id(new AphrontFormTextWithSubmitControl())
|
|
|
|
->setLabel(pht('Pattern'))
|
|
|
|
->setSubmitLabel(pht('Grep File Content'))
|
|
|
|
->setName('grep')
|
|
|
|
->setValue($this->getRequest()->getStr('grep')));
|
2013-04-23 20:12:02 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-05-11 17:23:19 +02:00
|
|
|
$filter = new AphrontListFilterView();
|
2014-02-01 20:48:28 +01:00
|
|
|
$filter->appendChild($forms);
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
if ($collapsed) {
|
2013-09-19 20:57:33 +02:00
|
|
|
$filter->setCollapsed(
|
|
|
|
pht('Show Search'),
|
|
|
|
pht('Hide Search'),
|
2014-02-01 20:48:28 +01:00
|
|
|
pht('Search for file names or content in this directory.'),
|
2013-09-19 20:57:33 +02:00
|
|
|
'#');
|
|
|
|
}
|
|
|
|
|
2015-05-22 17:22:25 +02:00
|
|
|
$filter = id(new PHUIBoxView())
|
|
|
|
->addClass('mlt mlb')
|
|
|
|
->appendChild($filter);
|
|
|
|
|
2013-05-11 17:23:19 +02:00
|
|
|
return $filter;
|
2013-04-23 20:12:02 +02:00
|
|
|
}
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
protected function markupText($text) {
|
2012-04-24 03:36:25 +02:00
|
|
|
$engine = PhabricatorMarkupEngine::newDiffusionMarkupEngine();
|
2013-03-04 21:33:05 +01:00
|
|
|
$engine->setConfig('viewer', $this->getRequest()->getUser());
|
2013-02-13 23:50:15 +01:00
|
|
|
$text = $engine->markupText($text);
|
2012-04-24 03:36:25 +02:00
|
|
|
|
2013-01-18 09:32:58 +01:00
|
|
|
$text = phutil_tag(
|
2012-04-24 03:36:25 +02:00
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'class' => 'phabricator-remarkup',
|
|
|
|
),
|
|
|
|
$text);
|
|
|
|
|
|
|
|
return $text;
|
|
|
|
}
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
protected function buildHeaderView(DiffusionRequest $drequest) {
|
2013-09-19 20:57:33 +02:00
|
|
|
$viewer = $this->getRequest()->getUser();
|
|
|
|
|
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setUser($viewer)
|
2013-09-23 21:55:23 +02:00
|
|
|
->setHeader($this->renderPathLinks($drequest, $mode = 'browse'))
|
2013-09-19 20:57:33 +02:00
|
|
|
->setPolicyObject($drequest->getRepository());
|
|
|
|
|
|
|
|
return $header;
|
|
|
|
}
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
protected function buildActionView(DiffusionRequest $drequest) {
|
|
|
|
$viewer = $this->getRequest()->getUser();
|
|
|
|
|
|
|
|
$view = id(new PhabricatorActionListView())
|
|
|
|
->setUser($viewer);
|
|
|
|
|
|
|
|
$history_uri = $drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'history',
|
|
|
|
));
|
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName(pht('View History'))
|
|
|
|
->setHref($history_uri)
|
2014-05-12 19:08:32 +02:00
|
|
|
->setIcon('fa-list'));
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
|
2014-05-13 22:52:48 +02:00
|
|
|
$behind_head = $drequest->getSymbolicCommit();
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
$head_uri = $drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'commit' => '',
|
|
|
|
'action' => 'browse',
|
|
|
|
));
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName(pht('Jump to HEAD'))
|
|
|
|
->setHref($head_uri)
|
2014-05-12 19:08:32 +02:00
|
|
|
->setIcon('fa-home')
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
->setDisabled(!$behind_head));
|
|
|
|
|
|
|
|
return $view;
|
|
|
|
}
|
|
|
|
|
2013-10-11 16:53:56 +02:00
|
|
|
protected function buildPropertyView(
|
|
|
|
DiffusionRequest $drequest,
|
|
|
|
PhabricatorActionListView $actions) {
|
|
|
|
|
2015-08-15 22:06:10 +02:00
|
|
|
$viewer = $this->getViewer();
|
2013-09-19 20:57:33 +02:00
|
|
|
|
2013-10-11 16:53:56 +02:00
|
|
|
$view = id(new PHUIPropertyListView())
|
|
|
|
->setUser($viewer)
|
|
|
|
->setActionList($actions);
|
2013-09-19 20:57:33 +02:00
|
|
|
|
2014-05-13 22:51:45 +02:00
|
|
|
$stable_commit = $drequest->getStableCommit();
|
2013-09-19 20:57:33 +02:00
|
|
|
|
|
|
|
$view->addProperty(
|
|
|
|
pht('Commit'),
|
|
|
|
phutil_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => $drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'commit',
|
|
|
|
'commit' => $stable_commit,
|
|
|
|
)),
|
|
|
|
),
|
|
|
|
$drequest->getRepository()->formatCommitName($stable_commit)));
|
|
|
|
|
2014-05-13 22:52:03 +02:00
|
|
|
if ($drequest->getSymbolicType() == 'tag') {
|
2013-11-04 21:16:53 +01:00
|
|
|
$symbolic = $drequest->getSymbolicCommit();
|
|
|
|
$view->addProperty(pht('Tag'), $symbolic);
|
2013-09-19 20:57:33 +02:00
|
|
|
|
2013-11-04 21:16:53 +01:00
|
|
|
$tags = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.tagsquery',
|
|
|
|
array(
|
|
|
|
'names' => array($symbolic),
|
|
|
|
'needMessages' => true,
|
|
|
|
));
|
|
|
|
$tags = DiffusionRepositoryTag::newFromConduit($tags);
|
|
|
|
|
|
|
|
$tags = mpull($tags, null, 'getName');
|
|
|
|
$tag = idx($tags, $symbolic);
|
|
|
|
|
|
|
|
if ($tag && strlen($tag->getMessage())) {
|
2015-09-19 20:29:01 +02:00
|
|
|
$view->addSectionHeader(
|
|
|
|
pht('Tag Content'), 'fa-tag');
|
2013-11-04 21:16:53 +01:00
|
|
|
$view->addTextContent($this->markupText($tag->getMessage()));
|
|
|
|
}
|
2013-09-19 20:57:33 +02:00
|
|
|
}
|
|
|
|
|
2015-08-15 22:06:10 +02:00
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
$owners = 'PhabricatorOwnersApplication';
|
|
|
|
if (PhabricatorApplication::isClassInstalled($owners)) {
|
|
|
|
$package_query = id(new PhabricatorOwnersPackageQuery())
|
|
|
|
->setViewer($viewer)
|
2015-08-18 22:36:05 +02:00
|
|
|
->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE))
|
2015-08-15 22:06:10 +02:00
|
|
|
->withControl(
|
|
|
|
$repository->getPHID(),
|
|
|
|
array(
|
|
|
|
$drequest->getPath(),
|
|
|
|
));
|
|
|
|
|
|
|
|
$package_query->execute();
|
|
|
|
|
|
|
|
$packages = $package_query->getControllingPackagesForPath(
|
|
|
|
$repository->getPHID(),
|
|
|
|
$drequest->getPath());
|
|
|
|
|
|
|
|
if ($packages) {
|
|
|
|
$ownership = id(new PHUIStatusListView())
|
|
|
|
->setUser($viewer);
|
|
|
|
|
|
|
|
foreach ($packages as $package) {
|
|
|
|
$icon = 'fa-list-alt';
|
|
|
|
$color = 'grey';
|
|
|
|
|
|
|
|
$item = id(new PHUIStatusItemView())
|
|
|
|
->setIcon($icon, $color)
|
|
|
|
->setTarget($viewer->renderHandle($package->getPHID()));
|
|
|
|
|
|
|
|
$ownership->addItem($item);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$ownership = phutil_tag('em', array(), pht('None'));
|
|
|
|
}
|
|
|
|
|
|
|
|
$view->addProperty(pht('Packages'), $ownership);
|
|
|
|
}
|
|
|
|
|
2013-09-19 20:57:33 +02:00
|
|
|
return $view;
|
|
|
|
}
|
|
|
|
|
2016-01-05 14:18:59 +01:00
|
|
|
private function buildOpenRevisions() {
|
|
|
|
$viewer = $this->getViewer();
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
$path = $drequest->getPath();
|
|
|
|
|
|
|
|
$path_map = id(new DiffusionPathIDQuery(array($path)))->loadPathIDs();
|
|
|
|
$path_id = idx($path_map, $path);
|
|
|
|
if (!$path_id) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-03-25 18:21:56 +01:00
|
|
|
$recent = (PhabricatorTime::getNow() - phutil_units('30 days in seconds'));
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
$revisions = id(new DifferentialRevisionQuery())
|
2016-01-05 14:18:59 +01:00
|
|
|
->setViewer($viewer)
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
->withPath($repository->getID(), $path_id)
|
|
|
|
->withStatus(DifferentialRevisionQuery::STATUS_OPEN)
|
2015-03-25 18:21:56 +01:00
|
|
|
->withUpdatedEpochBetween($recent, null)
|
2015-04-12 05:16:52 +02:00
|
|
|
->setOrder(DifferentialRevisionQuery::ORDER_MODIFIED)
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
->setLimit(10)
|
|
|
|
->needRelationships(true)
|
2014-02-19 02:57:45 +01:00
|
|
|
->needFlags(true)
|
|
|
|
->needDrafts(true)
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
->execute();
|
|
|
|
|
|
|
|
if (!$revisions) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-03-25 18:21:56 +01:00
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Open Revisions'))
|
|
|
|
->setSubheader(
|
|
|
|
pht('Recently updated open revisions affecting this file.'));
|
|
|
|
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
$view = id(new DifferentialRevisionListView())
|
2015-03-25 18:21:56 +01:00
|
|
|
->setHeader($header)
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
->setRevisions($revisions)
|
2016-01-05 14:18:59 +01:00
|
|
|
->setUser($viewer);
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
|
|
|
|
$phids = $view->getRequiredHandlePHIDs();
|
|
|
|
$handles = $this->loadViewerHandles($phids);
|
|
|
|
$view->setHandles($handles);
|
|
|
|
|
2015-02-19 17:11:17 +01:00
|
|
|
return $view;
|
Improve organization of Diffusion browse controllers
Summary:
Currently we have this:
- DiffusionController (abstract, has some random shared browse code)
- DiffusionBrowseController (concrete, Handles routing, directories, and search)
- DiffusionBrowseFileController (concrete, handles files)
Instead, do this:
- DiffusionController (no browse-related code)
- DiffusionBrowseController (abstract, shared browse code)
- DiffusionBrowseMainController (concrete, handles routing)
- DiffusionBrowseDirectoryController (concrete, handles directories)
- DiffusionBrowseFileController (concrete, handles files)
- DiffusionBrowseSearchController (concrete, handles search)
Feels a lot cleaner.
Test Plan: Looked at directories, searches, and files.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Differential Revision: https://secure.phabricator.com/D7045
2013-09-20 01:01:34 +02:00
|
|
|
}
|
|
|
|
|
2016-01-07 03:08:07 +01:00
|
|
|
private function loadBlame($path, $commit, $timeout) {
|
2016-01-06 15:15:25 +01:00
|
|
|
$blame = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.blame',
|
|
|
|
array(
|
|
|
|
'commit' => $commit,
|
|
|
|
'paths' => array($path),
|
2016-01-07 03:08:07 +01:00
|
|
|
'timeout' => $timeout,
|
2016-01-06 15:15:25 +01:00
|
|
|
));
|
|
|
|
|
2016-01-07 03:08:07 +01:00
|
|
|
$identifiers = idx($blame, $path, null);
|
2016-01-06 15:15:25 +01:00
|
|
|
|
|
|
|
if ($identifiers) {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
$commits = id(new DiffusionCommitQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withRepository($repository)
|
|
|
|
->withIdentifiers($identifiers)
|
|
|
|
// TODO: We only fetch this to improve author display behavior, but
|
|
|
|
// shouldn't really need to?
|
|
|
|
->needCommitData(true)
|
|
|
|
->execute();
|
|
|
|
$commits = mpull($commits, null, 'getCommitIdentifier');
|
|
|
|
} else {
|
|
|
|
$commits = array();
|
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
return array($identifiers, $commits);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderCommitLinks(array $commits, $handles) {
|
|
|
|
$links = array();
|
|
|
|
foreach ($commits as $identifier => $commit) {
|
|
|
|
$tooltip = $this->renderCommitTooltip(
|
|
|
|
$commit,
|
|
|
|
$commit->renderAuthorShortName($handles));
|
|
|
|
|
|
|
|
$commit_link = javelin_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => $commit->getURI(),
|
|
|
|
'sigil' => 'has-tooltip',
|
|
|
|
'meta' => array(
|
|
|
|
'tip' => $tooltip,
|
|
|
|
'align' => 'E',
|
|
|
|
'size' => 600,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
$commit->getShortName());
|
|
|
|
|
|
|
|
$links[$identifier] = $commit_link;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $links;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderRevisionLinks(array $revisions, $handles) {
|
|
|
|
$links = array();
|
|
|
|
|
|
|
|
foreach ($revisions as $revision) {
|
|
|
|
$revision_id = $revision->getID();
|
|
|
|
|
|
|
|
$tooltip = $this->renderRevisionTooltip($revision, $handles);
|
|
|
|
|
|
|
|
$revision_link = javelin_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
2016-01-07 03:52:13 +01:00
|
|
|
'href' => '/'.$revision->getMonogram(),
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
'sigil' => 'has-tooltip',
|
|
|
|
'meta' => array(
|
|
|
|
'tip' => $tooltip,
|
|
|
|
'align' => 'E',
|
|
|
|
'size' => 600,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
$revision->getMonogram());
|
|
|
|
|
|
|
|
$links[$revision_id] = $revision_link;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $links;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function renderPlaintextCorpus(
|
|
|
|
$file_corpus,
|
|
|
|
array $blame_list,
|
|
|
|
array $blame_commits,
|
|
|
|
$show_blame) {
|
|
|
|
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
|
|
|
|
if (!$show_blame) {
|
|
|
|
$corpus = $file_corpus;
|
|
|
|
} else {
|
|
|
|
$author_phids = array();
|
|
|
|
foreach ($blame_commits as $commit) {
|
|
|
|
$author_phid = $commit->getAuthorPHID();
|
|
|
|
if ($author_phid === null) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
$author_phids[$author_phid] = $author_phid;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($author_phids) {
|
|
|
|
$handles = $viewer->loadHandles($author_phids);
|
2016-01-06 15:15:25 +01:00
|
|
|
} else {
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$handles = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
$authors = array();
|
|
|
|
$names = array();
|
|
|
|
foreach ($blame_commits as $identifier => $commit) {
|
|
|
|
$author = $commit->renderAuthorShortName($handles);
|
|
|
|
$name = $commit->getShortName();
|
|
|
|
|
|
|
|
$authors[$identifier] = $author;
|
|
|
|
$names[$identifier] = $name;
|
|
|
|
}
|
|
|
|
|
|
|
|
$lines = phutil_split_lines($file_corpus);
|
|
|
|
|
|
|
|
$rows = array();
|
|
|
|
foreach ($lines as $line_number => $line) {
|
|
|
|
$commit_name = null;
|
|
|
|
$author = null;
|
|
|
|
|
|
|
|
if (isset($blame_list[$line_number])) {
|
|
|
|
$identifier = $blame_list[$line_number];
|
|
|
|
|
|
|
|
if (isset($names[$identifier])) {
|
|
|
|
$commit_name = $names[$identifier];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($authors[$identifier])) {
|
|
|
|
$author = $authors[$identifier];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$rows[] = sprintf(
|
|
|
|
'%-10s %-20s %s',
|
|
|
|
$commit_name,
|
|
|
|
$author,
|
|
|
|
$line);
|
2016-01-06 15:15:25 +01:00
|
|
|
}
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
$corpus = implode('', $rows);
|
2016-01-06 15:15:25 +01:00
|
|
|
}
|
|
|
|
|
Make mundane performance improvements to Diffusion browse views
Summary:
Ref T2450. This reorganizes code to improve performance.
Mostly, there are a lot of things which are unique per commit (author name, links, short name, etc), but we were rendering them for every line.
This often meant we'd render the same author's name thousands of times. This is slower than rendering it only once.
In 99% of interfaces this doesn't matter, but blame is weird and it's significant on big files.
Test Plan:
Locally, `__phutil_library_map__.php` now has costs of roughly:
- 550ms for main content (from 650ms before the patch).
- 1,500ms for blame content (frrom 1,800ms before the patch).
So this isn't huge, is a decent ~20%-ish performance gain for shuffling some stuff around.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T2450
Differential Revision: https://secure.phabricator.com/D14963
2016-01-07 02:59:06 +01:00
|
|
|
return phutil_tag(
|
|
|
|
'textarea',
|
|
|
|
array(
|
|
|
|
'style' => 'border: none; width: 100%; height: 80em; '.
|
|
|
|
'font-family: monospace',
|
|
|
|
),
|
|
|
|
$corpus);
|
2016-01-06 15:15:25 +01:00
|
|
|
}
|
|
|
|
|
2011-03-08 02:25:47 +01:00
|
|
|
}
|