@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<?php
2
3final class DiffusionDiffController extends DiffusionController {
4
5 public function shouldAllowPublic() {
6 return true;
7 }
8
9 protected function getDiffusionBlobFromRequest(AphrontRequest $request) {
10 return $request->getStr('ref');
11 }
12
13 public function handleRequest(AphrontRequest $request) {
14 $response = $this->loadDiffusionContext();
15 if ($response) {
16 return $response;
17 }
18
19 $viewer = $this->getViewer();
20 $drequest = $this->getDiffusionRequest();
21
22 if (!$request->isAjax()) {
23
24 // This request came out of the dropdown menu, either "View Standalone"
25 // or "View Raw File".
26
27 $view = $request->getStr('view');
28 if ($view == 'r') {
29 $uri = $drequest->generateURI(
30 array(
31 'action' => 'browse',
32 'params' => array(
33 'view' => 'raw',
34 ),
35 ));
36 } else {
37 $uri = $drequest->generateURI(
38 array(
39 'action' => 'change',
40 ));
41 }
42
43 return id(new AphrontRedirectResponse())->setURI($uri);
44 }
45
46 $data = $this->callConduitWithDiffusionRequest(
47 'diffusion.diffquery',
48 array(
49 'commit' => $drequest->getCommit(),
50 'path' => $drequest->getPath(),
51 'encoding' => $request->getStr('encoding'),
52 ));
53 $drequest->updateSymbolicCommit($data['effectiveCommit']);
54 $raw_changes = ArcanistDiffChange::newFromConduit($data['changes']);
55 $diff = DifferentialDiff::newEphemeralFromRawChanges(
56 $raw_changes);
57 $changesets = $diff->getChangesets();
58 $changeset = reset($changesets);
59
60 if (!$changeset) {
61 return new Aphront404Response();
62 }
63
64 $commit = $drequest->loadCommit();
65
66 $viewstate_engine = id(new PhabricatorChangesetViewStateEngine())
67 ->setViewer($viewer)
68 ->setObjectPHID($commit->getPHID())
69 ->setChangeset($changeset);
70
71 $viewstate = $viewstate_engine->newViewStateFromRequest($request);
72
73 if ($viewstate->getDiscardResponse()) {
74 return new AphrontAjaxResponse();
75 }
76
77 $parser = id(new DifferentialChangesetParser())
78 ->setViewer($viewer)
79 ->setChangeset($changeset)
80 ->setViewState($viewstate);
81
82 $parser->setRenderingReference($drequest->generateURI(
83 array(
84 'action' => 'rendering-ref',
85 )));
86
87 $coverage = $drequest->loadCoverage();
88 if ($coverage) {
89 $parser->setCoverage($coverage);
90 }
91
92 $pquery = new DiffusionPathIDQuery(array($changeset->getFilename()));
93 $ids = $pquery->loadPathIDs();
94 $path_id = $ids[$changeset->getFilename()];
95
96 $parser->setLeftSideCommentMapping($path_id, false);
97 $parser->setRightSideCommentMapping($path_id, true);
98 $parser->setCanMarkDone(
99 ($commit->getAuthorPHID()) &&
100 ($viewer->getPHID() == $commit->getAuthorPHID()));
101 $parser->setObjectOwnerPHID($commit->getAuthorPHID());
102
103 $inlines = id(new DiffusionDiffInlineCommentQuery())
104 ->setViewer($viewer)
105 ->withCommitPHIDs(array($commit->getPHID()))
106 ->withPathIDs(array($path_id))
107 ->withPublishedComments(true)
108 ->withPublishableComments(true)
109 ->execute();
110 $inlines = mpull($inlines, 'newInlineCommentObject');
111
112 if ($inlines) {
113 foreach ($inlines as $inline) {
114 $parser->parseInlineComment($inline);
115 }
116
117 $phids = mpull($inlines, 'getAuthorPHID');
118 $handles = $this->loadViewerHandles($phids);
119 $parser->setHandles($handles);
120 }
121
122 $engine = new PhabricatorMarkupEngine();
123 $engine->setViewer($viewer);
124
125 foreach ($inlines as $inline) {
126 $engine->addObject(
127 $inline,
128 PhabricatorInlineComment::MARKUP_FIELD_BODY);
129 }
130
131 $engine->process();
132
133 $parser->setMarkupEngine($engine);
134
135 $spec = $request->getStr('range');
136 list($range_s, $range_e, $mask) =
137 DifferentialChangesetParser::parseRangeSpecification($spec);
138
139 $parser->setRange($range_s, $range_e);
140 $parser->setMask($mask);
141
142 return $parser->newChangesetResponse();
143 }
144}