From 00d1aea56fdbe677ef2ee53b1963d93c80a95ee1 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 8 Jun 2015 10:32:32 -0700 Subject: [PATCH] Migrate Herald conditions and actions after mailing list changes Summary: Ref T8455. It looks like for at least some installs, there are a lot of rules which use mailing lists and they aren't easy to just manually go fix. Migrate conditions and actions of known types which contain mailing list PHIDs from old MLST PHIDs to new USER PHIDs. Test Plan: - Created a "Subscribers include..." condition using a mailing list, migrated it forward into a user. - Created a "add ccs..." action including a mailing list, migrated it forward into a user. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T8455 Differential Revision: https://secure.phabricator.com/D13184 --- .../sql/autopatches/20150606.mlist.1.php | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 resources/sql/autopatches/20150606.mlist.1.php diff --git a/resources/sql/autopatches/20150606.mlist.1.php b/resources/sql/autopatches/20150606.mlist.1.php new file mode 100644 index 0000000000..8090f28d69 --- /dev/null +++ b/resources/sql/autopatches/20150606.mlist.1.php @@ -0,0 +1,152 @@ +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 HeraldAction(); +$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"; +}