mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-26 07:20:57 +01:00
96dd530c44
Summary: Hosted repositories have muddied this distinction somewhat. In some cases, we only want to use the real remote URI, and the call is only relevant for imported repositories. In other cases, we want the URI we'd plug into `git clone`. Move this logic into `PhabricatorRepository` and make the distinction more clear. Test Plan: Viewed SVN, Git, and Mercurial hosted and remote repositories, all the URIs looked reasonable. Reviewers: btrahan Reviewed By: btrahan CC: aran, dctrwatson Differential Revision: https://secure.phabricator.com/D8096
143 lines
4.1 KiB
PHP
143 lines
4.1 KiB
PHP
<?php
|
|
|
|
final class DiffusionExternalController extends DiffusionController {
|
|
|
|
public function willProcessRequest(array $data) {
|
|
// Don't build a DiffusionRequest.
|
|
}
|
|
|
|
public function shouldAllowPublic() {
|
|
return true;
|
|
}
|
|
|
|
public function processRequest() {
|
|
$request = $this->getRequest();
|
|
|
|
$uri = $request->getStr('uri');
|
|
$id = $request->getStr('id');
|
|
|
|
$repositories = id(new PhabricatorRepositoryQuery())
|
|
->setViewer($request->getUser())
|
|
->execute();
|
|
|
|
if ($uri) {
|
|
$uri_path = id(new PhutilURI($uri))->getPath();
|
|
$matches = array();
|
|
|
|
// Try to figure out which tracked repository this external lives in by
|
|
// comparing repository metadata. We look for an exact match, but accept
|
|
// a partial match.
|
|
|
|
foreach ($repositories as $key => $repository) {
|
|
$remote_uri = new PhutilURI($repository->getRemoteURI());
|
|
if ($remote_uri->getPath() == $uri_path) {
|
|
$matches[$key] = 1;
|
|
}
|
|
if ($repository->getPublicCloneURI() == $uri) {
|
|
$matches[$key] = 2;
|
|
}
|
|
if ($repository->getRemoteURI() == $uri) {
|
|
$matches[$key] = 3;
|
|
}
|
|
}
|
|
|
|
arsort($matches);
|
|
$best_match = head_key($matches);
|
|
|
|
if ($best_match) {
|
|
$repository = $repositories[$best_match];
|
|
$redirect = DiffusionRequest::generateDiffusionURI(
|
|
array(
|
|
'action' => 'browse',
|
|
'callsign' => $repository->getCallsign(),
|
|
'branch' => $repository->getDefaultBranch(),
|
|
'commit' => $id,
|
|
));
|
|
return id(new AphrontRedirectResponse())->setURI($redirect);
|
|
}
|
|
}
|
|
|
|
// TODO: This is a rare query but does a table scan, add a key?
|
|
|
|
$commits = id(new PhabricatorRepositoryCommit())->loadAllWhere(
|
|
'commitIdentifier = %s',
|
|
$id);
|
|
|
|
if (empty($commits)) {
|
|
$desc = null;
|
|
if ($uri) {
|
|
$desc = $uri.', at ';
|
|
}
|
|
$desc .= $id;
|
|
|
|
$content = id(new AphrontErrorView())
|
|
->setTitle(pht('Unknown External'))
|
|
->setSeverity(AphrontErrorView::SEVERITY_WARNING)
|
|
->appendChild(phutil_tag(
|
|
'p',
|
|
array(),
|
|
pht("This external (%s) does not appear in any tracked ".
|
|
"repository. It may exist in an untracked repository that ".
|
|
"Diffusion does not know about.", $desc)));
|
|
} else if (count($commits) == 1) {
|
|
$commit = head($commits);
|
|
$repo = $repositories[$commit->getRepositoryID()];
|
|
$redirect = DiffusionRequest::generateDiffusionURI(
|
|
array(
|
|
'action' => 'browse',
|
|
'callsign' => $repo->getCallsign(),
|
|
'branch' => $repo->getDefaultBranch(),
|
|
'commit' => $commit->getCommitIdentifier(),
|
|
));
|
|
return id(new AphrontRedirectResponse())->setURI($redirect);
|
|
} else {
|
|
|
|
$rows = array();
|
|
foreach ($commits as $commit) {
|
|
$repo = $repositories[$commit->getRepositoryID()];
|
|
$href = DiffusionRequest::generateDiffusionURI(
|
|
array(
|
|
'action' => 'browse',
|
|
'callsign' => $repo->getCallsign(),
|
|
'branch' => $repo->getDefaultBranch(),
|
|
'commit' => $commit->getCommitIdentifier(),
|
|
));
|
|
$rows[] = array(
|
|
phutil_tag(
|
|
'a',
|
|
array(
|
|
'href' => $href,
|
|
),
|
|
'r'.$repo->getCallsign().$commit->getCommitIdentifier()),
|
|
$commit->loadCommitData()->getSummary(),
|
|
);
|
|
}
|
|
|
|
$table = new AphrontTableView($rows);
|
|
$table->setHeaders(
|
|
array(
|
|
pht('Commit'),
|
|
pht('Description'),
|
|
));
|
|
$table->setColumnClasses(
|
|
array(
|
|
'pri',
|
|
'wide',
|
|
));
|
|
|
|
$content = new AphrontPanelView();
|
|
$content->setHeader(pht('Multiple Matching Commits'));
|
|
$content->setCaption(
|
|
pht('This external reference matches multiple known commits.'));
|
|
$content->appendChild($table);
|
|
}
|
|
|
|
return $this->buildApplicationPage(
|
|
$content,
|
|
array(
|
|
'title' => pht('Unresolvable External'),
|
|
'device' => true,
|
|
));
|
|
}
|
|
|
|
}
|