mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-30 02:32:42 +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,
|
||||
$path);
|
||||
} 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();
|
||||
if (preg_match('/^fatal: Not a valid object name/', $stderr)) {
|
||||
// Grab two logs, since the first one is when the object was deleted.
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
final class DiffusionBrowseResultSet extends Phobject {
|
||||
|
||||
const REASON_IS_FILE = 'is-file';
|
||||
const REASON_IS_SUBMODULE = 'is-submodule';
|
||||
const REASON_IS_DELETED = 'is-deleted';
|
||||
const REASON_IS_NONEXISTENT = 'nonexistent';
|
||||
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);
|
||||
$severity = PHUIInfoView::SEVERITY_NOTICE;
|
||||
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:
|
||||
$deleted = $this->browseResultSet->getDeletedAtCommit();
|
||||
$existed = $this->browseResultSet->getExistedAtCommit();
|
||||
|
|
Loading…
Reference in a new issue