@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 183 lines 4.7 kB view raw
1<?php 2 3final class DiffusionChangeController 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 15 $viewer = $this->getViewer(); 16 $drequest = $this->getDiffusionRequest(); 17 18 $data = $this->callConduitWithDiffusionRequest( 19 'diffusion.diffquery', 20 array( 21 'commit' => $drequest->getCommit(), 22 'path' => $drequest->getPath(), 23 )); 24 25 $drequest->updateSymbolicCommit($data['effectiveCommit']); 26 27 $raw_changes = ArcanistDiffChange::newFromConduit($data['changes']); 28 $diff = DifferentialDiff::newEphemeralFromRawChanges( 29 $raw_changes); 30 $changesets = $diff->getChangesets(); 31 $changeset = reset($changesets); 32 33 if (!$changeset) { 34 // TODO: Refine this. 35 return new Aphront404Response(); 36 } 37 38 $repository = $drequest->getRepository(); 39 $changesets = array( 40 0 => $changeset, 41 ); 42 43 $changeset_header = $this->buildChangesetHeader($drequest); 44 45 $changeset_view = new DifferentialChangesetListView(); 46 $changeset_view->setChangesets($changesets); 47 $changeset_view->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); 48 $changeset_view->setVisibleChangesets($changesets); 49 $changeset_view->setRenderingReferences( 50 array( 51 0 => $drequest->generateURI(array('action' => 'rendering-ref')), 52 )); 53 54 $raw_params = array( 55 'action' => 'browse', 56 'params' => array( 57 'view' => 'raw', 58 ), 59 ); 60 61 $right_uri = $drequest->generateURI($raw_params); 62 $raw_params['params']['before'] = $drequest->getStableCommit(); 63 $left_uri = $drequest->generateURI($raw_params); 64 $changeset_view->setRawFileURIs($left_uri, $right_uri); 65 66 $changeset_view->setRenderURI($repository->getPathURI('diff/')); 67 $changeset_view->setUser($viewer); 68 $changeset_view->setHeader($changeset_header); 69 70 // TODO: This is pretty awkward, unify the CSS between Diffusion and 71 // Differential better. 72 require_celerity_resource('differential-core-view-css'); 73 74 $crumbs = $this->buildCrumbs( 75 array( 76 'branch' => true, 77 'path' => true, 78 'view' => 'change', 79 )); 80 $crumbs->setBorder(true); 81 82 $links = $this->renderPathLinks($drequest, $mode = 'browse'); 83 $header = $this->buildHeader($drequest, $links); 84 85 $view = id(new PHUITwoColumnView()) 86 ->setHeader($header) 87 ->setMainColumn(array( 88 )) 89 ->setFooter(array( 90 $changeset_view, 91 )); 92 93 return $this->newPage() 94 ->setTitle( 95 array( 96 basename($drequest->getPath()), 97 $repository->getDisplayName(), 98 )) 99 ->setCrumbs($crumbs) 100 ->appendChild( 101 array( 102 $view, 103 )); 104 } 105 106 private function buildHeader( 107 DiffusionRequest $drequest, 108 $links) { 109 $viewer = $this->getViewer(); 110 111 $tag = $this->renderCommitHashTag($drequest); 112 113 $header = id(new PHUIHeaderView()) 114 ->setHeader($links) 115 ->setUser($viewer) 116 ->setPolicyObject($drequest->getRepository()) 117 ->addTag($tag); 118 119 return $header; 120 } 121 122 private function buildChangesetHeader(DiffusionRequest $drequest) { 123 $viewer = $this->getViewer(); 124 125 $header = id(new PHUIHeaderView()) 126 ->setHeader(pht('Changes')); 127 128 $history_uri = $drequest->generateURI( 129 array( 130 'action' => 'history', 131 )); 132 133 $header->addActionLink( 134 id(new PHUIButtonView()) 135 ->setTag('a') 136 ->setText(pht('View History')) 137 ->setHref($history_uri) 138 ->setIcon('fa-clock-o')); 139 140 $browse_uri = $drequest->generateURI( 141 array( 142 'action' => 'browse', 143 )); 144 145 $header->addActionLink( 146 id(new PHUIButtonView()) 147 ->setTag('a') 148 ->setText(pht('Browse Content')) 149 ->setHref($browse_uri) 150 ->setIcon('fa-files-o')); 151 152 return $header; 153 } 154 155 protected function buildPropertyView( 156 DiffusionRequest $drequest, 157 PhabricatorActionListView $actions) { 158 159 $viewer = $this->getRequest()->getUser(); 160 161 $view = id(new PHUIPropertyListView()) 162 ->setUser($viewer) 163 ->setActionList($actions); 164 165 $stable_commit = $drequest->getStableCommit(); 166 167 $view->addProperty( 168 pht('Commit'), 169 phutil_tag( 170 'a', 171 array( 172 'href' => $drequest->generateURI( 173 array( 174 'action' => 'commit', 175 'commit' => $stable_commit, 176 )), 177 ), 178 $drequest->getRepository()->formatCommitName($stable_commit))); 179 180 return $view; 181 } 182 183}