Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15331193
D15837.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Referenced Files
None
Subscribers
None
D15837.diff
View Options
diff --git a/resources/sql/autopatches/20160503.repo.01.lpath.sql b/resources/sql/autopatches/20160503.repo.01.lpath.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20160503.repo.01.lpath.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_repository.repository
+ ADD localPath VARCHAR(128) COLLATE {$COLLATE_TEXT};
diff --git a/resources/sql/autopatches/20160503.repo.02.lpathkey.sql b/resources/sql/autopatches/20160503.repo.02.lpathkey.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20160503.repo.02.lpathkey.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_repository.repository
+ ADD UNIQUE KEY `key_local` (localPath);
diff --git a/resources/sql/autopatches/20160503.repo.03.lpathmigrate.php b/resources/sql/autopatches/20160503.repo.03.lpathmigrate.php
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20160503.repo.03.lpathmigrate.php
@@ -0,0 +1,57 @@
+<?php
+
+$table = new PhabricatorRepository();
+$conn_w = $table->establishConnection('w');
+
+$default_path = PhabricatorEnv::getEnvConfig('repository.default-local-path');
+$default_path = rtrim($default_path, '/');
+
+foreach (new LiskMigrationIterator($table) as $repository) {
+ $local_path = $repository->getLocalPath();
+ if (strlen($local_path)) {
+ // Repository already has a modern, unique local path.
+ continue;
+ }
+
+ $local_path = $repository->getDetail('local-path');
+ if (!strlen($local_path)) {
+ // Repository does not have a local path using the older format.
+ continue;
+ }
+
+ $random = Filesystem::readRandomCharacters(8);
+
+ // Try the configured path first, then a default path, then a path with some
+ // random noise.
+ $paths = array(
+ $local_path,
+ $default_path.'/'.$repository->getID().'/',
+ $default_path.'/'.$repository->getID().'-'.$random.'/',
+ );
+
+ foreach ($paths as $path) {
+ // Set, then get the path to normalize it.
+ $repository->setLocalPath($path);
+ $path = $repository->getLocalPath();
+
+ try {
+ queryfx(
+ $conn_w,
+ 'UPDATE %T SET localPath = %s WHERE id = %d',
+ $table->getTableName(),
+ $path,
+ $repository->getID());
+
+ echo tsprintf(
+ "%s\n",
+ pht(
+ 'Assigned repository "%s" to local path "%s".',
+ $repository->getDisplayName(),
+ $path));
+
+ break;
+ } catch (AphrontDuplicateKeyQueryException $ex) {
+ // Ignore, try the next one.
+ }
+ }
+}
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
--- a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
@@ -631,9 +631,7 @@
pht('Storage Service'),
$v_service);
- $view->addProperty(
- pht('Storage Path'),
- $repository->getHumanReadableDetail('local-path'));
+ $view->addProperty(pht('Storage Path'), $repository->getLocalPath());
return $view;
}
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditStorageController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditStorageController.php
--- a/src/applications/diffusion/controller/DiffusionRepositoryEditStorageController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryEditStorageController.php
@@ -15,7 +15,7 @@
$edit_uri = $this->getRepositoryControllerURI($repository, 'edit/');
- $v_local = $repository->getHumanReadableDetail('local-path');
+ $v_local = $repository->getLocalPath();
$errors = array();
$crumbs = $this->buildApplicationCrumbs();
@@ -51,11 +51,7 @@
->appendRemarkupInstructions(
pht(
"You can not adjust the local path for this repository from the ".
- "web interface. To edit it, run this command:\n\n %s",
- sprintf(
- 'phabricator/ $ ./bin/repository edit %s --as %s --local-path ...',
- $repository->getMonogram(),
- $viewer->getUsername())))
+ 'web interface.'))
->appendChild(
id(new AphrontFormSubmitControl())
->addCancelButton($edit_uri, pht('Done')));
diff --git a/src/applications/diffusion/management/DiffusionRepositoryStorageManagementPanel.php b/src/applications/diffusion/management/DiffusionRepositoryStorageManagementPanel.php
--- a/src/applications/diffusion/management/DiffusionRepositoryStorageManagementPanel.php
+++ b/src/applications/diffusion/management/DiffusionRepositoryStorageManagementPanel.php
@@ -40,7 +40,7 @@
->setViewer($viewer);
if ($repository->usesLocalWorkingCopy()) {
- $storage_path = $repository->getHumanReadableDetail('local-path');
+ $storage_path = $repository->getLocalPath();
} else {
$storage_path = phutil_tag('em', array(), pht('No Local Working Copy'));
}
diff --git a/src/applications/repository/conduit/RepositoryCreateConduitAPIMethod.php b/src/applications/repository/conduit/RepositoryCreateConduitAPIMethod.php
--- a/src/applications/repository/conduit/RepositoryCreateConduitAPIMethod.php
+++ b/src/applications/repository/conduit/RepositoryCreateConduitAPIMethod.php
@@ -110,7 +110,6 @@
'description' => $request->getValue('description'),
'tracking-enabled' => (bool)$request->getValue('tracking', true),
'remote-uri' => $remote_uri,
- 'local-path' => $local_path,
'branch-filter' => array_fill_keys(
$request->getValue('branchFilter', array()),
true),
@@ -128,6 +127,8 @@
$repository->setDetail($key, $value);
}
+ $repository->setLocalPath($local_path);
+
try {
$repository->save();
} catch (AphrontDuplicateKeyQueryException $ex) {
diff --git a/src/applications/repository/editor/PhabricatorRepositoryEditor.php b/src/applications/repository/editor/PhabricatorRepositoryEditor.php
--- a/src/applications/repository/editor/PhabricatorRepositoryEditor.php
+++ b/src/applications/repository/editor/PhabricatorRepositoryEditor.php
@@ -86,7 +86,7 @@
case PhabricatorRepositoryTransaction::TYPE_REMOTE_URI:
return $object->getDetail('remote-uri');
case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH:
- return $object->getDetail('local-path');
+ return $object->getLocalPath();
case PhabricatorRepositoryTransaction::TYPE_HOSTING:
return $object->isHosted();
case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP:
@@ -209,7 +209,7 @@
$object->setDetail('remote-uri', $xaction->getNewValue());
break;
case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH:
- $object->setDetail('local-path', $xaction->getNewValue());
+ $object->setLocalPath($xaction->getNewValue());
break;
case PhabricatorRepositoryTransaction::TYPE_HOSTING:
return $object->setHosted($xaction->getNewValue());
@@ -706,7 +706,7 @@
// If the repository does not have a local path yet, assign it one based
// on its ID. We can't do this earlier because we won't have an ID yet.
- $local_path = $object->getDetail('local-path');
+ $local_path = $object->getLocalPath();
if (!strlen($local_path)) {
$local_key = 'repository.default-local-path';
@@ -716,7 +716,7 @@
$id = $object->getID();
$local_path = "{$local_root}/{$id}/";
- $object->setDetail('local-path', $local_path);
+ $object->setLocalPath($local_path);
$object->save();
}
diff --git a/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php b/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php
--- a/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php
+++ b/src/applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php
@@ -65,7 +65,7 @@
->setCallsign($callsign)
->setName(pht('Test Repo "%s"', $callsign))
->setVersionControlSystem($vcs_type)
- ->setDetail('local-path', dirname($local).'/'.$callsign)
+ ->setLocalPath(dirname($local).'/'.$callsign)
->setDetail('remote-uri', 'file://'.$dir->getPath().'/');
$this->didConstructRepository($repo);
diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementEditWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementEditWorkflow.php
--- a/src/applications/repository/management/PhabricatorRepositoryManagementEditWorkflow.php
+++ b/src/applications/repository/management/PhabricatorRepositoryManagementEditWorkflow.php
@@ -22,11 +22,6 @@
'help' => pht('Edit as user.'),
),
array(
- 'name' => 'local-path',
- 'param' => 'path',
- 'help' => pht('Edit the local path.'),
- ),
- array(
'name' => 'serve-http',
'param' => 'string',
'help' => pht('Edit the http serving policy.'),
@@ -83,7 +78,6 @@
$xactions = array();
- $type_local_path = PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH;
$type_protocol_http =
PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP;
$type_protocol_ssh = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH;
@@ -93,11 +87,6 @@
PhabricatorRepository::SERVE_READWRITE,
);
- if ($args->getArg('local-path')) {
- $xactions[] = id(new PhabricatorRepositoryTransaction())
- ->setTransactionType($type_local_path)
- ->setNewValue($args->getArg('local-path'));
- }
$serve_http = $args->getArg('serve-http');
if ($serve_http && in_array($serve_http, $allowed_serve_modes)) {
$xactions[] = id(new PhabricatorRepositoryTransaction())
diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php
--- a/src/applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php
+++ b/src/applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php
@@ -128,14 +128,12 @@
}
$repo = $row['repository'];
- $details = $repo->getDetails();
- $details['local-path'] = $row['dst'];
queryfx(
$repo->establishConnection('w'),
- 'UPDATE %T SET details = %s WHERE id = %d',
+ 'UPDATE %T SET localPath = %s WHERE id = %d',
$repo->getTableName(),
- phutil_json_encode($details),
+ $row['dst'],
$repo->getID());
}
diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php
--- a/src/applications/repository/storage/PhabricatorRepository.php
+++ b/src/applications/repository/storage/PhabricatorRepository.php
@@ -62,6 +62,7 @@
protected $credentialPHID;
protected $almanacServicePHID;
protected $spacePHID;
+ protected $localPath;
private $commitCount = self::ATTACHABLE;
private $mostRecentCommit = self::ATTACHABLE;
@@ -107,6 +108,7 @@
'pushPolicy' => 'policy',
'credentialPHID' => 'phid?',
'almanacServicePHID' => 'phid?',
+ 'localPath' => 'text128?',
),
self::CONFIG_KEY_SCHEMA => array(
'callsign' => array(
@@ -123,6 +125,10 @@
'columns' => array('repositorySlug'),
'unique' => true,
),
+ 'key_local' => array(
+ 'columns' => array('localPath'),
+ 'unique' => true,
+ ),
),
) + parent::getConfiguration();
}
@@ -216,6 +222,13 @@
return $monograms;
}
+ public function setLocalPath($path) {
+ // Convert any extra slashes ("//") in the path to a single slash ("/").
+ $path = preg_replace('(//+)', '/', $path);
+
+ return parent::setLocalPath($path);
+ }
+
public function getDetail($key, $default = null) {
return idx($this->details, $key, $default);
}
@@ -279,10 +292,6 @@
));
}
- public function getLocalPath() {
- return $this->getDetail('local-path');
- }
-
public function getSubversionBaseURI($commit = null) {
$subpath = $this->getDetail('svn-subpath');
if (!strlen($subpath)) {
diff --git a/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php b/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php
--- a/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php
+++ b/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php
@@ -70,12 +70,12 @@
$repo->setDetail('hosting-enabled', true);
- $repo->setDetail('local-path', '/var/repo/SVN');
+ $repo->setLocalPath('/var/repo/SVN');
$this->assertEqual(
'file:///var/repo/SVN',
$repo->getSubversionPathURI());
- $repo->setDetail('local-path', '/var/repo/SVN/');
+ $repo->setLocalPath('/var/repo/SVN/');
$this->assertEqual(
'file:///var/repo/SVN',
$repo->getSubversionPathURI());
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 8, 8:25 AM (21 h, 24 m ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7225545
Default Alt Text
D15837.diff (12 KB)
Attached To
Mode
D15837: Guarantee repositories have unique local paths
Attached
Detach File
Event Timeline
Log In to Comment