@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 recaptime-dev/main 126 lines 3.4 kB view raw
1<?php 2 3final class DiffusionHistoryController extends DiffusionController { 4 5 public function shouldAllowPublic() { 6 return true; 7 } 8 9 public function handleRequest(AphrontRequest $request) { 10 $response = $this->loadDiffusionContext(); 11 if ($response) { 12 return $response; 13 } 14 require_celerity_resource('diffusion-css'); 15 16 $viewer = $this->getViewer(); 17 $drequest = $this->getDiffusionRequest(); 18 $repository = $drequest->getRepository(); 19 20 $pager = id(new PHUIPagerView()) 21 ->readFromRequest($request); 22 23 $params = array( 24 'commit' => $drequest->getCommit(), 25 'path' => $drequest->getPath(), 26 'offset' => $pager->getOffset(), 27 'limit' => $pager->getPageSize() + 1, 28 ); 29 30 $history_results = $this->callConduitWithDiffusionRequest( 31 'diffusion.historyquery', 32 $params); 33 $history = DiffusionPathChange::newFromConduit( 34 $history_results['pathChanges']); 35 36 $history = $pager->sliceResults($history); 37 38 $history_list = id(new DiffusionCommitGraphView()) 39 ->setViewer($viewer) 40 ->setDiffusionRequest($drequest) 41 ->setHistory($history); 42 43 // NOTE: If we have a path (like "src/"), many nodes in the graph are 44 // likely to be missing (since the path wasn't touched by those commits). 45 46 // If we draw the graph, commits will often appear to be unrelated because 47 // intermediate nodes are omitted. Just drop the graph. 48 49 // The ideal behavior would be to load the entire graph and then connect 50 // ancestors appropriately, but this would currrently be prohibitively 51 // expensive in the general case. 52 53 $show_graph = !phutil_nonempty_string($drequest->getPath()); 54 if ($show_graph) { 55 $history_list 56 ->setParents($history_results['parents']) 57 ->setIsHead(!$pager->getOffset()) 58 ->setIsTail(!$pager->getHasMorePages()); 59 } 60 61 $header = $this->buildHeader($drequest); 62 63 $crumbs = $this->buildCrumbs( 64 array( 65 'branch' => true, 66 'path' => true, 67 'view' => 'history', 68 )); 69 $crumbs->setBorder(true); 70 71 $title = array( 72 pht('History'), 73 $repository->getDisplayName(), 74 ); 75 76 $pager = id(new PHUIBoxView()) 77 ->addClass('mlb') 78 ->appendChild($pager); 79 80 $tabs = $this->buildTabsView('history'); 81 82 $view = id(new PHUITwoColumnView()) 83 ->setHeader($header) 84 ->setTabs($tabs) 85 ->setFooter(array( 86 $history_list, 87 $pager, 88 )); 89 90 return $this->newPage() 91 ->setTitle($title) 92 ->setCrumbs($crumbs) 93 ->appendChild($view) 94 ->addClass('diffusion-history-view'); 95 } 96 97 private function buildHeader(DiffusionRequest $drequest) { 98 $viewer = $this->getViewer(); 99 $repository = $drequest->getRepository(); 100 101 if (phutil_nonempty_string($drequest->getPath())) { 102 $header_text = $this->renderPathLinks($drequest, $mode = 'history'); 103 } else { 104 $header_text = pht('History'); 105 } 106 107 $header = id(new PHUIHeaderView()) 108 ->setUser($viewer) 109 ->setHeader($header_text) 110 ->setHeaderIcon('fa-clock-o'); 111 112 if (!$repository->isSVN()) { 113 $branch_tag = $this->renderBranchTag($drequest); 114 $header->addTag($branch_tag); 115 } 116 117 if ($drequest->getSymbolicCommit()) { 118 $symbolic_tag = $this->renderSymbolicCommit($drequest); 119 $header->addTag($symbolic_tag); 120 } 121 122 return $header; 123 124 } 125 126}