mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-28 17:52:43 +01:00
d86506052c
Summary: See <https://discourse.phabricator-community.org/t/storage-upgrade-error/3748>. It is broadly unsafe for migrations to use "save()". If the object gains new fields later, the query will include "SET newField = X", which will fail against the old schema which is in the process of being upgraded. Instead, migrations must issue raw SQL against the schema as it is expected to exist at the time the migration executes. Migrations have followed this rule for a long time, but this ~6 year old migration was overlooked. Update it to issue a raw query to perform the policy update. Test Plan: This is somewhat flimsy since rebuilding a genuine reproduction case is messy, but used "bin/storage --apply ..." to at least get the new query to execute against modern Phabricator without issues. Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam Differential Revision: https://secure.phabricator.com/D21124
61 lines
1.8 KiB
PHP
61 lines
1.8 KiB
PHP
<?php
|
|
|
|
$table = new PhrictionDocument();
|
|
$conn_w = $table->establishConnection('w');
|
|
|
|
echo pht('Populating Phriction policies.')."\n";
|
|
|
|
$default_view_policy = PhabricatorPolicies::POLICY_USER;
|
|
$default_edit_policy = PhabricatorPolicies::POLICY_USER;
|
|
|
|
foreach (new LiskMigrationIterator($table) as $doc) {
|
|
$id = $doc->getID();
|
|
|
|
if ($doc->getViewPolicy() && $doc->getEditPolicy()) {
|
|
echo pht('Skipping document %d; already has policy set.', $id)."\n";
|
|
continue;
|
|
}
|
|
|
|
$new_view_policy = $default_view_policy;
|
|
$new_edit_policy = $default_edit_policy;
|
|
|
|
// If this was previously a magical project wiki page (under projects/, but
|
|
// not projects/ itself) we need to apply the project policies. Otherwise,
|
|
// apply the default policies.
|
|
$slug = $doc->getSlug();
|
|
$slug = PhabricatorSlug::normalize($slug);
|
|
$prefix = 'projects/';
|
|
if (($slug != $prefix) && (strncmp($slug, $prefix, strlen($prefix)) === 0)) {
|
|
$parts = explode('/', $slug);
|
|
|
|
$project_slug = $parts[1];
|
|
$project_slug = PhabricatorSlug::normalizeProjectSlug($project_slug);
|
|
|
|
$project_slugs = array($project_slug);
|
|
$project = id(new PhabricatorProjectQuery())
|
|
->setViewer(PhabricatorUser::getOmnipotentUser())
|
|
->withSlugs($project_slugs)
|
|
->executeOne();
|
|
|
|
if ($project) {
|
|
$view_policy = nonempty($project->getViewPolicy(), $default_view_policy);
|
|
$edit_policy = nonempty($project->getEditPolicy(), $default_edit_policy);
|
|
|
|
$new_view_policy = $view_policy;
|
|
$new_edit_policy = $edit_policy;
|
|
}
|
|
}
|
|
|
|
echo pht('Migrating document %d to new policy...', $id)."\n";
|
|
|
|
queryfx(
|
|
$conn_w,
|
|
'UPDATE %R SET viewPolicy = %s, editPolicy = %s
|
|
WHERE id = %d',
|
|
$table,
|
|
$new_view_policy,
|
|
$new_edit_policy,
|
|
$id);
|
|
}
|
|
|
|
echo pht('Done.')."\n";
|