mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 05:50:55 +01:00
Show a better message for empty repositories and invalid branches
Summary: Ref T1493. - When viewing an invalid branch, show a "there is no such branch" message. - When viewing an empty repository, show a "this repository is empty" message. Test Plan: - Viewed empty, bad branch, and nonempty in Git. - Viewed empty, bad branch, and nonempty in Mercurial. - Viewed empty and nonempty in Subversion. Reviewers: btrahan, chad Reviewed By: chad Subscribers: epriestley Maniphest Tasks: T1493 Differential Revision: https://secure.phabricator.com/D9912
This commit is contained in:
parent
17badfacac
commit
ae263ddde5
6 changed files with 98 additions and 14 deletions
|
@ -7,6 +7,9 @@ final class DiffusionRepositoryController extends DiffusionController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processRequest() {
|
public function processRequest() {
|
||||||
|
$request = $this->getRequest();
|
||||||
|
$viewer = $request->getUser();
|
||||||
|
|
||||||
$drequest = $this->getDiffusionRequest();
|
$drequest = $this->getDiffusionRequest();
|
||||||
$repository = $drequest->getRepository();
|
$repository = $drequest->getRepository();
|
||||||
|
|
||||||
|
@ -16,7 +19,74 @@ final class DiffusionRepositoryController extends DiffusionController {
|
||||||
$content[] = $crumbs;
|
$content[] = $crumbs;
|
||||||
|
|
||||||
$content[] = $this->buildPropertiesTable($drequest->getRepository());
|
$content[] = $this->buildPropertiesTable($drequest->getRepository());
|
||||||
|
|
||||||
|
// Before we do any work, make sure we're looking at a some content: we're
|
||||||
|
// on a valid branch, and the repository is not empty.
|
||||||
|
$page_has_content = false;
|
||||||
|
$empty_title = null;
|
||||||
|
$empty_message = null;
|
||||||
|
|
||||||
|
// If this VCS supports branches, check that the selected branch actually
|
||||||
|
// exists.
|
||||||
|
if ($drequest->supportsBranches()) {
|
||||||
|
$ref_cursor = id(new PhabricatorRepositoryRefCursorQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withRepositoryPHIDs(array($repository->getPHID()))
|
||||||
|
->withRefTypes(array(PhabricatorRepositoryRefCursor::TYPE_BRANCH))
|
||||||
|
->withRefNames(array($drequest->getBranch()))
|
||||||
|
->executeOne();
|
||||||
|
if ($ref_cursor) {
|
||||||
|
// This is a valid branch, so we necessarily have some content.
|
||||||
|
$page_has_content = true;
|
||||||
|
} else {
|
||||||
|
$empty_title = pht('No Such Branch');
|
||||||
|
$empty_message = pht(
|
||||||
|
'There is no branch named "%s" in this repository.',
|
||||||
|
$drequest->getBranch());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we didn't find any branches, check if there are any commits at all.
|
||||||
|
// This can tailor the message for empty repositories.
|
||||||
|
if (!$page_has_content) {
|
||||||
|
$any_commit = id(new DiffusionCommitQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withRepository($repository)
|
||||||
|
->setLimit(1)
|
||||||
|
->execute();
|
||||||
|
if ($any_commit) {
|
||||||
|
if (!$drequest->supportsBranches()) {
|
||||||
|
$page_has_content = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$empty_title = pht('Empty Repository');
|
||||||
|
$empty_message = pht(
|
||||||
|
'This repository does not have any commits yet.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($page_has_content) {
|
||||||
|
$content[] = $this->buildNormalContent($drequest);
|
||||||
|
} else {
|
||||||
|
$content[] = id(new AphrontErrorView())
|
||||||
|
->setTitle($empty_title)
|
||||||
|
->setSeverity(AphrontErrorView::SEVERITY_WARNING)
|
||||||
|
->setErrors(array($empty_message));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->buildApplicationPage(
|
||||||
|
$content,
|
||||||
|
array(
|
||||||
|
'title' => $drequest->getRepository()->getName(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function buildNormalContent(DiffusionRequest $drequest) {
|
||||||
|
$repository = $drequest->getRepository();
|
||||||
|
|
||||||
$phids = array();
|
$phids = array();
|
||||||
|
$content = array();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$history_results = $this->callConduitWithDiffusionRequest(
|
$history_results = $this->callConduitWithDiffusionRequest(
|
||||||
|
@ -133,11 +203,7 @@ final class DiffusionRepositoryController extends DiffusionController {
|
||||||
$content[] = $panel;
|
$content[] = $panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->buildApplicationPage(
|
return $content;
|
||||||
$content,
|
|
||||||
array(
|
|
||||||
'title' => $drequest->getRepository()->getName(),
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildPropertiesTable(PhabricatorRepository $repository) {
|
private function buildPropertiesTable(PhabricatorRepository $repository) {
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
final class DiffusionGitRequest extends DiffusionRequest {
|
final class DiffusionGitRequest extends DiffusionRequest {
|
||||||
|
|
||||||
protected function getSupportsBranches() {
|
public function supportsBranches() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
final class DiffusionMercurialRequest extends DiffusionRequest {
|
final class DiffusionMercurialRequest extends DiffusionRequest {
|
||||||
|
|
||||||
protected function getSupportsBranches() {
|
public function supportsBranches() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ abstract class DiffusionRequest {
|
||||||
private $user;
|
private $user;
|
||||||
private $branchObject = false;
|
private $branchObject = false;
|
||||||
|
|
||||||
abstract protected function getSupportsBranches();
|
abstract public function supportsBranches();
|
||||||
abstract protected function isStableCommit($symbol);
|
abstract protected function isStableCommit($symbol);
|
||||||
|
|
||||||
protected function didInitialize() {
|
protected function didInitialize() {
|
||||||
|
@ -98,7 +98,7 @@ abstract class DiffusionRequest {
|
||||||
$callsign = phutil_unescape_uri_path_component(idx($data, 'callsign'));
|
$callsign = phutil_unescape_uri_path_component(idx($data, 'callsign'));
|
||||||
$object = self::newFromCallsign($callsign, $request->getUser());
|
$object = self::newFromCallsign($callsign, $request->getUser());
|
||||||
|
|
||||||
$use_branches = $object->getSupportsBranches();
|
$use_branches = $object->supportsBranches();
|
||||||
$parsed = self::parseRequestBlob(idx($data, 'dblob'), $use_branches);
|
$parsed = self::parseRequestBlob(idx($data, 'dblob'), $use_branches);
|
||||||
|
|
||||||
$object->setUser($request->getUser());
|
$object->setUser($request->getUser());
|
||||||
|
@ -188,7 +188,7 @@ abstract class DiffusionRequest {
|
||||||
$this->initFromConduit = idx($data, 'initFromConduit', true);
|
$this->initFromConduit = idx($data, 'initFromConduit', true);
|
||||||
|
|
||||||
$this->symbolicCommit = idx($data, 'commit');
|
$this->symbolicCommit = idx($data, 'commit');
|
||||||
if ($this->getSupportsBranches()) {
|
if ($this->supportsBranches()) {
|
||||||
$this->branch = idx($data, 'branch');
|
$this->branch = idx($data, 'branch');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -712,7 +712,7 @@ abstract class DiffusionRequest {
|
||||||
if ($this->symbolicCommit) {
|
if ($this->symbolicCommit) {
|
||||||
$ref = $this->symbolicCommit;
|
$ref = $this->symbolicCommit;
|
||||||
} else {
|
} else {
|
||||||
if ($this->getSupportsBranches()) {
|
if ($this->supportsBranches()) {
|
||||||
$ref = $this->getResolvableBranchName($this->getBranch());
|
$ref = $this->getResolvableBranchName($this->getBranch());
|
||||||
} else {
|
} else {
|
||||||
$ref = 'HEAD';
|
$ref = 'HEAD';
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
final class DiffusionSvnRequest extends DiffusionRequest {
|
final class DiffusionSvnRequest extends DiffusionRequest {
|
||||||
|
|
||||||
protected function getSupportsBranches() {
|
public function supportsBranches() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ final class PhabricatorRepositoryRefCursorQuery
|
||||||
|
|
||||||
private $repositoryPHIDs;
|
private $repositoryPHIDs;
|
||||||
private $refTypes;
|
private $refTypes;
|
||||||
|
private $refNames;
|
||||||
|
|
||||||
public function withRepositoryPHIDs(array $phids) {
|
public function withRepositoryPHIDs(array $phids) {
|
||||||
$this->repositoryPHIDs = $phids;
|
$this->repositoryPHIDs = $phids;
|
||||||
|
@ -16,6 +17,11 @@ final class PhabricatorRepositoryRefCursorQuery
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function withRefNames(array $names) {
|
||||||
|
$this->refNames = $names;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
protected function loadPage() {
|
protected function loadPage() {
|
||||||
$table = new PhabricatorRepositoryRefCursor();
|
$table = new PhabricatorRepositoryRefCursor();
|
||||||
$conn_r = $table->establishConnection('r');
|
$conn_r = $table->establishConnection('r');
|
||||||
|
@ -56,20 +62,32 @@ final class PhabricatorRepositoryRefCursorQuery
|
||||||
private function buildWhereClause(AphrontDatabaseConnection $conn_r) {
|
private function buildWhereClause(AphrontDatabaseConnection $conn_r) {
|
||||||
$where = array();
|
$where = array();
|
||||||
|
|
||||||
if ($this->repositoryPHIDs) {
|
if ($this->repositoryPHIDs !== null) {
|
||||||
$where[] = qsprintf(
|
$where[] = qsprintf(
|
||||||
$conn_r,
|
$conn_r,
|
||||||
'repositoryPHID IN (%Ls)',
|
'repositoryPHID IN (%Ls)',
|
||||||
$this->repositoryPHIDs);
|
$this->repositoryPHIDs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->refTypes) {
|
if ($this->refTypes !== null) {
|
||||||
$where[] = qsprintf(
|
$where[] = qsprintf(
|
||||||
$conn_r,
|
$conn_r,
|
||||||
'refType IN (%Ls)',
|
'refType IN (%Ls)',
|
||||||
$this->refTypes);
|
$this->refTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->refNames !== null) {
|
||||||
|
$name_hashes = array();
|
||||||
|
foreach ($this->refNames as $name) {
|
||||||
|
$name_hashes[] = PhabricatorHash::digestForIndex($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
$where[] = qsprintf(
|
||||||
|
$conn_r,
|
||||||
|
'refNameHash IN (%Ls)',
|
||||||
|
$name_hashes);
|
||||||
|
}
|
||||||
|
|
||||||
$where[] = $this->buildPagingClause($conn_r);
|
$where[] = $this->buildPagingClause($conn_r);
|
||||||
|
|
||||||
return $this->formatWhereClause($where);
|
return $this->formatWhereClause($where);
|
||||||
|
|
Loading…
Reference in a new issue