@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
fork

Configure Feed

Select the types of activity you want to include in your feed.

Cut mirroring over to new URIs

Summary:
Ref T10748. This migrates and swaps mirroring to `PhabricatorRepositoryURI`, obsoleting `PhabricatorRepositoryMirror`.

This prevents you from editing, adding or disabling mirrors unless you know a secret URI (until the UI cuts over fully), but existing mirroring is not affected.

Test Plan:
- Added a mirroring URI to an old repository.
- Verified it worked with `bin/repository mirror`.
- Migrated forward.
- Verified it still worked with `bin/repository mirror`.
- Wow, mirroring: https://github.com/epriestley/locktopia-mirror

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10748

Differential Revision: https://secure.phabricator.com/D15841

+126 -534
+38
resources/sql/autopatches/20160503.repo.04.mirrormigrate.php
··· 1 + <?php 2 + 3 + $table = new PhabricatorRepository(); 4 + $conn_w = $table->establishConnection('w'); 5 + 6 + $mirrors = queryfx_all( 7 + $conn_w, 8 + 'SELECT * FROM %T', 9 + 'repository_mirror'); 10 + 11 + foreach ($mirrors as $mirror) { 12 + $repository_phid = $mirror['repositoryPHID']; 13 + $uri = $mirror['remoteURI']; 14 + 15 + $already_exists = id(new PhabricatorRepositoryURI())->loadOneWhere( 16 + 'repositoryPHID = %s AND uri = %s', 17 + $repository_phid, 18 + $uri); 19 + if ($already_exists) { 20 + // Decline to migrate stuff that looks like it was already migrated. 21 + continue; 22 + } 23 + 24 + $new_uri = PhabricatorRepositoryURI::initializeNewURI() 25 + ->setIOType(PhabricatorRepositoryURI::IO_MIRROR) 26 + ->setRepositoryPHID($repository_phid) 27 + ->setURI($uri) 28 + ->setCredentialPHID($mirror['credentialPHID']) 29 + ->setDateCreated($mirror['dateCreated']) 30 + ->setDateModified($mirror['dateModified']) 31 + ->save(); 32 + 33 + echo tsprintf( 34 + "%s\n", 35 + pht( 36 + 'Migrated mirror "%s".', 37 + $uri)); 38 + }
+1 -12
src/__phutil_library_map__.php
··· 682 682 'DiffusionMercurialWireProtocolTests' => 'applications/diffusion/protocol/__tests__/DiffusionMercurialWireProtocolTests.php', 683 683 'DiffusionMercurialWireSSHTestCase' => 'applications/diffusion/ssh/__tests__/DiffusionMercurialWireSSHTestCase.php', 684 684 'DiffusionMergedCommitsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionMergedCommitsQueryConduitAPIMethod.php', 685 - 'DiffusionMirrorDeleteController' => 'applications/diffusion/controller/DiffusionMirrorDeleteController.php', 686 - 'DiffusionMirrorEditController' => 'applications/diffusion/controller/DiffusionMirrorEditController.php', 687 685 'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php', 688 686 'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php', 689 687 'DiffusionPathCompleteController' => 'applications/diffusion/controller/DiffusionPathCompleteController.php', ··· 3208 3206 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryMercurialCommitMessageParserWorker.php', 3209 3207 'PhabricatorRepositoryMirror' => 'applications/repository/storage/PhabricatorRepositoryMirror.php', 3210 3208 'PhabricatorRepositoryMirrorEngine' => 'applications/repository/engine/PhabricatorRepositoryMirrorEngine.php', 3211 - 'PhabricatorRepositoryMirrorPHIDType' => 'applications/repository/phid/PhabricatorRepositoryMirrorPHIDType.php', 3212 - 'PhabricatorRepositoryMirrorQuery' => 'applications/repository/query/PhabricatorRepositoryMirrorQuery.php', 3213 3209 'PhabricatorRepositoryParsedChange' => 'applications/repository/data/PhabricatorRepositoryParsedChange.php', 3214 3210 'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php', 3215 3211 'PhabricatorRepositoryPullEvent' => 'applications/repository/storage/PhabricatorRepositoryPullEvent.php', ··· 4914 4910 'DiffusionMercurialWireProtocolTests' => 'PhabricatorTestCase', 4915 4911 'DiffusionMercurialWireSSHTestCase' => 'PhabricatorTestCase', 4916 4912 'DiffusionMergedCommitsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 4917 - 'DiffusionMirrorDeleteController' => 'DiffusionController', 4918 - 'DiffusionMirrorEditController' => 'DiffusionController', 4919 4913 'DiffusionPathChange' => 'Phobject', 4920 4914 'DiffusionPathChangeQuery' => 'Phobject', 4921 4915 'DiffusionPathCompleteController' => 'DiffusionController', ··· 7882 7876 'PhabricatorRepositoryManagementWorkflow' => 'PhabricatorManagementWorkflow', 7883 7877 'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 7884 7878 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 7885 - 'PhabricatorRepositoryMirror' => array( 7886 - 'PhabricatorRepositoryDAO', 7887 - 'PhabricatorPolicyInterface', 7888 - ), 7879 + 'PhabricatorRepositoryMirror' => 'PhabricatorRepositoryDAO', 7889 7880 'PhabricatorRepositoryMirrorEngine' => 'PhabricatorRepositoryEngine', 7890 - 'PhabricatorRepositoryMirrorPHIDType' => 'PhabricatorPHIDType', 7891 - 'PhabricatorRepositoryMirrorQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 7892 7881 'PhabricatorRepositoryParsedChange' => 'Phobject', 7893 7882 'PhabricatorRepositoryPullEngine' => 'PhabricatorRepositoryEngine', 7894 7883 'PhabricatorRepositoryPullEvent' => array(
-4
src/applications/diffusion/application/PhabricatorDiffusionApplication.php
··· 122 122 'testautomation/' => 'DiffusionRepositoryTestAutomationController', 123 123 ), 124 124 'pathtree/(?P<dblob>.*)' => 'DiffusionPathTreeController', 125 - 'mirror/' => array( 126 - 'edit/(?:(?P<id>\d+)/)?' => 'DiffusionMirrorEditController', 127 - 'delete/(?P<id>\d+)/' => 'DiffusionMirrorDeleteController', 128 - ), 129 125 ), 130 126 131 127 // NOTE: This must come after the rule above; it just gives us a
-45
src/applications/diffusion/controller/DiffusionMirrorDeleteController.php
··· 1 - <?php 2 - 3 - final class DiffusionMirrorDeleteController 4 - extends DiffusionController { 5 - 6 - public function handleRequest(AphrontRequest $request) { 7 - $response = $this->loadDiffusionContext(); 8 - if ($response) { 9 - return $response; 10 - } 11 - 12 - $viewer = $this->getViewer(); 13 - $drequest = $this->getDiffusionRequest(); 14 - $repository = $drequest->getRepository(); 15 - 16 - $mirror = id(new PhabricatorRepositoryMirrorQuery()) 17 - ->setViewer($viewer) 18 - ->withIDs(array($request->getURIData('id'))) 19 - ->requireCapabilities( 20 - array( 21 - PhabricatorPolicyCapability::CAN_VIEW, 22 - PhabricatorPolicyCapability::CAN_EDIT, 23 - )) 24 - ->executeOne(); 25 - if (!$mirror) { 26 - return new Aphront404Response(); 27 - } 28 - 29 - $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/#mirrors'); 30 - 31 - if ($request->isFormPost()) { 32 - $mirror->delete(); 33 - return id(new AphrontReloadResponse())->setURI($edit_uri); 34 - } 35 - 36 - return $this->newDialog() 37 - ->setTitle(pht('Really delete mirror?')) 38 - ->appendChild( 39 - pht('Phabricator will stop pushing updates to this mirror.')) 40 - ->addSubmitButton(pht('Delete Mirror')) 41 - ->addCancelButton($edit_uri); 42 - } 43 - 44 - 45 - }
-130
src/applications/diffusion/controller/DiffusionMirrorEditController.php
··· 1 - <?php 2 - 3 - final class DiffusionMirrorEditController 4 - extends DiffusionController { 5 - 6 - public function handleRequest(AphrontRequest $request) { 7 - $response = $this->loadDiffusionContext(); 8 - if ($response) { 9 - return $response; 10 - } 11 - 12 - $viewer = $this->getViewer(); 13 - $drequest = $this->getDiffusionRequest(); 14 - $repository = $drequest->getRepository(); 15 - 16 - PhabricatorPolicyFilter::requireCapability( 17 - $viewer, 18 - $repository, 19 - PhabricatorPolicyCapability::CAN_EDIT); 20 - 21 - if ($request->getURIData('id')) { 22 - $mirror = id(new PhabricatorRepositoryMirrorQuery()) 23 - ->setViewer($viewer) 24 - ->withIDs(array($request->getURIData('id'))) 25 - ->requireCapabilities( 26 - array( 27 - PhabricatorPolicyCapability::CAN_VIEW, 28 - PhabricatorPolicyCapability::CAN_EDIT, 29 - )) 30 - ->executeOne(); 31 - if (!$mirror) { 32 - return new Aphront404Response(); 33 - } 34 - $is_new = false; 35 - } else { 36 - $mirror = PhabricatorRepositoryMirror::initializeNewMirror($viewer) 37 - ->setRepositoryPHID($repository->getPHID()) 38 - ->attachRepository($repository); 39 - $is_new = true; 40 - } 41 - 42 - $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/#mirrors'); 43 - 44 - $v_remote = $mirror->getRemoteURI(); 45 - $e_remote = true; 46 - 47 - $v_credentials = $mirror->getCredentialPHID(); 48 - $e_credentials = null; 49 - 50 - $credentials = id(new PassphraseCredentialQuery()) 51 - ->setViewer($viewer) 52 - ->withIsDestroyed(false) 53 - ->execute(); 54 - 55 - $errors = array(); 56 - if ($request->isFormPost()) { 57 - $v_remote = $request->getStr('remoteURI'); 58 - if (strlen($v_remote)) { 59 - try { 60 - PhabricatorRepository::assertValidRemoteURI($v_remote); 61 - $e_remote = null; 62 - } catch (Exception $ex) { 63 - $e_remote = pht('Invalid'); 64 - $errors[] = $ex->getMessage(); 65 - } 66 - } else { 67 - $e_remote = pht('Required'); 68 - $errors[] = pht('You must provide a remote URI.'); 69 - } 70 - 71 - $v_credentials = $request->getStr('credential'); 72 - if ($v_credentials) { 73 - $phids = mpull($credentials, null, 'getPHID'); 74 - if (empty($phids[$v_credentials])) { 75 - $e_credentials = pht('Invalid'); 76 - $errors[] = pht( 77 - 'You do not have permission to use those credentials.'); 78 - } 79 - } 80 - 81 - if (!$errors) { 82 - $mirror 83 - ->setRemoteURI($v_remote) 84 - ->setCredentialPHID($v_credentials) 85 - ->save(); 86 - return id(new AphrontReloadResponse())->setURI($edit_uri); 87 - } 88 - } 89 - 90 - $form_errors = null; 91 - if ($errors) { 92 - $form_errors = id(new PHUIInfoView()) 93 - ->setErrors($errors); 94 - } 95 - 96 - if ($is_new) { 97 - $title = pht('Create Mirror'); 98 - $submit = pht('Create Mirror'); 99 - } else { 100 - $title = pht('Edit Mirror'); 101 - $submit = pht('Save Changes'); 102 - } 103 - 104 - $form = id(new PHUIFormLayoutView()) 105 - ->appendChild( 106 - id(new AphrontFormTextControl()) 107 - ->setLabel(pht('Remote URI')) 108 - ->setName('remoteURI') 109 - ->setValue($v_remote) 110 - ->setError($e_remote)) 111 - ->appendControl( 112 - id(new PassphraseCredentialControl()) 113 - ->setLabel(pht('Credentials')) 114 - ->setName('credential') 115 - ->setAllowNull(true) 116 - ->setValue($v_credentials) 117 - ->setError($e_credentials) 118 - ->setOptions($credentials)); 119 - 120 - return $this->newDialog() 121 - ->setTitle($title) 122 - ->setWidth(AphrontDialogView::WIDTH_FORM) 123 - ->appendChild($form_errors) 124 - ->appendChild($form) 125 - ->addSubmitButton($submit) 126 - ->addCancelButton($edit_uri); 127 - } 128 - 129 - 130 - }
-115
src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
··· 129 129 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 130 130 ->addPropertyList($hosting_properties); 131 131 132 - if ($repository->canMirror()) { 133 - $mirror_actions = $this->buildMirrorActions($repository); 134 - $mirror_properties = $this->buildMirrorProperties( 135 - $repository, 136 - $mirror_actions); 137 - 138 - $mirrors = id(new PhabricatorRepositoryMirrorQuery()) 139 - ->setViewer($viewer) 140 - ->withRepositoryPHIDs(array($repository->getPHID())) 141 - ->execute(); 142 - 143 - $mirror_list = $this->buildMirrorList($repository, $mirrors); 144 - 145 - $boxes[] = id(new PhabricatorAnchorView())->setAnchorName('mirrors'); 146 - 147 - $mirror_info = array(); 148 - if (PhabricatorEnv::getEnvConfig('phabricator.silent')) { 149 - $mirror_info[] = pht( 150 - 'Phabricator is running in silent mode, so changes will not '. 151 - 'be pushed to mirrors.'); 152 - } 153 - 154 - $boxes[] = id(new PHUIObjectBoxView()) 155 - ->setFormErrors($mirror_info) 156 - ->setHeaderText(pht('Mirrors')) 157 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 158 - ->addPropertyList($mirror_properties); 159 - 160 - $boxes[] = $mirror_list; 161 - } 162 - 163 132 if ($remote_properties) { 164 133 $boxes[] = id(new PHUIObjectBoxView()) 165 134 ->setHeaderText(pht('Remote')) ··· 1191 1160 ), 1192 1161 pht('Learn More')), 1193 1162 ); 1194 - } 1195 - 1196 - 1197 - private function buildMirrorActions( 1198 - PhabricatorRepository $repository) { 1199 - 1200 - $viewer = $this->getViewer(); 1201 - 1202 - $mirror_actions = id(new PhabricatorActionListView()) 1203 - ->setUser($viewer); 1204 - 1205 - $new_mirror_uri = $this->getRepositoryControllerURI( 1206 - $repository, 1207 - 'mirror/edit/'); 1208 - 1209 - $mirror_actions->addAction( 1210 - id(new PhabricatorActionView()) 1211 - ->setName(pht('Add Mirror')) 1212 - ->setIcon('fa-plus') 1213 - ->setHref($new_mirror_uri) 1214 - ->setWorkflow(true)); 1215 - 1216 - return $mirror_actions; 1217 - } 1218 - 1219 - private function buildMirrorProperties( 1220 - PhabricatorRepository $repository, 1221 - PhabricatorActionListView $actions) { 1222 - 1223 - $viewer = $this->getViewer(); 1224 - 1225 - $mirror_properties = id(new PHUIPropertyListView()) 1226 - ->setUser($viewer) 1227 - ->setActionList($actions); 1228 - 1229 - $mirror_properties->addProperty( 1230 - '', 1231 - phutil_tag( 1232 - 'em', 1233 - array(), 1234 - pht('Automatically push changes into other remotes.'))); 1235 - 1236 - return $mirror_properties; 1237 - } 1238 - 1239 - private function buildMirrorList( 1240 - PhabricatorRepository $repository, 1241 - array $mirrors) { 1242 - assert_instances_of($mirrors, 'PhabricatorRepositoryMirror'); 1243 - 1244 - $mirror_list = id(new PHUIObjectItemListView()) 1245 - ->setNoDataString(pht('This repository has no configured mirrors.')); 1246 - 1247 - foreach ($mirrors as $mirror) { 1248 - $item = id(new PHUIObjectItemView()) 1249 - ->setHeader($mirror->getRemoteURI()); 1250 - 1251 - $edit_uri = $this->getRepositoryControllerURI( 1252 - $repository, 1253 - 'mirror/edit/'.$mirror->getID().'/'); 1254 - 1255 - $delete_uri = $this->getRepositoryControllerURI( 1256 - $repository, 1257 - 'mirror/delete/'.$mirror->getID().'/'); 1258 - 1259 - $item->addAction( 1260 - id(new PHUIListItemView()) 1261 - ->setIcon('fa-pencil') 1262 - ->setHref($edit_uri) 1263 - ->setWorkflow(true)); 1264 - 1265 - $item->addAction( 1266 - id(new PHUIListItemView()) 1267 - ->setIcon('fa-times') 1268 - ->setHref($delete_uri) 1269 - ->setWorkflow(true)); 1270 - 1271 - $mirror_list->addItem($item); 1272 - } 1273 - 1274 - return id(new PHUIObjectBoxView()) 1275 - ->setHeaderText(pht('Configured Mirrors')) 1276 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 1277 - ->setObjectList($mirror_list); 1278 1163 } 1279 1164 1280 1165 private function buildSymbolsActions(PhabricatorRepository $repository) {
+45 -31
src/applications/repository/engine/PhabricatorRepositoryMirrorEngine.php
··· 7 7 extends PhabricatorRepositoryEngine { 8 8 9 9 public function pushToMirrors() { 10 + $viewer = $this->getViewer(); 10 11 $repository = $this->getRepository(); 11 12 12 13 if (!$repository->canMirror()) { ··· 19 20 return; 20 21 } 21 22 22 - $mirrors = id(new PhabricatorRepositoryMirrorQuery()) 23 - ->setViewer($this->getViewer()) 24 - ->withRepositoryPHIDs(array($repository->getPHID())) 23 + $uris = id(new PhabricatorRepositoryURIQuery()) 24 + ->setViewer($viewer) 25 + ->withRepositories(array($repository)) 25 26 ->execute(); 26 27 28 + $io_mirror = PhabricatorRepositoryURI::IO_MIRROR; 29 + 27 30 $exceptions = array(); 28 - foreach ($mirrors as $mirror) { 31 + foreach ($uris as $mirror) { 32 + if ($mirror->getIsDisabled()) { 33 + continue; 34 + } 35 + 36 + $io_type = $mirror->getEffectiveIOType(); 37 + if ($io_type != $io_mirror) { 38 + continue; 39 + } 40 + 29 41 try { 30 42 $this->pushRepositoryToMirror($repository, $mirror); 31 43 } catch (Exception $ex) { ··· 44 56 45 57 private function pushRepositoryToMirror( 46 58 PhabricatorRepository $repository, 47 - PhabricatorRepositoryMirror $mirror) { 48 - 49 - // TODO: This is a little bit janky, but we don't have first-class 50 - // infrastructure for running remote commands against an arbitrary remote 51 - // right now. Just make an emphemeral copy of the repository and muck with 52 - // it a little bit. In the medium term, we should pull this command stuff 53 - // out and use it here and for "Land to ...". 54 - 55 - $proxy = clone $repository; 56 - $proxy->makeEphemeral(); 59 + PhabricatorRepositoryURI $mirror_uri) { 57 60 58 - $proxy->setDetail('hosting-enabled', false); 59 - $proxy->setDetail('remote-uri', $mirror->getRemoteURI()); 60 - $proxy->setCredentialPHID($mirror->getCredentialPHID()); 61 - 62 - $this->log(pht('Pushing to remote "%s"...', $mirror->getRemoteURI())); 61 + $this->log( 62 + pht( 63 + 'Pushing to remote "%s"...', 64 + $mirror_uri->getEffectiveURI())); 63 65 64 - if ($proxy->isGit()) { 65 - $this->pushToGitRepository($proxy); 66 - } else if ($proxy->isHg()) { 67 - $this->pushToHgRepository($proxy); 66 + if ($repository->isGit()) { 67 + $this->pushToGitRepository($repository, $mirror_uri); 68 + } else if ($repository->isHg()) { 69 + $this->pushToHgRepository($repository, $mirror_uri); 68 70 } else { 69 71 throw new Exception(pht('Unsupported VCS!')); 70 72 } 71 73 } 72 74 73 75 private function pushToGitRepository( 74 - PhabricatorRepository $proxy) { 76 + PhabricatorRepository $repository, 77 + PhabricatorRepositoryURI $mirror_uri) { 75 78 76 - $future = $proxy->getRemoteCommandFuture( 79 + $argv = array( 77 80 'push --verbose --mirror -- %P', 78 - $proxy->getRemoteURIEnvelope()); 81 + $mirror_uri->getURIEnvelope(), 82 + ); 83 + 84 + $future = $mirror_uri->newCommandEngine() 85 + ->setArgv($argv) 86 + ->newFuture(); 79 87 80 88 $future 81 - ->setCWD($proxy->getLocalPath()) 89 + ->setCWD($repository->getLocalPath()) 82 90 ->resolvex(); 83 91 } 84 92 85 93 private function pushToHgRepository( 86 - PhabricatorRepository $proxy) { 94 + PhabricatorRepository $repository, 95 + PhabricatorRepositoryURI $mirror_uri) { 87 96 88 - $future = $proxy->getRemoteCommandFuture( 97 + $argv = array( 89 98 'push --verbose --rev tip -- %P', 90 - $proxy->getRemoteURIEnvelope()); 99 + $mirror_uri->getURIEnvelope(), 100 + ); 101 + 102 + $future = $mirror_uri->newCommandEngine() 103 + ->setArgv($argv) 104 + ->newFuture(); 91 105 92 106 try { 93 107 $future 94 - ->setCWD($proxy->getLocalPath()) 108 + ->setCWD($repository->getLocalPath()) 95 109 ->resolvex(); 96 110 } catch (CommandException $ex) { 97 111 if (preg_match('/no changes found/', $ex->getStdOut())) {
+9 -8
src/applications/repository/management/PhabricatorRepositoryManagementMirrorWorkflow.php
··· 12 12 ->setArguments( 13 13 array( 14 14 array( 15 - 'name' => 'verbose', 16 - 'help' => pht('Show additional debugging information.'), 15 + 'name' => 'verbose', 16 + 'help' => pht('Show additional debugging information.'), 17 17 ), 18 18 array( 19 - 'name' => 'repos', 20 - 'wildcard' => true, 19 + 'name' => 'repos', 20 + 'wildcard' => true, 21 21 ), 22 22 )); 23 23 } ··· 31 31 'Specify one or more repositories to push to mirrors.')); 32 32 } 33 33 34 - $console = PhutilConsole::getConsole(); 35 34 foreach ($repos as $repo) { 36 - $console->writeOut( 35 + echo tsprintf( 37 36 "%s\n", 38 37 pht( 39 - "Pushing '%s' to mirrors...", 38 + 'Pushing "%s" to mirrors...', 40 39 $repo->getDisplayName())); 41 40 42 41 $engine = id(new PhabricatorRepositoryMirrorEngine()) ··· 45 44 ->pushToMirrors(); 46 45 } 47 46 48 - $console->writeOut("%s\n", pht('Done.')); 47 + echo tsprintf( 48 + "%s\n", 49 + pht('Done.')); 49 50 50 51 return 0; 51 52 }
-41
src/applications/repository/phid/PhabricatorRepositoryMirrorPHIDType.php
··· 1 - <?php 2 - 3 - final class PhabricatorRepositoryMirrorPHIDType extends PhabricatorPHIDType { 4 - 5 - const TYPECONST = 'RMIR'; 6 - 7 - public function getTypeName() { 8 - return pht('Repository Mirror'); 9 - } 10 - 11 - public function newObject() { 12 - return new PhabricatorRepositoryMirror(); 13 - } 14 - 15 - public function getPHIDTypeApplicationClass() { 16 - return 'PhabricatorDiffusionApplication'; 17 - } 18 - 19 - protected function buildQueryForObjects( 20 - PhabricatorObjectQuery $query, 21 - array $phids) { 22 - 23 - return id(new PhabricatorRepositoryMirrorQuery()) 24 - ->withPHIDs($phids); 25 - } 26 - 27 - public function loadHandles( 28 - PhabricatorHandleQuery $query, 29 - array $handles, 30 - array $objects) { 31 - 32 - foreach ($handles as $phid => $handle) { 33 - $mirror = $objects[$phid]; 34 - 35 - $handle->setName( 36 - pht('Mirror %d %s', $mirror->getID(), $mirror->getRemoteURI())); 37 - $handle->setURI('/diffusion/mirror/'.$mirror->getID().'/'); 38 - } 39 - } 40 - 41 - }
-99
src/applications/repository/query/PhabricatorRepositoryMirrorQuery.php
··· 1 - <?php 2 - 3 - final class PhabricatorRepositoryMirrorQuery 4 - extends PhabricatorCursorPagedPolicyAwareQuery { 5 - 6 - private $ids; 7 - private $phids; 8 - private $repositoryPHIDs; 9 - 10 - public function withIDs(array $ids) { 11 - $this->ids = $ids; 12 - return $this; 13 - } 14 - 15 - public function withPHIDs(array $phids) { 16 - $this->phids = $phids; 17 - return $this; 18 - } 19 - 20 - public function withRepositoryPHIDs(array $repository_phids) { 21 - $this->repositoryPHIDs = $repository_phids; 22 - return $this; 23 - } 24 - 25 - protected function loadPage() { 26 - $table = new PhabricatorRepositoryMirror(); 27 - $conn_r = $table->establishConnection('r'); 28 - 29 - $data = queryfx_all( 30 - $conn_r, 31 - 'SELECT * FROM %T %Q %Q %Q', 32 - $table->getTableName(), 33 - $this->buildWhereClause($conn_r), 34 - $this->buildOrderClause($conn_r), 35 - $this->buildLimitClause($conn_r)); 36 - 37 - return $table->loadAllFromArray($data); 38 - } 39 - 40 - protected function willFilterPage(array $mirrors) { 41 - assert_instances_of($mirrors, 'PhabricatorRepositoryMirror'); 42 - 43 - $repository_phids = mpull($mirrors, 'getRepositoryPHID'); 44 - if ($repository_phids) { 45 - $repositories = id(new PhabricatorRepositoryQuery()) 46 - ->setViewer($this->getViewer()) 47 - ->withPHIDs($repository_phids) 48 - ->execute(); 49 - $repositories = mpull($repositories, null, 'getPHID'); 50 - } else { 51 - $repositories = array(); 52 - } 53 - 54 - foreach ($mirrors as $key => $mirror) { 55 - $phid = $mirror->getRepositoryPHID(); 56 - if (empty($repositories[$phid])) { 57 - unset($mirrors[$key]); 58 - continue; 59 - } 60 - $mirror->attachRepository($repositories[$phid]); 61 - } 62 - 63 - return $mirrors; 64 - } 65 - 66 - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { 67 - $where = array(); 68 - 69 - if ($this->ids) { 70 - $where[] = qsprintf( 71 - $conn_r, 72 - 'id IN (%Ld)', 73 - $this->ids); 74 - } 75 - 76 - if ($this->phids) { 77 - $where[] = qsprintf( 78 - $conn_r, 79 - 'phid IN (%Ls)', 80 - $this->phids); 81 - } 82 - 83 - if ($this->repositoryPHIDs) { 84 - $where[] = qsprintf( 85 - $conn_r, 86 - 'repositoryPHID IN (%Ls)', 87 - $this->repositoryPHIDs); 88 - } 89 - 90 - $where[] = $this->buildPagingClause($conn_r); 91 - 92 - return $this->formatWhereClause($where); 93 - } 94 - 95 - public function getQueryApplicationClass() { 96 - return 'PhabricatorDiffusionApplication'; 97 - } 98 - 99 - }
+3 -3
src/applications/repository/storage/PhabricatorRepository.php
··· 1493 1493 $commit->delete(); 1494 1494 } 1495 1495 1496 - $mirrors = id(new PhabricatorRepositoryMirror()) 1496 + $uris = id(new PhabricatorRepositoryURI()) 1497 1497 ->loadAllWhere('repositoryPHID = %s', $this->getPHID()); 1498 - foreach ($mirrors as $mirror) { 1499 - $mirror->delete(); 1498 + foreach ($uris as $uri) { 1499 + $uri->delete(); 1500 1500 } 1501 1501 1502 1502 $ref_cursors = id(new PhabricatorRepositoryRefCursor())
+7 -46
src/applications/repository/storage/PhabricatorRepositoryMirror.php
··· 1 1 <?php 2 2 3 - final class PhabricatorRepositoryMirror extends PhabricatorRepositoryDAO 4 - implements PhabricatorPolicyInterface { 3 + /** 4 + * TODO: Remove this class and drop the underlying table after some time has 5 + * passed. It currently exists only so that "bin/storage adjust" does not 6 + * complain about the table. 7 + */ 8 + final class PhabricatorRepositoryMirror 9 + extends PhabricatorRepositoryDAO { 5 10 6 11 protected $repositoryPHID; 7 12 protected $remoteURI; 8 13 protected $credentialPHID; 9 14 10 - private $repository = self::ATTACHABLE; 11 - 12 - public static function initializeNewMirror(PhabricatorUser $actor) { 13 - return id(new PhabricatorRepositoryMirror()) 14 - ->setRemoteURI(''); 15 - } 16 - 17 15 protected function getConfiguration() { 18 16 return array( 19 17 self::CONFIG_AUX_PHID => true, ··· 27 25 ), 28 26 ), 29 27 ) + parent::getConfiguration(); 30 - } 31 - 32 - public function generatePHID() { 33 - return PhabricatorPHID::generateNewPHID( 34 - PhabricatorRepositoryMirrorPHIDType::TYPECONST); 35 - } 36 - 37 - public function attachRepository(PhabricatorRepository $repository) { 38 - $this->repository = $repository; 39 - return $this; 40 - } 41 - 42 - public function getRepository() { 43 - return $this->assertAttached($this->repository); 44 - } 45 - 46 - 47 - /* -( PhabricatorPolicyInterface )----------------------------------------- */ 48 - 49 - 50 - public function getCapabilities() { 51 - return array( 52 - PhabricatorPolicyCapability::CAN_VIEW, 53 - PhabricatorPolicyCapability::CAN_EDIT, 54 - ); 55 - } 56 - 57 - public function getPolicy($capability) { 58 - return $this->getRepository()->getPolicy($capability); 59 - } 60 - 61 - public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { 62 - return $this->getRepository()->hasAutomaticCapability($capability, $viewer); 63 - } 64 - 65 - public function describeAutomaticCapability($capability) { 66 - return null; 67 28 } 68 29 69 30 }
+23
src/applications/repository/storage/PhabricatorRepositoryURI.php
··· 200 200 return $this->getURIObject(true); 201 201 } 202 202 203 + public function getURIEnvelope() { 204 + $uri = $this->getEffectiveURI(); 205 + 206 + $command_engine = $this->newCommandEngine(); 207 + 208 + $is_http = $command_engine->isAnyHTTPProtocol(); 209 + // For SVN, we use `--username` and `--password` flags separately in the 210 + // CommandEngine, so we don't need to add any credentials here. 211 + $is_svn = $this->getRepository()->isSVN(); 212 + $credential_phid = $this->getCredentialPHID(); 213 + 214 + if ($is_http && !$is_svn && $credential_phid) { 215 + $key = PassphrasePasswordKey::loadFromPHID( 216 + $credential_phid, 217 + PhabricatorUser::getOmnipotentUser()); 218 + 219 + $uri->setUser($key->getUsernameEnvelope()->openEnvelope()); 220 + $uri->setPass($key->getPasswordEnvelope()->openEnvelope()); 221 + } 222 + 223 + return new PhutilOpaqueEnvelope((string)$uri); 224 + } 225 + 203 226 private function getURIObject($normalize) { 204 227 // Users can provide Git/SCP-style URIs in the form "user@host:path". 205 228 // These are equivalent to "ssh://user@host/path". We use the more standard