3
3
final class PhabricatorOwnersEditController
4
4
extends PhabricatorOwnersController {
8
public function willProcessRequest(array $data) {
9
$this->id = idx($data, 'id');
12
public function processRequest() {
13
$request = $this->getRequest();
14
$user = $request->getUser();
17
$package = id(new PhabricatorOwnersPackage())->load($this->id);
6
public function handleRequest(AphrontRequest $request) {
7
$viewer = $request->getUser();
9
$id = $request->getURIData('id');
11
$package = id(new PhabricatorOwnersPackageQuery())
14
->requireCapabilities(
16
PhabricatorPolicyCapability::CAN_VIEW,
17
// TODO: Support this capability.
18
// PhabricatorPolicyCapability::CAN_EDIT,
19
22
return new Aphront404Response();
22
$package = new PhabricatorOwnersPackage();
23
$package->setPrimaryOwnerPHID($user->getPHID());
26
$package = PhabricatorOwnersPackage::initializeNewPackage($viewer);
33
$v_name = $package->getName();
34
$v_primary = $package->getPrimaryOwnerPHID();
35
// TODO: Pull these off needOwners() on the Query.
36
$v_owners = mpull($package->loadOwners(), 'getUserPHID');
37
$v_auditing = $package->getAuditingEnabled();
38
$v_description = $package->getDescription();
31
42
if ($request->isFormPost()) {
32
$package->setName($request->getStr('name'));
33
$package->setDescription($request->getStr('description'));
34
$old_auditing_enabled = $package->getAuditingEnabled();
35
$package->setAuditingEnabled(
36
($request->getStr('auditing') === 'enabled')
40
$primary = $request->getArr('primary');
41
$primary = reset($primary);
42
$old_primary = $package->getPrimaryOwnerPHID();
43
$package->setPrimaryOwnerPHID($primary);
45
$owners = $request->getArr('owners');
47
array_unshift($owners, $primary);
49
$owners = array_unique($owners);
51
$paths = $request->getArr('path');
52
$repos = $request->getArr('repo');
53
$excludes = $request->getArr('exclude');
56
for ($ii = 0; $ii < count($paths); $ii++) {
57
if (empty($paths[$ii]) || empty($repos[$ii])) {
61
'repositoryPHID' => $repos[$ii],
62
'path' => $paths[$ii],
63
'excluded' => $excludes[$ii],
67
if (!strlen($package->getName())) {
68
$e_name = pht('Required');
69
$errors[] = pht('Package name is required.');
74
if (!$package->getPrimaryOwnerPHID()) {
75
$e_primary = pht('Required');
76
$errors[] = pht('Package must have a primary owner.');
82
$errors[] = pht('Package must include at least one path.');
86
$package->attachUnsavedOwners($owners);
87
$package->attachUnsavedPaths($path_refs);
88
$package->attachOldAuditingEnabled($old_auditing_enabled);
89
$package->attachOldPrimaryOwnerPHID($old_primary);
91
id(new PhabricatorOwnersPackageEditor())
93
->setPackage($package)
95
return id(new AphrontRedirectResponse())
96
->setURI('/owners/package/'.$package->getID().'/');
97
} catch (AphrontDuplicateKeyQueryException $ex) {
98
$e_name = pht('Duplicate');
99
$errors[] = pht('Package name must be unique.');
103
$owners = $package->loadOwners();
104
$owners = mpull($owners, 'getUserPHID');
106
$paths = $package->loadPaths();
107
$path_refs = array();
108
foreach ($paths as $path) {
109
$path_refs[] = array(
110
'repositoryPHID' => $path->getRepositoryPHID(),
111
'path' => $path->getPath(),
112
'excluded' => $path->getExcluded(),
45
$v_name = $request->getStr('name');
46
$v_primary = head($request->getArr('primary'));
47
$v_owners = $request->getArr('owners');
48
$v_auditing = ($request->getStr('auditing') == 'enabled');
49
$v_description = $request->getStr('description');
52
$v_owners[] = $v_primary;
53
$v_owners = array_unique($v_owners);
56
$type_name = PhabricatorOwnersPackageTransaction::TYPE_NAME;
57
$type_primary = PhabricatorOwnersPackageTransaction::TYPE_PRIMARY;
58
$type_owners = PhabricatorOwnersPackageTransaction::TYPE_OWNERS;
59
$type_auditing = PhabricatorOwnersPackageTransaction::TYPE_AUDITING;
60
$type_description = PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION;
62
$xactions[] = id(new PhabricatorOwnersPackageTransaction())
63
->setTransactionType($type_name)
64
->setNewValue($v_name);
66
$xactions[] = id(new PhabricatorOwnersPackageTransaction())
67
->setTransactionType($type_primary)
68
->setNewValue($v_primary);
70
$xactions[] = id(new PhabricatorOwnersPackageTransaction())
71
->setTransactionType($type_owners)
72
->setNewValue($v_owners);
74
$xactions[] = id(new PhabricatorOwnersPackageTransaction())
75
->setTransactionType($type_auditing)
76
->setNewValue($v_auditing);
78
$xactions[] = id(new PhabricatorOwnersPackageTransaction())
79
->setTransactionType($type_description)
80
->setNewValue($v_description);
82
$editor = id(new PhabricatorOwnersPackageTransactionEditor())
84
->setContentSourceFromRequest($request)
85
->setContinueOnNoEffect(true);
88
$editor->applyTransactions($package, $xactions);
90
$id = $package->getID();
92
$next_uri = '/owners/paths/'.$id.'/';
94
$next_uri = '/owners/package/'.$id.'/';
97
return id(new AphrontRedirectResponse())->setURI($next_uri);
98
} catch (AphrontDuplicateKeyQueryException $ex) {
99
$e_name = pht('Duplicate');
100
$errors[] = pht('Package name must be unique.');
101
} catch (PhabricatorApplicationTransactionValidationException $ex) {
102
$validation_exception = $ex;
104
$e_name = $ex->getShortMessage($type_name);
105
$e_primary = $ex->getShortMessage($type_primary);
117
$primary = $package->getPrimaryOwnerPHID();
119
$value_primary_owner = array($primary);
110
$value_primary_owner = array($v_primary);
121
112
$value_primary_owner = array();
124
if ($package->getID()) {
116
$cancel_uri = '/owners/';
117
$title = pht('New Package');
118
$button_text = pht('Continue');
120
$cancel_uri = '/owners/package/'.$package->getID().'/';
125
121
$title = pht('Edit Package');
126
$side_nav_filter = 'edit/'.$this->id;
128
$title = pht('New Package');
129
$side_nav_filter = 'new';
131
$this->setSideNavFilter($side_nav_filter);
133
$repos = id(new PhabricatorRepositoryQuery())
137
$default_paths = array();
138
foreach ($repos as $repo) {
139
$default_path = $repo->getDetail('default-owners-path');
141
$default_paths[$repo->getPHID()] = $default_path;
145
$repos = mpull($repos, 'getCallsign', 'getPHID');
148
$template = new AphrontTypeaheadTemplateView();
149
$template = $template->render();
151
Javelin::initBehavior(
152
'owners-path-editor',
154
'root' => 'path-editor',
156
'add_button' => 'addpath',
157
'repositories' => $repos,
158
'input_template' => $template,
159
'pathRefs' => $path_refs,
161
'completeURI' => '/diffusion/services/path/complete/',
162
'validateURI' => '/diffusion/services/path/validate/',
164
'repositoryDefaultPaths' => $default_paths,
167
require_celerity_resource('owners-path-editor-css');
169
$cancel_uri = $package->getID()
170
? '/owners/package/'.$package->getID().'/'
122
$button_text = pht('Save Package');
173
125
$form = id(new AphrontFormView())
176
128
id(new AphrontFormTextControl())
177
129
->setLabel(pht('Name'))
178
130
->setName('name')
179
->setValue($package->getName())
180
132
->setError($e_name))
182
134
id(new AphrontFormTokenizerControl())
202
154
'this package will be reviewed to make sure an owner '.
203
155
'of the package is involved and the commit message has '.
204
156
'a valid revision, reviewed by, and author.'))
206
'disabled' => pht('Disabled'),
207
'enabled' => pht('Enabled'),
210
$package->getAuditingEnabled()
214
id(new PHUIFormInsetView())
215
->setTitle(pht('Paths'))
216
->addDivAttributes(array('id' => 'path-editor'))
217
->setRightButton(javelin_tag(
221
'class' => 'button green',
222
'sigil' => 'addpath',
223
'mustcapture' => true,
225
pht('Add New Path')))
228
'Specify the files and directories which comprise '.
230
->setContent(javelin_tag(
233
'class' => 'owners-path-editor-table',
238
id(new AphrontFormTextAreaControl())
159
'disabled' => pht('Disabled'),
160
'enabled' => pht('Enabled'),
162
->setValue(($v_auditing ? 'enabled' : 'disabled')))
164
id(new PhabricatorRemarkupControl())
239
166
->setLabel(pht('Description'))
240
167
->setName('description')
241
->setValue($package->getDescription()))
168
->setValue($v_description))
243
170
id(new AphrontFormSubmitControl())
244
171
->addCancelButton($cancel_uri)
245
->setValue(pht('Save Package')));
172
->setValue($button_text));
247
174
$form_box = id(new PHUIObjectBoxView())
248
175
->setHeaderText($title)