@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Mark Owners package reviewers which own nothing in the current diff

Summary:
Ref PHI91. When Owners (or Herald, or manual user action) adds package reviewers to a revision, later updates to the revision make some of them less relevant or irrelevant.

Provide a hint when a package reviewer doesn't own any of the paths that a diff changes. Humans can then decide if the reviewer is obsolete/irrelevant or not.

This is a rough cut to get the feature working, design could probably use some tweaking if it sticks.

Test Plan: {F5204309}

Reviewers: amckinley

Reviewed By: amckinley

Subscribers: jboning

Differential Revision: https://secure.phabricator.com/D18663

+116 -38
+88 -38
src/applications/differential/controller/DifferentialController.php
··· 2 2 3 3 abstract class DifferentialController extends PhabricatorController { 4 4 5 + private $packageChangesetMap; 6 + private $pathPackageMap; 7 + private $authorityPackages; 8 + 5 9 public function buildSideNavView($for_app = false) { 6 10 $viewer = $this->getRequest()->getUser(); 7 11 ··· 21 25 return $this->buildSideNavView(true)->getMenu(); 22 26 } 23 27 24 - protected function buildTableOfContents( 25 - array $changesets, 26 - array $visible_changesets, 27 - array $coverage) { 28 - $viewer = $this->getViewer(); 28 + protected function buildPackageMaps(array $changesets) { 29 + assert_instances_of($changesets, 'DifferentialChangeset'); 29 30 30 - $toc_view = id(new PHUIDiffTableOfContentsListView()) 31 - ->setViewer($viewer) 32 - ->setBare(true); 31 + $this->packageChangesetMap = array(); 32 + $this->pathPackageMap = array(); 33 + $this->authorityPackages = array(); 34 + 35 + if (!$changesets) { 36 + return; 37 + } 38 + 39 + $viewer = $this->getViewer(); 33 40 34 41 $have_owners = PhabricatorApplication::isClassInstalledForViewer( 35 42 'PhabricatorOwnersApplication', 36 43 $viewer); 37 - if ($have_owners) { 38 - $repository_phid = null; 39 - if ($changesets) { 40 - $changeset = head($changesets); 41 - $diff = $changeset->getDiff(); 42 - $repository_phid = $diff->getRepositoryPHID(); 43 - } 44 + if (!$have_owners) { 45 + return; 46 + } 44 47 45 - if (!$repository_phid) { 46 - $have_owners = false; 47 - } else { 48 - if ($viewer->getPHID()) { 49 - $packages = id(new PhabricatorOwnersPackageQuery()) 50 - ->setViewer($viewer) 51 - ->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) 52 - ->withAuthorityPHIDs(array($viewer->getPHID())) 53 - ->execute(); 54 - $toc_view->setAuthorityPackages($packages); 55 - } 48 + $changeset = head($changesets); 49 + $diff = $changeset->getDiff(); 50 + $repository_phid = $diff->getRepositoryPHID(); 51 + if (!$repository_phid) { 52 + return; 53 + } 56 54 57 - $paths = mpull($changesets, 'getOwnersFilename'); 55 + if ($viewer->getPHID()) { 56 + $packages = id(new PhabricatorOwnersPackageQuery()) 57 + ->setViewer($viewer) 58 + ->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) 59 + ->withAuthorityPHIDs(array($viewer->getPHID())) 60 + ->execute(); 61 + $this->authorityPackages = $packages; 62 + } 58 63 59 - $control_query = id(new PhabricatorOwnersPackageQuery()) 60 - ->setViewer($viewer) 61 - ->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) 62 - ->withControl($repository_phid, $paths); 63 - $control_query->execute(); 64 + $paths = mpull($changesets, 'getOwnersFilename'); 65 + 66 + $control_query = id(new PhabricatorOwnersPackageQuery()) 67 + ->setViewer($viewer) 68 + ->withStatuses(array(PhabricatorOwnersPackage::STATUS_ACTIVE)) 69 + ->withControl($repository_phid, $paths); 70 + $control_query->execute(); 71 + 72 + foreach ($changesets as $changeset) { 73 + $changeset_path = $changeset->getOwnersFilename(); 74 + 75 + $packages = $control_query->getControllingPackagesForPath( 76 + $repository_phid, 77 + $changeset_path); 78 + 79 + $this->pathPackageMap[$changeset_path] = $packages; 80 + foreach ($packages as $package) { 81 + $this->packageChangesetMap[$package->getPHID()][] = $changeset; 64 82 } 83 + } 84 + } 85 + 86 + protected function getAuthorityPackages() { 87 + if ($this->authorityPackages === null) { 88 + throw new PhutilInvalidStateException('buildPackageMaps'); 89 + } 90 + return $this->authorityPackages; 91 + } 92 + 93 + protected function getChangesetPackages(DifferentialChangeset $changeset) { 94 + if ($this->pathPackageMap === null) { 95 + throw new PhutilInvalidStateException('buildPackageMaps'); 65 96 } 66 97 98 + $path = $changeset->getOwnersFilename(); 99 + return idx($this->pathPackageMap, $path, array()); 100 + } 101 + 102 + protected function getPackageChangesets($package_phid) { 103 + if ($this->packageChangesetMap === null) { 104 + throw new PhutilInvalidStateException('buildPackageMaps'); 105 + } 106 + 107 + return idx($this->packageChangesetMap, $package_phid, array()); 108 + } 109 + 110 + protected function buildTableOfContents( 111 + array $changesets, 112 + array $visible_changesets, 113 + array $coverage) { 114 + $viewer = $this->getViewer(); 115 + 116 + $toc_view = id(new PHUIDiffTableOfContentsListView()) 117 + ->setViewer($viewer) 118 + ->setBare(true) 119 + ->setAuthorityPackages($this->getAuthorityPackages()); 120 + 67 121 foreach ($changesets as $changeset_id => $changeset) { 68 122 $is_visible = isset($visible_changesets[$changeset_id]); 69 123 $anchor = $changeset->getAnchorName(); ··· 78 132 ->setCoverage(idx($coverage, $filename)) 79 133 ->setCoverageID($coverage_id); 80 134 81 - if ($have_owners) { 82 - $packages = $control_query->getControllingPackagesForPath( 83 - $repository_phid, 84 - $changeset->getOwnersFilename()); 85 - $item->setPackages($packages); 86 - } 135 + $packages = $this->getChangesetPackages($changeset); 136 + $item->setPackages($packages); 87 137 88 138 $toc_view->addItem($item); 89 139 }
+2
src/applications/differential/controller/DifferentialDiffViewController.php
··· 118 118 $changesets = $diff->loadChangesets(); 119 119 $changesets = msort($changesets, 'getSortKey'); 120 120 121 + $this->buildPackageMaps($changesets); 122 + 121 123 $table_of_contents = $this->buildTableOfContents( 122 124 $changesets, 123 125 $changesets,
+10
src/applications/differential/controller/DifferentialRevisionViewController.php
··· 326 326 $other_view = $this->renderOtherRevisions($other_revisions); 327 327 } 328 328 329 + $this->buildPackageMaps($changesets); 330 + 329 331 $toc_view = $this->buildTableOfContents( 330 332 $changesets, 331 333 $visible_changesets, 332 334 $target->loadCoverageMap($viewer)); 335 + 336 + // Attach changesets to each reviewer so we can show which Owners package 337 + // reviewers own no files. 338 + foreach ($revision->getReviewers() as $reviewer) { 339 + $reviewer_phid = $reviewer->getReviewerPHID(); 340 + $reviewer_changesets = $this->getPackageChangesets($reviewer_phid); 341 + $reviewer->attachChangesets($reviewer_changesets); 342 + } 333 343 334 344 $tab_group = id(new PHUITabGroupView()) 335 345 ->addTab(
+10
src/applications/differential/storage/DifferentialReviewer.php
··· 12 12 protected $voidedPHID; 13 13 14 14 private $authority = array(); 15 + private $changesets = self::ATTACHABLE; 15 16 16 17 protected function getConfiguration() { 17 18 return array( ··· 52 53 public function hasAuthority(PhabricatorUser $viewer) { 53 54 $cache_fragment = $viewer->getCacheFragment(); 54 55 return $this->assertAttachedKey($this->authority, $cache_fragment); 56 + } 57 + 58 + public function attachChangesets(array $changesets) { 59 + $this->changesets = $changesets; 60 + return $this; 61 + } 62 + 63 + public function getChangesets() { 64 + return $this->assertAttached($this->changesets); 55 65 } 56 66 57 67 public function isResigned() {
+6
src/applications/differential/view/DifferentialReviewersView.php
··· 150 150 $item->setIcon($icon, $color, $label); 151 151 $item->setTarget($handle->renderHovercardLink()); 152 152 153 + if ($reviewer->isPackage()) { 154 + if (!$reviewer->getChangesets()) { 155 + $item->setNote(pht('(Owns No Changed Paths)')); 156 + } 157 + } 158 + 153 159 $view->addItem($item); 154 160 } 155 161