1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-23 14:00:56 +01:00
phorge-phorge/resources/sql/autopatches/20150606.mlist.1.php

153 lines
3.2 KiB
PHP
Raw Normal View History

<?php
$conn_r = id(new PhabricatorMetaMTAMail())->establishConnection('r');
$rows = queryfx_all(
$conn_r,
'SELECT phid, email FROM %T',
'metamta_mailinglist');
if (!$rows) {
echo pht('No mailing lists to migrate.')."\n";
return;
}
$list_map = array();
foreach ($rows as $row) {
$list_map[phutil_utf8_strtolower($row['email'])] = $row['phid'];
}
$emails = id(new PhabricatorUserEmail())->loadAllWhere(
'address IN (%Ls)',
array_keys($list_map));
if (!$emails) {
echo pht('No mailing lists match addresses.')."\n";
return;
}
// Create a map from old mailing list PHIDs to new user PHIDs.
$map = array();
foreach ($emails as $email) {
$user_phid = $email->getUserPHID();
if (!$user_phid) {
continue;
}
$address = $email->getAddress();
$address = phutil_utf8_strtolower($address);
if (isset($list_map[$address])) {
$map[$list_map[$address]] = $user_phid;
}
}
if (!$map) {
echo pht('No mailing lists match users.')."\n";
return;
}
echo pht('Migrating Herald conditions which use mailing lists..')."\n";
$table = new HeraldCondition();
$conn_w = $table->establishConnection('w');
foreach (new LiskMigrationIterator($table) as $condition) {
$name = $condition->getFieldName();
if ($name == 'cc') {
// Okay, we can migrate these.
} else {
// This is not a condition type which has mailing lists in its value, so
// don't try to migrate it.
continue;
}
$value = $condition->getValue();
if (!is_array($value)) {
// Only migrate PHID lists.
continue;
}
foreach ($value as $v) {
if (!is_string($v)) {
// Only migrate PHID lists where all members are PHIDs.
continue 2;
}
}
$new = array();
$any_change = false;
foreach ($value as $v) {
if (isset($map[$v])) {
$new[] = $map[$v];
$any_change = true;
} else {
$new[] = $v;
}
}
if (!$any_change) {
continue;
}
$id = $condition->getID();
queryfx(
$conn_w,
'UPDATE %T SET value = %s WHERE id = %d',
$table->getTableName(),
json_encode($new),
$id);
echo pht('Updated mailing lists in Herald condition %d.', $id)."\n";
}
$table = new HeraldActionRecord();
$conn_w = $table->establishConnection('w');
foreach (new LiskMigrationIterator($table) as $action) {
$name = $action->getAction();
if ($name == 'addcc' || $name == 'remcc') {
// Okay, we can migrate these.
} else {
// This is not an action type which has mailing lists in its targets, so
// don't try to migrate it.
continue;
}
$value = $action->getTarget();
if (!is_array($value)) {
// Only migrate PHID lists.
continue;
}
foreach ($value as $v) {
if (!is_string($v)) {
// Only migrate PHID lists where all members are PHIDs.
continue 2;
}
}
$new = array();
$any_change = false;
foreach ($value as $v) {
if (isset($map[$v])) {
$new[] = $map[$v];
$any_change = true;
} else {
$new[] = $v;
}
}
if (!$any_change) {
continue;
}
$id = $action->getID();
queryfx(
$conn_w,
'UPDATE %T SET target = %s WHERE id = %d',
$table->getTableName(),
json_encode($new),
$id);
echo pht('Updated mailing lists in Herald action %d.', $id)."\n";
}