Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/controller/DifferentialController.php
<?php | <?php | ||||
abstract class DifferentialController extends PhabricatorController { | abstract class DifferentialController extends PhabricatorController { | ||||
private $packageChangesetMap; | |||||
private $pathPackageMap; | |||||
private $authorityPackages; | |||||
public function buildSideNavView($for_app = false) { | public function buildSideNavView($for_app = false) { | ||||
$viewer = $this->getRequest()->getUser(); | $viewer = $this->getRequest()->getUser(); | ||||
$nav = new AphrontSideNavFilterView(); | $nav = new AphrontSideNavFilterView(); | ||||
$nav->setBaseURI(new PhutilURI($this->getApplicationURI())); | $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); | ||||
id(new DifferentialRevisionSearchEngine()) | id(new DifferentialRevisionSearchEngine()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->addNavigationItems($nav->getMenu()); | ->addNavigationItems($nav->getMenu()); | ||||
$nav->selectFilter(null); | $nav->selectFilter(null); | ||||
return $nav; | return $nav; | ||||
} | } | ||||
public function buildApplicationMenu() { | public function buildApplicationMenu() { | ||||
return $this->buildSideNavView(true)->getMenu(); | return $this->buildSideNavView(true)->getMenu(); | ||||
} | } | ||||
protected function buildTableOfContents( | protected function buildPackageMaps(array $changesets) { | ||||
array $changesets, | assert_instances_of($changesets, 'DifferentialChangeset'); | ||||
array $visible_changesets, | |||||
array $coverage) { | |||||
$viewer = $this->getViewer(); | |||||
$toc_view = id(new PHUIDiffTableOfContentsListView()) | $this->packageChangesetMap = array(); | ||||
->setViewer($viewer) | $this->pathPackageMap = array(); | ||||
->setBare(true); | $this->authorityPackages = array(); | ||||
if (!$changesets) { | |||||
return; | |||||
} | |||||
$viewer = $this->getViewer(); | |||||
$have_owners = PhabricatorApplication::isClassInstalledForViewer( | $have_owners = PhabricatorApplication::isClassInstalledForViewer( | ||||
'PhabricatorOwnersApplication', | 'PhabricatorOwnersApplication', | ||||
$viewer); | $viewer); | ||||
if ($have_owners) { | if (!$have_owners) { | ||||
$repository_phid = null; | return; | ||||
if ($changesets) { | } | ||||
$changeset = head($changesets); | $changeset = head($changesets); | ||||
$diff = $changeset->getDiff(); | $diff = $changeset->getDiff(); | ||||
$repository_phid = $diff->getRepositoryPHID(); | $repository_phid = $diff->getRepositoryPHID(); | ||||
if (!$repository_phid) { | |||||
return; | |||||
} | } | ||||
if (!$repository_phid) { | |||||
$have_owners = false; | |||||
} else { | |||||
if ($viewer->getPHID()) { | if ($viewer->getPHID()) { | ||||
$packages = id(new PhabricatorOwnersPackageQuery()) | $packages = id(new PhabricatorOwnersPackageQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) | ->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) | ||||
->withAuthorityPHIDs(array($viewer->getPHID())) | ->withAuthorityPHIDs(array($viewer->getPHID())) | ||||
->execute(); | ->execute(); | ||||
$toc_view->setAuthorityPackages($packages); | $this->authorityPackages = $packages; | ||||
} | } | ||||
$paths = mpull($changesets, 'getOwnersFilename'); | $paths = mpull($changesets, 'getOwnersFilename'); | ||||
$control_query = id(new PhabricatorOwnersPackageQuery()) | $control_query = id(new PhabricatorOwnersPackageQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) | ->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) | ||||
->withControl($repository_phid, $paths); | ->withControl($repository_phid, $paths); | ||||
$control_query->execute(); | $control_query->execute(); | ||||
foreach ($changesets as $changeset) { | |||||
$changeset_path = $changeset->getOwnersFilename(); | |||||
$packages = $control_query->getControllingPackagesForPath( | |||||
$repository_phid, | |||||
$changeset_path); | |||||
$this->pathPackageMap[$changeset_path] = $packages; | |||||
foreach ($packages as $package) { | |||||
$this->packageChangesetMap[$package->getPHID()][] = $changeset; | |||||
} | |||||
} | } | ||||
} | } | ||||
protected function getAuthorityPackages() { | |||||
if ($this->authorityPackages === null) { | |||||
throw new PhutilInvalidStateException('buildPackageMaps'); | |||||
} | |||||
return $this->authorityPackages; | |||||
} | |||||
protected function getChangesetPackages(DifferentialChangeset $changeset) { | |||||
if ($this->pathPackageMap === null) { | |||||
throw new PhutilInvalidStateException('buildPackageMaps'); | |||||
} | |||||
$path = $changeset->getOwnersFilename(); | |||||
return idx($this->pathPackageMap, $path, array()); | |||||
} | |||||
protected function getPackageChangesets($package_phid) { | |||||
if ($this->packageChangesetMap === null) { | |||||
throw new PhutilInvalidStateException('buildPackageMaps'); | |||||
} | |||||
return idx($this->packageChangesetMap, $package_phid, array()); | |||||
} | |||||
protected function buildTableOfContents( | |||||
array $changesets, | |||||
array $visible_changesets, | |||||
array $coverage) { | |||||
$viewer = $this->getViewer(); | |||||
$toc_view = id(new PHUIDiffTableOfContentsListView()) | |||||
->setViewer($viewer) | |||||
->setBare(true) | |||||
->setAuthorityPackages($this->getAuthorityPackages()); | |||||
foreach ($changesets as $changeset_id => $changeset) { | foreach ($changesets as $changeset_id => $changeset) { | ||||
$is_visible = isset($visible_changesets[$changeset_id]); | $is_visible = isset($visible_changesets[$changeset_id]); | ||||
$anchor = $changeset->getAnchorName(); | $anchor = $changeset->getAnchorName(); | ||||
$filename = $changeset->getFilename(); | $filename = $changeset->getFilename(); | ||||
$coverage_id = 'differential-mcoverage-'.md5($filename); | $coverage_id = 'differential-mcoverage-'.md5($filename); | ||||
$item = id(new PHUIDiffTableOfContentsItemView()) | $item = id(new PHUIDiffTableOfContentsItemView()) | ||||
->setChangeset($changeset) | ->setChangeset($changeset) | ||||
->setIsVisible($is_visible) | ->setIsVisible($is_visible) | ||||
->setAnchor($anchor) | ->setAnchor($anchor) | ||||
->setCoverage(idx($coverage, $filename)) | ->setCoverage(idx($coverage, $filename)) | ||||
->setCoverageID($coverage_id); | ->setCoverageID($coverage_id); | ||||
if ($have_owners) { | $packages = $this->getChangesetPackages($changeset); | ||||
$packages = $control_query->getControllingPackagesForPath( | |||||
$repository_phid, | |||||
$changeset->getOwnersFilename()); | |||||
$item->setPackages($packages); | $item->setPackages($packages); | ||||
} | |||||
$toc_view->addItem($item); | $toc_view->addItem($item); | ||||
} | } | ||||
return $toc_view; | return $toc_view; | ||||
} | } | ||||
protected function loadDiffProperties(array $diffs) { | protected function loadDiffProperties(array $diffs) { | ||||
▲ Show 20 Lines • Show All 132 Lines • Show Last 20 Lines |