mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 08:42:41 +01:00
Open editor from stack trace
Summary: I've considered that user may have set editor but not checked out Phabricator repositories. But stack trace is useful mainly for developers. Test Plan: Click on path in Unhandled Exception. Repeat with disabled editor. Reviewers: epriestley Reviewed By: epriestley CC: aran Differential Revision: https://secure.phabricator.com/D2107
This commit is contained in:
parent
09172a1937
commit
d1b7059a2d
5 changed files with 34 additions and 29 deletions
|
@ -445,8 +445,14 @@ class AphrontDefaultApplicationConfiguration
|
|||
$class = phutil_escape_html(get_class($ex));
|
||||
$message = phutil_escape_html($ex->getMessage());
|
||||
|
||||
$user = $this->getRequest()->getUser();
|
||||
if (!$user) {
|
||||
// If we hit an exception very early, we won't have a user.
|
||||
$user = new PhabricatorUser();
|
||||
}
|
||||
|
||||
if (PhabricatorEnv::getEnvConfig('phabricator.show-stack-traces')) {
|
||||
$trace = $this->renderStackTrace($ex->getTrace());
|
||||
$trace = $this->renderStackTrace($ex->getTrace(), $user);
|
||||
} else {
|
||||
$trace = null;
|
||||
}
|
||||
|
@ -457,12 +463,6 @@ class AphrontDefaultApplicationConfiguration
|
|||
$trace.
|
||||
'</div>';
|
||||
|
||||
$user = $this->getRequest()->getUser();
|
||||
if (!$user) {
|
||||
// If we hit an exception very early, we won't have a user.
|
||||
$user = new PhabricatorUser();
|
||||
}
|
||||
|
||||
$dialog = new AphrontDialogView();
|
||||
$dialog
|
||||
->setTitle('Unhandled Exception ("'.$class.'")')
|
||||
|
@ -525,20 +525,17 @@ class AphrontDefaultApplicationConfiguration
|
|||
));
|
||||
}
|
||||
|
||||
private function renderStackTrace($trace) {
|
||||
private function renderStackTrace($trace, PhabricatorUser $user) {
|
||||
|
||||
$libraries = PhutilBootloader::getInstance()->getAllLibraries();
|
||||
|
||||
// TODO: Make this configurable?
|
||||
$host = 'https://secure.phabricator.com';
|
||||
$path = 'https://secure.phabricator.com/diffusion/%s/browse/master/src/';
|
||||
|
||||
$browse = array(
|
||||
'arcanist' =>
|
||||
$host.'/diffusion/ARC/browse/master/src/',
|
||||
'phutil' =>
|
||||
$host.'/diffusion/PHU/browse/master/src/',
|
||||
'phabricator' =>
|
||||
$host.'/diffusion/P/browse/master/src/',
|
||||
$callsigns = array(
|
||||
'arcanist' => 'ARC',
|
||||
'phutil' => 'PHU',
|
||||
'phabricator' => 'P',
|
||||
);
|
||||
|
||||
$rows = array();
|
||||
|
@ -565,14 +562,22 @@ class AphrontDefaultApplicationConfiguration
|
|||
}
|
||||
|
||||
if ($file) {
|
||||
if (isset($browse[$lib])) {
|
||||
if (isset($callsigns[$lib])) {
|
||||
$attrs = array(
|
||||
'href' => $user->loadEditorLink(
|
||||
'/src/'.$relative,
|
||||
$part['line'],
|
||||
$callsigns[$lib]),
|
||||
'title' => $file,
|
||||
);
|
||||
if (!$attrs['href']) {
|
||||
$attrs['href'] = sprintf($path, $callsigns[$lib]).
|
||||
$relative.'$'.$part['line'];
|
||||
$attrs['target'] = '_blank';
|
||||
}
|
||||
$file_name = phutil_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $browse[$lib].$relative.'$'.$part['line'],
|
||||
'title' => $file,
|
||||
'target' => '_blank',
|
||||
),
|
||||
$attrs,
|
||||
phutil_escape_html($relative));
|
||||
} else {
|
||||
$file_name = phutil_render_tag(
|
||||
|
|
|
@ -256,7 +256,8 @@ final class DifferentialChangesetListView extends AphrontView {
|
|||
$changeset->getAbsoluteRepositoryPath($this->diff, $repository),
|
||||
'/');
|
||||
$line = 1; // TODO: get first changed line
|
||||
$editor_link = $user->loadEditorLink($path, $line, $repository);
|
||||
$callsign = $repository->getCallsign();
|
||||
$editor_link = $user->loadEditorLink($path, $line, $callsign);
|
||||
if ($editor_link) {
|
||||
$meta['editor'] = $editor_link;
|
||||
} else {
|
||||
|
|
|
@ -200,7 +200,7 @@ final class DifferentialDiffTableOfContentsView extends AphrontView {
|
|||
$editor_link = $this->user->loadEditorLink(
|
||||
implode(' ', $paths),
|
||||
1, // line number
|
||||
$this->repository);
|
||||
$this->repository->getCallsign());
|
||||
if ($editor_link) {
|
||||
$editor_link = phutil_render_tag(
|
||||
'a',
|
||||
|
|
|
@ -221,7 +221,8 @@ final class DiffusionBrowseFileController extends DiffusionController {
|
|||
$path = $drequest->getPath();
|
||||
$line = 1;
|
||||
|
||||
$editor_link = $user->loadEditorLink($path, $line, $repository);
|
||||
$callsign = $repository->getCallsign();
|
||||
$editor_link = $user->loadEditorLink($path, $line, $callsign);
|
||||
if (!$editor_link) {
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -413,16 +413,14 @@ final class PhabricatorUser extends PhabricatorUserDAO {
|
|||
return $preferences;
|
||||
}
|
||||
|
||||
public function loadEditorLink($path,
|
||||
$line,
|
||||
PhabricatorRepository $repository) {
|
||||
public function loadEditorLink($path, $line, $callsign) {
|
||||
$editor = $this->loadPreferences()->getPreference(
|
||||
PhabricatorUserPreferences::PREFERENCE_EDITOR);
|
||||
if ($editor) {
|
||||
return strtr($editor, array(
|
||||
'%f' => phutil_escape_uri($path),
|
||||
'%l' => phutil_escape_uri($line),
|
||||
'%r' => phutil_escape_uri($repository->getCallsign()),
|
||||
'%r' => phutil_escape_uri($callsign),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue