@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
at upstream/main 127 lines 3.2 kB view raw
1<?php 2 3final class DifferentialRevisionAffectedPathsController 4 extends DifferentialController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $this->getViewer(); 8 $id = $request->getURIData('id'); 9 10 $revision = id(new DifferentialRevisionQuery()) 11 ->withIDs(array($id)) 12 ->setViewer($viewer) 13 ->executeOne(); 14 if (!$revision) { 15 return new Aphront404Response(); 16 } 17 18 $table = new DifferentialAffectedPath(); 19 $conn = $table->establishConnection('r'); 20 21 $paths = queryfx_all( 22 $conn, 23 'SELECT * FROM %R WHERE revisionID = %d', 24 $table, 25 $revision->getID()); 26 27 $repository_ids = array(); 28 $path_ids = array(); 29 30 foreach ($paths as $path) { 31 $repository_id = $path['repositoryID']; 32 $path_id = $path['pathID']; 33 34 $repository_ids[] = $repository_id; 35 $path_ids[] = $path_id; 36 } 37 38 $repository_ids = array_fuse($repository_ids); 39 40 if ($repository_ids) { 41 $repositories = id(new PhabricatorRepositoryQuery()) 42 ->setViewer($viewer) 43 ->withIDs($repository_ids) 44 ->execute(); 45 $repositories = mpull($repositories, null, 'getID'); 46 } else { 47 $repositories = array(); 48 } 49 50 $handles = $viewer->loadHandles(mpull($repositories, 'getPHID')); 51 52 $path_ids = array_fuse($path_ids); 53 if ($path_ids) { 54 $path_names = id(new DiffusionPathQuery()) 55 ->withPathIDs($path_ids) 56 ->execute(); 57 } else { 58 $path_names = array(); 59 } 60 61 $rows = array(); 62 foreach ($paths as $path) { 63 $repository_id = $path['repositoryID']; 64 $path_id = $path['pathID']; 65 66 $repository = idx($repositories, $repository_id); 67 if ($repository) { 68 $repository_phid = $repository->getPHID(); 69 $repository_link = $handles[$repository_phid]->renderLink(); 70 } else { 71 $repository_link = null; 72 } 73 74 $path_name = idx($path_names, $path_id); 75 if ($path_name !== null) { 76 $path_view = $path_name['path']; 77 } else { 78 $path_view = null; 79 } 80 81 $rows[] = array( 82 $repository_id, 83 $repository_link, 84 $path_id, 85 $path_view, 86 ); 87 } 88 89 // Sort rows by path name. 90 $rows = isort($rows, '3'); 91 92 $table_view = id(new AphrontTableView($rows)) 93 ->setNoDataString(pht('This revision has no indexed affected paths.')) 94 ->setHeaders( 95 array( 96 pht('Repository ID'), 97 pht('Repository'), 98 pht('Path ID'), 99 pht('Path'), 100 )) 101 ->setColumnClasses( 102 array( 103 null, 104 null, 105 null, 106 'wide', 107 )); 108 109 $box_view = id(new PHUIObjectBoxView()) 110 ->setHeaderText(pht('Affected Path Index')) 111 ->setTable($table_view); 112 113 $crumbs = $this->buildApplicationCrumbs() 114 ->addTextCrumb($revision->getMonogram(), $revision->getURI()) 115 ->addTextCrumb(pht('Affected Path Index')); 116 117 return $this->newPage() 118 ->setCrumbs($crumbs) 119 ->setTitle( 120 array( 121 $revision->getMonogram(), 122 pht('Affected Path Index'), 123 )) 124 ->appendChild($box_view); 125 } 126 127}