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