@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.

Show packages in table of contents views in Diffusion and Differential

Summary:
Fixes T8004.

- For paths which are part of a package, show the package.
- Highlight paths which are part of a package you (the viewer) have authority over.

Test Plan:
{F725418}

- Viewed owned and unowned chagnes in Diffusion and Differential.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T8004

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

+121 -5
+42
src/applications/differential/controller/DifferentialController.php
··· 30 30 $toc_view = id(new PHUIDiffTableOfContentsListView()) 31 31 ->setUser($viewer); 32 32 33 + $have_owners = PhabricatorApplication::isClassInstalledForViewer( 34 + 'PhabricatorOwnersApplication', 35 + $viewer); 36 + if ($have_owners) { 37 + $repository_phid = null; 38 + if ($changesets) { 39 + $changeset = head($changesets); 40 + $diff = $changeset->getDiff(); 41 + $repository_phid = $diff->getRepositoryPHID(); 42 + } 43 + 44 + if (!$repository_phid) { 45 + $have_owners = false; 46 + } else { 47 + if ($viewer->getPHID()) { 48 + $packages = id(new PhabricatorOwnersPackageQuery()) 49 + ->setViewer($viewer) 50 + ->withAuthorityPHIDs(array($viewer->getPHID())) 51 + ->execute(); 52 + $toc_view->setAuthorityPackages($packages); 53 + } 54 + 55 + // TODO: For Subversion, we should adjust these paths to be relative to 56 + // the repository root where possible. 57 + $paths = mpull($changesets, 'getFilename'); 58 + 59 + $control_query = id(new PhabricatorOwnersPackageQuery()) 60 + ->setViewer($viewer) 61 + ->withControl($repository_phid, $paths); 62 + $control_query->execute(); 63 + } 64 + } 65 + 33 66 foreach ($changesets as $changeset_id => $changeset) { 34 67 $is_visible = isset($visible_changesets[$changeset_id]); 35 68 $anchor = $changeset->getAnchorName(); ··· 43 76 ->setAnchor($anchor) 44 77 ->setCoverage(idx($coverage, $filename)) 45 78 ->setCoverageID($coverage_id); 79 + 80 + if ($have_owners) { 81 + $package = $control_query->getControllingPackageForPath( 82 + $repository_phid, 83 + $changeset->getFilename()); 84 + if ($package) { 85 + $item->setPackage($package); 86 + } 87 + } 46 88 47 89 $toc_view->addItem($item); 48 90 }
+7 -1
src/applications/differential/storage/DifferentialDiff.php
··· 101 101 if (!$this->getID()) { 102 102 return array(); 103 103 } 104 - return id(new DifferentialChangeset())->loadAllWhere( 104 + $changesets = id(new DifferentialChangeset())->loadAllWhere( 105 105 'diffID = %d', 106 106 $this->getID()); 107 + 108 + foreach ($changesets as $changeset) { 109 + $changeset->attachDiff($this); 110 + } 111 + 112 + return $changesets; 107 113 } 108 114 109 115 public function save() {
+36 -2
src/applications/diffusion/controller/DiffusionCommitController.php
··· 1066 1066 } 1067 1067 1068 1068 private function buildTableOfContents(array $changesets) { 1069 + $drequest = $this->getDiffusionRequest(); 1069 1070 $viewer = $this->getViewer(); 1070 1071 1071 1072 $toc_view = id(new PHUIDiffTableOfContentsListView()) ··· 1074 1075 // TODO: This is hacky, we just want access to the linkX() methods on 1075 1076 // DiffusionView. 1076 1077 $diffusion_view = id(new DiffusionEmptyResultView()) 1077 - ->setDiffusionRequest($this->getDiffusionRequest()); 1078 + ->setDiffusionRequest($drequest); 1078 1079 1079 - // TODO: Restore package stuff here. 1080 + $have_owners = PhabricatorApplication::isClassInstalledForViewer( 1081 + 'PhabricatorOwnersApplication', 1082 + $viewer); 1083 + 1084 + if (!$changesets) { 1085 + $have_owners = false; 1086 + } 1087 + 1088 + if ($have_owners) { 1089 + if ($viewer->getPHID()) { 1090 + $packages = id(new PhabricatorOwnersPackageQuery()) 1091 + ->setViewer($viewer) 1092 + ->withAuthorityPHIDs(array($viewer->getPHID())) 1093 + ->execute(); 1094 + $toc_view->setAuthorityPackages($packages); 1095 + } 1096 + 1097 + $repository = $drequest->getRepository(); 1098 + $repository_phid = $repository->getPHID(); 1099 + 1100 + $control_query = id(new PhabricatorOwnersPackageQuery()) 1101 + ->setViewer($viewer) 1102 + ->withControl($repository_phid, mpull($changesets, 'getFilename')); 1103 + $control_query->execute(); 1104 + } 1080 1105 1081 1106 foreach ($changesets as $changeset_id => $changeset) { 1082 1107 $path = $changeset->getFilename(); ··· 1094 1119 ' ', 1095 1120 $browse_link, 1096 1121 )); 1122 + 1123 + if ($have_owners) { 1124 + $package = $control_query->getControllingPackageForPath( 1125 + $repository_phid, 1126 + $changeset->getFilename()); 1127 + if ($package) { 1128 + $item->setPackage($package); 1129 + } 1130 + } 1097 1131 1098 1132 $toc_view->addItem($item); 1099 1133 }
+36 -2
src/infrastructure/diff/view/PHUIDiffTableOfContentsListView.php
··· 3 3 final class PHUIDiffTableOfContentsListView extends AphrontView { 4 4 5 5 private $items = array(); 6 + private $authorityPackages; 6 7 7 8 public function addItem(PHUIDiffTableOfContentsItemView $item) { 8 9 $this->items[] = $item; 9 10 return $this; 10 11 } 11 12 13 + public function setAuthorityPackages(array $authority_packages) { 14 + assert_instances_of($authority_packages, 'PhabricatorOwnersPackage'); 15 + $this->authorityPackages = $authority_packages; 16 + return $this; 17 + } 18 + 19 + public function getAuthorityPackages() { 20 + return $this->authorityPackages; 21 + } 22 + 12 23 public function render() { 13 24 $this->requireResource('differential-core-view-css'); 14 25 $this->requireResource('differential-table-of-contents-css'); ··· 16 27 17 28 Javelin::initBehavior('phabricator-tooltips'); 18 29 30 + if ($this->getAuthorityPackages()) { 31 + $authority = mpull($this->getAuthorityPackages(), null, 'getPHID'); 32 + } else { 33 + $authority = array(); 34 + } 35 + 19 36 $items = $this->items; 20 37 21 38 $rows = array(); 39 + $rowc = array(); 22 40 foreach ($items as $item) { 23 41 $item->setUser($this->getUser()); 24 42 $rows[] = $item->render(); 43 + 44 + $have_authority = false; 45 + 46 + $package = $item->getPackage(); 47 + if ($package) { 48 + if (isset($authority[$package->getPHID()])) { 49 + $have_authority = true; 50 + } 51 + } 52 + 53 + if ($have_authority) { 54 + $rowc[] = 'highlighted'; 55 + } else { 56 + $rowc[] = null; 57 + } 25 58 } 26 59 27 60 // Check if any item has content in these columns. If no item does, we'll ··· 60 93 $reveal_link); 61 94 62 95 $table = id(new AphrontTableView($rows)) 96 + ->setRowClasses($rowc) 63 97 ->setHeaders( 64 98 array( 65 99 null, ··· 69 103 pht('Path'), 70 104 pht('Coverage (All)'), 71 105 pht('Coverage (Touched)'), 72 - null, 106 + pht('Package'), 73 107 )) 74 108 ->setColumnClasses( 75 109 array( ··· 80 114 'differential-toc-file wide', 81 115 'differential-toc-cov', 82 116 'differential-toc-cov', 83 - 'center', 117 + null, 84 118 )) 85 119 ->setColumnVisibility( 86 120 array(