@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 DifferentialDraftField
4 extends DifferentialCoreCustomField {
5
6 public function getFieldKey() {
7 return 'differential:draft';
8 }
9
10 public function getFieldName() {
11 return pht('Draft');
12 }
13
14 public function getFieldDescription() {
15 return pht('Show a warning about draft revisions.');
16 }
17
18 protected function readValueFromRevision(
19 DifferentialRevision $revision) {
20 return null;
21 }
22
23 public function shouldAppearInPropertyView() {
24 return true;
25 }
26
27 public function renderPropertyViewValue(array $handles) {
28 return null;
29 }
30
31 public function getWarningsForRevisionHeader(array $handles) {
32 $viewer = $this->getViewer();
33 $revision = $this->getObject();
34
35 if (!$revision->isDraft()) {
36 return array();
37 }
38
39 // If the author has held this revision as a draft explicitly, don't
40 // show any misleading messages about it autosubmitting later. We do show
41 // reminder text.
42 if ($revision->getHoldAsDraft()) {
43 return array(
44 pht(
45 'This is a draft revision that has not yet been submitted for '.
46 'review.'),
47 );
48 }
49
50 $warnings = array();
51
52 $blocking_map = array(
53 HarbormasterBuildStatus::STATUS_FAILED,
54 HarbormasterBuildStatus::STATUS_ABORTED,
55 HarbormasterBuildStatus::STATUS_ERROR,
56 HarbormasterBuildStatus::STATUS_PAUSED,
57 HarbormasterBuildStatus::STATUS_DEADLOCKED,
58 );
59 $blocking_map = array_fuse($blocking_map);
60
61 $builds = $revision->loadImpactfulBuilds($viewer);
62
63 $waiting = array();
64 $blocking = array();
65 foreach ($builds as $build) {
66 if (isset($blocking_map[$build->getBuildStatus()])) {
67 $blocking[] = $build;
68 } else {
69 $waiting[] = $build;
70 }
71 }
72
73 $blocking_list = $viewer->renderHandleList(mpull($blocking, 'getPHID'))
74 ->setAsInline(true);
75 $waiting_list = $viewer->renderHandleList(mpull($waiting, 'getPHID'))
76 ->setAsInline(true);
77
78 if ($blocking) {
79 $warnings[] = pht(
80 'This draft revision will not be submitted for review because %s '.
81 'build(s) failed: %s.',
82 phutil_count($blocking),
83 $blocking_list);
84 $warnings[] = pht(
85 'Fix build failures and update the revision.');
86 } else if ($waiting) {
87 $warnings[] = pht(
88 'This draft revision will be sent for review once %s '.
89 'build(s) pass: %s.',
90 phutil_count($waiting),
91 $waiting_list);
92 } else {
93 $warnings[] = pht(
94 'This is a draft revision that has not yet been submitted for '.
95 'review.');
96 }
97
98 return $warnings;
99 }
100
101 public function getWarningsForDetailView() {
102 $revision = $this->getObject();
103
104 if ($revision->getShouldBroadcast()) {
105 return array();
106 }
107
108 return array(
109 pht(
110 'This revision is currently a draft. You can leave comments, but '.
111 'no one will be notified until the revision is submitted for '.
112 'review.'),
113 );
114 }
115
116}