@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 DiffusionBranchListView extends DiffusionView {
4
5 private $branches;
6 private $commits = array();
7
8 /**
9 * @param array<DiffusionRepositoryRef> $branches
10 */
11 public function setBranches(array $branches) {
12 assert_instances_of($branches, DiffusionRepositoryRef::class);
13 $this->branches = $branches;
14 return $this;
15 }
16
17 /**
18 * @param array<PhabricatorRepositoryCommit> $commits
19 */
20 public function setCommits(array $commits) {
21 assert_instances_of($commits, PhabricatorRepositoryCommit::class);
22 $this->commits = mpull($commits, null, 'getCommitIdentifier');
23 return $this;
24 }
25
26 public function render() {
27 $drequest = $this->getDiffusionRequest();
28 $current_branch = $drequest->getBranch();
29 $repository = $drequest->getRepository();
30 $commits = $this->commits;
31 $viewer = $this->getUser();
32 require_celerity_resource('diffusion-css');
33
34 $buildables = $this->loadBuildables($commits);
35 $have_builds = false;
36
37 $can_close_branches = ($repository->isHg());
38
39 Javelin::initBehavior('phabricator-tooltips');
40
41 $list = id(new PHUIObjectItemListView())
42 ->addClass('diffusion-history-list')
43 ->addClass('diffusion-branch-list');
44
45 $publisher = $repository->newPublisher();
46
47 foreach ($this->branches as $branch) {
48 $build_view = null;
49 $button_bar = new PHUIButtonBarView();
50 $commit = idx($commits, $branch->getCommitIdentifier());
51 if ($commit) {
52 $details = $commit->getSummary();
53 $datetime = phabricator_datetime($commit->getEpoch(), $viewer);
54
55 $buildable = idx($buildables, $commit->getPHID());
56 if ($buildable) {
57 $build_view = $this->renderBuildable($buildable, 'button');
58 }
59 } else {
60 $datetime = null;
61 $details = null;
62 }
63
64 if ($repository->supportsBranchComparison()) {
65 $compare_uri = $drequest->generateURI(
66 array(
67 'action' => 'compare',
68 'head' => $branch->getShortName(),
69 ));
70 $can_compare = ($branch->getShortName() != $current_branch);
71 if ($can_compare) {
72 $button_bar->addButton(
73 id(new PHUIButtonView())
74 ->setTag('a')
75 ->setIcon('fa-balance-scale')
76 ->setToolTip(pht('Compare'))
77 ->setButtonType(PHUIButtonView::BUTTONTYPE_SIMPLE)
78 ->setWorkflow(true)
79 ->setHref($compare_uri));
80 }
81 }
82
83 $browse_href = $drequest->generateURI(
84 array(
85 'action' => 'browse',
86 'branch' => $branch->getShortName(),
87 ));
88
89 $button_bar->addButton(
90 id(new PHUIButtonView())
91 ->setIcon('fa-code')
92 ->setHref($browse_href)
93 ->setTag('a')
94 ->setTooltip(pht('Browse'))
95 ->setButtonType(PHUIButtonView::BUTTONTYPE_SIMPLE));
96
97 $commit_link = $repository->getCommitURI(
98 $branch->getCommitIdentifier());
99
100 $commit_name = $repository->formatCommitName(
101 $branch->getCommitIdentifier(), $local = true);
102
103 $commit_tag = id(new PHUITagView())
104 ->setName($commit_name)
105 ->setHref($commit_link)
106 ->setType(PHUITagView::TYPE_SHADE)
107 ->setColor(PHUITagView::COLOR_INDIGO)
108 ->setBorder(PHUITagView::BORDER_NONE)
109 ->setSlimShady(true);
110 $subhead = array($commit_tag, ' ', $details);
111
112 $item = id(new PHUIObjectItemView())
113 ->setHeader($branch->getShortName())
114 ->setHref($drequest->generateURI(
115 array(
116 'action' => 'history',
117 'branch' => $branch->getShortName(),
118 )))
119 ->setSubhead($subhead)
120 ->setSideColumn(array(
121 $build_view,
122 $button_bar,
123 ));
124
125 if ($branch->getShortName() == $repository->getDefaultBranch()) {
126 $item->setStatusIcon('fa-star', pht('Default Branch'));
127 } else {
128 if ($publisher->shouldPublishRef($branch)) {
129 $item->setStatusIcon('fa-code-fork', pht('Permanent Ref'));
130 } else {
131 $item->setStatusIcon(
132 'fa-folder-open-o grey', pht('Not a Permanent Ref'));
133 }
134 }
135
136 $item->addAttribute(array($datetime));
137
138 if ($can_close_branches) {
139 $fields = $branch->getRawFields();
140 $closed = idx($fields, 'closed');
141 if ($closed) {
142 $status = pht('Branch Closed');
143 $item->setDisabled(true);
144 } else {
145 $status = pht('Branch Open');
146 }
147 $item->addAttribute($status);
148 }
149
150 $list->addItem($item);
151
152 }
153 return $list;
154
155 }
156}