Skip to content

Commit 4b91c4f

Browse files
author
epriestley
committed
Add UI for defining repository mirrors
Summary: Ref T4038. This adds everything except the actual pushing part for mirrors. This isn't the most beautiful or sophisticated UI, but I want get the authoritative repositories self-hosted and get users beta-ing hosting as soon as possible. We can do transactions, etc., later on. Test Plan: See screenshots. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4038 Differential Revision: https://secure.phabricator.com/D7632
1 parent 51fb1ca commit 4b91c4f

12 files changed

+584
-35
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CREATE TABLE {$NAMESPACE}_repository.repository_mirror (
2+
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
3+
phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
4+
repositoryPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
5+
remoteURI VARCHAR(255) NOT NULL COLLATE utf8_bin,
6+
credentialPHID VARCHAR(64) COLLATE utf8_bin,
7+
dateCreated INT UNSIGNED NOT NULL,
8+
dateModified INT UNSIGNED NOT NULL,
9+
10+
UNIQUE KEY `key_phid` (phid),
11+
KEY `key_repository` (repositoryPHID)
12+
13+
) ENGINE=InnoDB, COLLATE utf8_general_ci;

src/__phutil_library_map__.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@
510510
'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php',
511511
'DiffusionMercurialResponse' => 'applications/diffusion/response/DiffusionMercurialResponse.php',
512512
'DiffusionMercurialWireProtocol' => 'applications/diffusion/protocol/DiffusionMercurialWireProtocol.php',
513+
'DiffusionMirrorDeleteController' => 'applications/diffusion/controller/DiffusionMirrorDeleteController.php',
514+
'DiffusionMirrorEditController' => 'applications/diffusion/controller/DiffusionMirrorEditController.php',
513515
'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php',
514516
'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php',
515517
'DiffusionPathCompleteController' => 'applications/diffusion/controller/DiffusionPathCompleteController.php',
@@ -1770,8 +1772,11 @@
17701772
'PhabricatorRepositoryManagementWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementWorkflow.php',
17711773
'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryMercurialCommitChangeParserWorker.php',
17721774
'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryMercurialCommitMessageParserWorker.php',
1775+
'PhabricatorRepositoryMirror' => 'applications/repository/storage/PhabricatorRepositoryMirror.php',
1776+
'PhabricatorRepositoryMirrorQuery' => 'applications/repository/query/PhabricatorRepositoryMirrorQuery.php',
17731777
'PhabricatorRepositoryPHIDTypeArcanistProject' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php',
17741778
'PhabricatorRepositoryPHIDTypeCommit' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php',
1779+
'PhabricatorRepositoryPHIDTypeMirror' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeMirror.php',
17751780
'PhabricatorRepositoryPHIDTypeRepository' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php',
17761781
'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php',
17771782
'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php',
@@ -2823,6 +2828,8 @@
28232828
'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery',
28242829
'DiffusionMercurialRequest' => 'DiffusionRequest',
28252830
'DiffusionMercurialResponse' => 'AphrontResponse',
2831+
'DiffusionMirrorDeleteController' => 'DiffusionController',
2832+
'DiffusionMirrorEditController' => 'DiffusionController',
28262833
'DiffusionPathCompleteController' => 'DiffusionController',
28272834
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
28282835
'DiffusionPathValidateController' => 'DiffusionController',
@@ -4253,8 +4260,15 @@
42534260
'PhabricatorRepositoryManagementWorkflow' => 'PhutilArgumentWorkflow',
42544261
'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
42554262
'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
4263+
'PhabricatorRepositoryMirror' =>
4264+
array(
4265+
0 => 'PhabricatorRepositoryDAO',
4266+
1 => 'PhabricatorPolicyInterface',
4267+
),
4268+
'PhabricatorRepositoryMirrorQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
42564269
'PhabricatorRepositoryPHIDTypeArcanistProject' => 'PhabricatorPHIDType',
42574270
'PhabricatorRepositoryPHIDTypeCommit' => 'PhabricatorPHIDType',
4271+
'PhabricatorRepositoryPHIDTypeMirror' => 'PhabricatorPHIDType',
42584272
'PhabricatorRepositoryPHIDTypeRepository' => 'PhabricatorPHIDType',
42594273
'PhabricatorRepositoryPullEngine' => 'PhabricatorRepositoryEngine',
42604274
'PhabricatorRepositoryPullLocalDaemon' => 'PhabricatorDaemon',

src/applications/diffusion/application/PhabricatorApplicationDiffusion.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ public function getRoutes() {
8080
'hosting/' => 'DiffusionRepositoryEditHostingController',
8181
'(?P<serve>serve)/' => 'DiffusionRepositoryEditHostingController',
8282
),
83+
'mirror/' => array(
84+
'edit/(?:(?P<id>\d+)/)?' => 'DiffusionMirrorEditController',
85+
'delete/(?P<id>\d+)/' => 'DiffusionMirrorDeleteController',
86+
),
8387
),
8488

8589
// NOTE: This must come after the rule above; it just gives us a
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
final class DiffusionMirrorDeleteController
4+
extends DiffusionController {
5+
6+
private $id;
7+
8+
public function willProcessRequest(array $data) {
9+
$this->id = $data['id'];
10+
parent::willProcessRequest($data);
11+
}
12+
13+
public function processRequest() {
14+
$request = $this->getRequest();
15+
$viewer = $request->getUser();
16+
$drequest = $this->diffusionRequest;
17+
$repository = $drequest->getRepository();
18+
19+
$mirror = id(new PhabricatorRepositoryMirrorQuery())
20+
->setViewer($viewer)
21+
->withIDs(array($this->id))
22+
->executeOne();
23+
if (!$mirror) {
24+
return new Aphront404Response();
25+
}
26+
27+
$edit_uri = $this->getRepositoryControllerURI($repository, 'edit/#mirrors');
28+
29+
if ($request->isFormPost()) {
30+
$mirror->delete();
31+
return id(new AphrontReloadResponse())->setURI($edit_uri);
32+
}
33+
34+
$dialog = id(new AphrontDialogView())
35+
->setUser($viewer)
36+
->setTitle(pht('Really delete mirror?'))
37+
->appendChild(
38+
pht('Phabricator will stop pushing updates to this mirror.'))
39+
->addSubmitButton(pht('Delete Mirror'))
40+
->addCancelButton($edit_uri);
41+
42+
return id(new AphrontDialogResponse())
43+
->setDialog($dialog);
44+
}
45+
46+
47+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
<?php
2+
3+
final class DiffusionMirrorEditController
4+
extends DiffusionController {
5+
6+
private $id;
7+
8+
public function willProcessRequest(array $data) {
9+
$this->id = idx($data, 'id');
10+
parent::willProcessRequest($data);
11+
}
12+
13+
public function processRequest() {
14+
$request = $this->getRequest();
15+
$viewer = $request->getUser();
16+
$drequest = $this->diffusionRequest;
17+
$repository = $drequest->getRepository();
18+
19+
if ($this->id) {
20+
$mirror = id(new PhabricatorRepositoryMirrorQuery())
21+
->setViewer($viewer)
22+
->withIDs(array($this->id))
23+
->executeOne();
24+
if (!$mirror) {
25+
return new Aphront404Response();
26+
}
27+
$is_new = false;
28+
} else {
29+
$mirror = PhabricatorRepositoryMirror::initializeNewMirror($viewer)
30+
->setRepositoryPHID($repository->getPHID())
31+
->attachRepository($repository);
32+
$is_new = true;
33+
}
34+
35+
$edit_uri = $this->getRepositoryControllerURI($repository, 'edit/#mirrors');
36+
37+
$v_remote = $mirror->getRemoteURI();
38+
$e_remote = true;
39+
40+
$v_credentials = $mirror->getCredentialPHID();
41+
$e_credentials = null;
42+
43+
$credentials = id(new PassphraseCredentialQuery())
44+
->setViewer($viewer)
45+
->withIsDestroyed(false)
46+
->execute();
47+
48+
$errors = array();
49+
if ($request->isFormPost()) {
50+
$v_remote = $request->getStr('remoteURI');
51+
if (strlen($v_remote)) {
52+
$e_remote = null;
53+
} else {
54+
$e_remote = pht('Required');
55+
$errors[] = pht('You must provide a remote URI.');
56+
}
57+
58+
$v_credentials = $request->getStr('credential');
59+
if ($v_credentials) {
60+
$phids = mpull($credentials, null, 'getPHID');
61+
if (empty($phids[$v_credentials])) {
62+
$e_credentials = pht('Invalid');
63+
$errors[] = pht(
64+
'You do not have permission to use those credentials.');
65+
}
66+
}
67+
68+
if (!$errors) {
69+
$mirror
70+
->setRemoteURI($v_remote)
71+
->setCredentialPHID($v_credentials)
72+
->save();
73+
return id(new AphrontReloadResponse())->setURI($edit_uri);
74+
}
75+
}
76+
77+
$form_errors = null;
78+
if ($errors) {
79+
$form_errors = id(new AphrontErrorView())
80+
->setErrors($errors);
81+
}
82+
83+
if ($is_new) {
84+
$title = pht('Create Mirror');
85+
$submit = pht('Create Mirror');
86+
} else {
87+
$title = pht('Edit Mirror');
88+
$submit = pht('Save Changes');
89+
}
90+
91+
$form = id(new PHUIFormLayoutView())
92+
->appendChild(
93+
id(new AphrontFormTextControl())
94+
->setLabel(pht('Remote URI'))
95+
->setName('remoteURI')
96+
->setValue($v_remote)
97+
->setError($e_remote))
98+
->appendChild(
99+
id(new PassphraseCredentialControl())
100+
->setLabel(pht('Credentials'))
101+
->setName('credential')
102+
->setAllowNull(true)
103+
->setValue($v_credentials)
104+
->setError($e_credentials)
105+
->setOptions($credentials));
106+
107+
$dialog = id(new AphrontDialogView())
108+
->setUser($viewer)
109+
->setTitle($title)
110+
->setWidth(AphrontDialogView::WIDTH_FORM)
111+
->appendChild($form_errors)
112+
->appendChild($form)
113+
->addSubmitButton($submit)
114+
->addCancelButton($edit_uri);
115+
116+
return id(new AphrontDialogResponse())
117+
->setDialog($dialog);
118+
}
119+
120+
121+
}

0 commit comments

Comments
 (0)