diff --git a/src/applications/diffusion/controller/file/DiffusionBrowseFileController.php b/src/applications/diffusion/controller/file/DiffusionBrowseFileController.php index 6ced8bf77b..84e572b186 100644 --- a/src/applications/diffusion/controller/file/DiffusionBrowseFileController.php +++ b/src/applications/diffusion/controller/file/DiffusionBrowseFileController.php @@ -54,17 +54,20 @@ class DiffusionBrowseFileController extends DiffusionController { } $select .= ''; + require_celerity_resource('diffusion-source-css'); + $view_select_panel = new AphrontPanelView(); $view_select_form = phutil_render_tag( 'form', array( 'action' => $request->getRequestURI(), 'method' => 'get', - 'style' => 'display: inline', + 'class' => 'diffusion-browse-type-form', ), $select. - ''); + ''); $view_select_panel->appendChild($view_select_form); + $view_select_panel->appendChild('
'); // Build the content of the file. $corpus = $this->buildCorpus($selected); @@ -102,7 +105,7 @@ class DiffusionBrowseFileController extends DiffusionController { */ public function getImageType($path) { $ext = pathinfo($path); - $ext = $ext['extension']; + $ext = idx($ext, 'extension'); return idx($this->imageTypes, $ext); } @@ -173,7 +176,6 @@ class DiffusionBrowseFileController extends DiffusionController { case 'blame': default: require_celerity_resource('syntax-highlighting-css'); - require_celerity_resource('diffusion-source-css'); list($text_list, $rev_list, $blame_dict) = $file_query->getBlameData(); @@ -215,10 +217,14 @@ class DiffusionBrowseFileController extends DiffusionController { $rows = array(); $n = 1; - $epoch_list = ipull($blame_dict, 'epoch'); - $max = max($epoch_list); - $min = min($epoch_list); - $range = $max - $min + 1; + if ($blame_dict) { + $epoch_list = ipull($blame_dict, 'epoch'); + $max = max($epoch_list); + $min = min($epoch_list); + $range = $max - $min + 1; + } else { + $range = 1; + } foreach ($text_list as $k => $line) { if ($needs_blame) { @@ -284,11 +290,12 @@ class DiffusionBrowseFileController extends DiffusionController { // Create the row display. $uri_path = $drequest->getUriPath(); - $uri_rev = $drequest->getCommit(); + $uri_rev = $drequest->getStableCommitName(); $l = phutil_render_tag( 'a', array( + 'class' => 'diffusion-line-link', 'href' => $uri_path.';'.$uri_rev.'$'.$n, ), $n); diff --git a/src/applications/diffusion/query/browse/git/DiffusionGitBrowseQuery.php b/src/applications/diffusion/query/browse/git/DiffusionGitBrowseQuery.php index a044b022b8..02c25fee5c 100644 --- a/src/applications/diffusion/query/browse/git/DiffusionGitBrowseQuery.php +++ b/src/applications/diffusion/query/browse/git/DiffusionGitBrowseQuery.php @@ -27,34 +27,40 @@ final class DiffusionGitBrowseQuery extends DiffusionBrowseQuery { $local_path = $repository->getDetail('local-path'); - try { - list($stdout) = execx( - "(cd %s && git cat-file -t %s:%s)", - $local_path, - $commit, - $path); - } catch (CommandException $e) { - $stderr = $e->getStdErr(); - if (preg_match('/^fatal: Not a valid object name/', $stderr)) { - // Grab two logs, since the first one is when the object was deleted. + if ($path == '') { + // Fast path to improve the performance of the repository view; we know + // the root is always a tree at any commit and always exists. + $stdout = 'tree'; + } else { + try { list($stdout) = execx( - '(cd %s && git log -n2 --format="%%H" %s -- %s)', + "(cd %s && git cat-file -t %s:%s)", $local_path, $commit, $path); - $stdout = trim($stdout); - if ($stdout) { - $commits = explode("\n", $stdout); - $this->reason = self::REASON_IS_DELETED; - $this->deletedAtCommit = idx($commits, 0); - $this->existedAtCommit = idx($commits, 1); - return array(); - } + } catch (CommandException $e) { + $stderr = $e->getStdErr(); + if (preg_match('/^fatal: Not a valid object name/', $stderr)) { + // Grab two logs, since the first one is when the object was deleted. + list($stdout) = execx( + '(cd %s && git log -n2 --format="%%H" %s -- %s)', + $local_path, + $commit, + $path); + $stdout = trim($stdout); + if ($stdout) { + $commits = explode("\n", $stdout); + $this->reason = self::REASON_IS_DELETED; + $this->deletedAtCommit = idx($commits, 0); + $this->existedAtCommit = idx($commits, 1); + return array(); + } - $this->reason = self::REASON_IS_NONEXISTENT; - return array(); - } else { - throw $e; + $this->reason = self::REASON_IS_NONEXISTENT; + return array(); + } else { + throw $e; + } } } diff --git a/src/applications/diffusion/request/base/DiffusionRequest.php b/src/applications/diffusion/request/base/DiffusionRequest.php index 4498d136c1..d28a875050 100644 --- a/src/applications/diffusion/request/base/DiffusionRequest.php +++ b/src/applications/diffusion/request/base/DiffusionRequest.php @@ -27,6 +27,7 @@ class DiffusionRequest { protected $repository; protected $repositoryCommit; protected $repositoryCommitData; + protected $stableCommitName; final private function __construct() { //