mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52:41 +01:00
When users browse to a submodule path in Diffusion explicitly, don't fatal
Summary: Ref T13030. See PHI254. This behavior could be cleaner than I've made it, but it fixes the "this is totally broken" issue, replacing a fatal/exception with an informative (just not terribly useful) page. Test Plan: - Added a submodule to a repository. - In Diffusion, clicked some other file next to the submodule, then edited the URI to the submodule path instead. - Before patch: fatal. - After patch: relatively useful message about this being a submodule. Note that it's normally hard to hit this URI directly. In the browse view, submodules are marked up as directories and linked to a separate submodule resolution flow. {F5321524} Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13030 Differential Revision: https://secure.phabricator.com/D18831
This commit is contained in:
parent
a1ad184ddd
commit
7cbbe2ccf7
3 changed files with 38 additions and 0 deletions
|
@ -52,6 +52,36 @@ final class DiffusionBrowseQueryConduitAPIMethod
|
||||||
$commit,
|
$commit,
|
||||||
$path);
|
$path);
|
||||||
} catch (CommandException $e) {
|
} catch (CommandException $e) {
|
||||||
|
// The "cat-file" command may fail if the path legitimately does not
|
||||||
|
// exist, but it may also fail if the path is a submodule. This can
|
||||||
|
// produce either "Not a valid object name" or "could not get object
|
||||||
|
// info".
|
||||||
|
|
||||||
|
// To detect if we have a submodule, use `git ls-tree`. If the path
|
||||||
|
// is a submodule, we'll get a "160000" mode mask with type "commit".
|
||||||
|
|
||||||
|
list($sub_err, $sub_stdout) = $repository->execLocalCommand(
|
||||||
|
'ls-tree %s -- %s',
|
||||||
|
$commit,
|
||||||
|
$path);
|
||||||
|
if (!$sub_err) {
|
||||||
|
// If the path failed "cat-file" but "ls-tree" worked, we assume it
|
||||||
|
// must be a submodule. If it is, the output will look something
|
||||||
|
// like this:
|
||||||
|
//
|
||||||
|
// 160000 commit <hash> <path>
|
||||||
|
//
|
||||||
|
// We make sure it has the 160000 mode mask to confirm that it's
|
||||||
|
// definitely a submodule.
|
||||||
|
$mode = (int)$sub_stdout;
|
||||||
|
if ($mode & 160000) {
|
||||||
|
$submodule_reason = DiffusionBrowseResultSet::REASON_IS_SUBMODULE;
|
||||||
|
$result
|
||||||
|
->setReasonForEmptyResultSet($submodule_reason);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$stderr = $e->getStderr();
|
$stderr = $e->getStderr();
|
||||||
if (preg_match('/^fatal: Not a valid object name/', $stderr)) {
|
if (preg_match('/^fatal: Not a valid object name/', $stderr)) {
|
||||||
// Grab two logs, since the first one is when the object was deleted.
|
// Grab two logs, since the first one is when the object was deleted.
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
final class DiffusionBrowseResultSet extends Phobject {
|
final class DiffusionBrowseResultSet extends Phobject {
|
||||||
|
|
||||||
const REASON_IS_FILE = 'is-file';
|
const REASON_IS_FILE = 'is-file';
|
||||||
|
const REASON_IS_SUBMODULE = 'is-submodule';
|
||||||
const REASON_IS_DELETED = 'is-deleted';
|
const REASON_IS_DELETED = 'is-deleted';
|
||||||
const REASON_IS_NONEXISTENT = 'nonexistent';
|
const REASON_IS_NONEXISTENT = 'nonexistent';
|
||||||
const REASON_BAD_COMMIT = 'bad-commit';
|
const REASON_BAD_COMMIT = 'bad-commit';
|
||||||
|
|
|
@ -40,6 +40,13 @@ final class DiffusionEmptyResultView extends DiffusionView {
|
||||||
$body = pht('This path was an empty directory at %s.', $commit);
|
$body = pht('This path was an empty directory at %s.', $commit);
|
||||||
$severity = PHUIInfoView::SEVERITY_NOTICE;
|
$severity = PHUIInfoView::SEVERITY_NOTICE;
|
||||||
break;
|
break;
|
||||||
|
case DiffusionBrowseResultSet::REASON_IS_SUBMODULE:
|
||||||
|
$title = pht('Submodule');
|
||||||
|
// TODO: We could improve this, but it is normally difficult to
|
||||||
|
// reach this page for a submodule.
|
||||||
|
$body = pht('This path was a submodule at %s.', $commit);
|
||||||
|
$severity = PHUIInfoView::SEVERITY_NOTICE;
|
||||||
|
break;
|
||||||
case DiffusionBrowseResultSet::REASON_IS_DELETED:
|
case DiffusionBrowseResultSet::REASON_IS_DELETED:
|
||||||
$deleted = $this->browseResultSet->getDeletedAtCommit();
|
$deleted = $this->browseResultSet->getDeletedAtCommit();
|
||||||
$existed = $this->browseResultSet->getExistedAtCommit();
|
$existed = $this->browseResultSet->getExistedAtCommit();
|
||||||
|
|
Loading…
Reference in a new issue