Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/config/editor/PhabricatorConfigEditor.php
12256 views
1
<?php
2
3
final class PhabricatorConfigEditor
4
extends PhabricatorApplicationTransactionEditor {
5
6
public function getEditorApplicationClass() {
7
return 'PhabricatorConfigApplication';
8
}
9
10
public function getEditorObjectsDescription() {
11
return pht('Configuration');
12
}
13
14
public function getTransactionTypes() {
15
$types = parent::getTransactionTypes();
16
17
$types[] = PhabricatorConfigTransaction::TYPE_EDIT;
18
19
return $types;
20
}
21
22
protected function getCustomTransactionOldValue(
23
PhabricatorLiskDAO $object,
24
PhabricatorApplicationTransaction $xaction) {
25
26
switch ($xaction->getTransactionType()) {
27
case PhabricatorConfigTransaction::TYPE_EDIT:
28
return array(
29
'deleted' => (int)$object->getIsDeleted(),
30
'value' => $object->getValue(),
31
);
32
}
33
}
34
35
protected function getCustomTransactionNewValue(
36
PhabricatorLiskDAO $object,
37
PhabricatorApplicationTransaction $xaction) {
38
39
switch ($xaction->getTransactionType()) {
40
case PhabricatorConfigTransaction::TYPE_EDIT:
41
return $xaction->getNewValue();
42
}
43
}
44
45
protected function applyCustomInternalTransaction(
46
PhabricatorLiskDAO $object,
47
PhabricatorApplicationTransaction $xaction) {
48
49
switch ($xaction->getTransactionType()) {
50
case PhabricatorConfigTransaction::TYPE_EDIT:
51
$v = $xaction->getNewValue();
52
53
// If this is a defined configuration option (vs a straggler from an
54
// old version of Phabricator or a configuration file misspelling)
55
// submit it to the validation gauntlet.
56
$key = $object->getConfigKey();
57
$all_options = PhabricatorApplicationConfigOptions::loadAllOptions();
58
$option = idx($all_options, $key);
59
if ($option) {
60
$option->getGroup()->validateOption(
61
$option,
62
$v['value']);
63
}
64
65
$object->setIsDeleted((int)$v['deleted']);
66
$object->setValue($v['value']);
67
break;
68
}
69
}
70
71
protected function applyCustomExternalTransaction(
72
PhabricatorLiskDAO $object,
73
PhabricatorApplicationTransaction $xaction) {
74
return;
75
}
76
77
protected function mergeTransactions(
78
PhabricatorApplicationTransaction $u,
79
PhabricatorApplicationTransaction $v) {
80
81
$type = $u->getTransactionType();
82
switch ($type) {
83
case PhabricatorConfigTransaction::TYPE_EDIT:
84
return $v;
85
}
86
87
return parent::mergeTransactions($u, $v);
88
}
89
90
protected function transactionHasEffect(
91
PhabricatorLiskDAO $object,
92
PhabricatorApplicationTransaction $xaction) {
93
94
$old = $xaction->getOldValue();
95
$new = $xaction->getNewValue();
96
97
$type = $xaction->getTransactionType();
98
switch ($type) {
99
case PhabricatorConfigTransaction::TYPE_EDIT:
100
// If an edit deletes an already-deleted entry, no-op it.
101
if (idx($old, 'deleted') && idx($new, 'deleted')) {
102
return false;
103
}
104
break;
105
}
106
107
return parent::transactionHasEffect($object, $xaction);
108
}
109
110
protected function didApplyTransactions($object, array $xactions) {
111
// Force all the setup checks to run on the next page load.
112
PhabricatorSetupCheck::deleteSetupCheckCache();
113
114
return $xactions;
115
}
116
117
public static function storeNewValue(
118
PhabricatorUser $user,
119
PhabricatorConfigEntry $config_entry,
120
$value,
121
PhabricatorContentSource $source,
122
$acting_as_phid = null) {
123
124
$xaction = id(new PhabricatorConfigTransaction())
125
->setTransactionType(PhabricatorConfigTransaction::TYPE_EDIT)
126
->setNewValue(
127
array(
128
'deleted' => false,
129
'value' => $value,
130
));
131
132
$editor = id(new PhabricatorConfigEditor())
133
->setActor($user)
134
->setContinueOnNoEffect(true)
135
->setContentSource($source);
136
137
if ($acting_as_phid) {
138
$editor->setActingAsPHID($acting_as_phid);
139
}
140
141
$editor->applyTransactions($config_entry, array($xaction));
142
}
143
144
public static function deleteConfig(
145
PhabricatorUser $user,
146
PhabricatorConfigEntry $config_entry,
147
PhabricatorContentSource $source) {
148
149
$xaction = id(new PhabricatorConfigTransaction())
150
->setTransactionType(PhabricatorConfigTransaction::TYPE_EDIT)
151
->setNewValue(
152
array(
153
'deleted' => true,
154
'value' => null,
155
));
156
157
$editor = id(new PhabricatorConfigEditor())
158
->setActor($user)
159
->setContinueOnNoEffect(true)
160
->setContentSource($source);
161
162
$editor->applyTransactions($config_entry, array($xaction));
163
}
164
165
}
166
167