Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2889509
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
4 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/resources/sql/autopatches/20150602.mlist.2.php b/resources/sql/autopatches/20150602.mlist.2.php
new file mode 100644
index 0000000000..a8f2a090ba
--- /dev/null
+++ b/resources/sql/autopatches/20150602.mlist.2.php
@@ -0,0 +1,145 @@
+<?php
+
+$conn_w = id(new PhabricatorMetaMTAMail())->establishConnection('w');
+$lists = new LiskRawMigrationIterator($conn_w, 'metamta_mailinglist');
+
+echo pht('Migrating mailing lists...')."\n";
+
+foreach ($lists as $list) {
+ $name = $list['name'];
+ $email = $list['email'];
+ $uri = $list['uri'];
+ $old_phid = $list['phid'];
+
+ $username = preg_replace('/[^a-zA-Z0-9_-]+/', '-', $name);
+ $username = preg_replace('/-{2,}/', '-', $username);
+ $username = trim($username, '-');
+ if (!strlen($username)) {
+ $username = 'mailinglist';
+ }
+ $username .= '-list';
+
+ $username_okay = false;
+ for ($suffix = 1; $suffix <= 9; $suffix++) {
+ if ($suffix == 1) {
+ $effective_username = $username;
+ } else {
+ $effective_username = $username.$suffix;
+ }
+
+ $collision = id(new PhabricatorPeopleQuery())
+ ->setViewer(PhabricatorUser::getOmnipotentUser())
+ ->withUsernames(array($effective_username))
+ ->executeOne();
+ if (!$collision) {
+ $username_okay = true;
+ break;
+ }
+ }
+
+ if (!$username_okay) {
+ echo pht(
+ 'Failed to migrate mailing list "%s": unable to generate a unique '.
+ 'username for it.')."\n";
+ continue;
+ }
+
+ $username = $effective_username;
+ if (!PhabricatorUser::validateUsername($username)) {
+ echo pht(
+ 'Failed to migrate mailing list "%s": unable to generate a valid '.
+ 'username for it.',
+ $name)."\n";
+ continue;
+ }
+
+ $address = id(new PhabricatorUserEmail())->loadOneWhere(
+ 'address = %s',
+ $email);
+ if ($address) {
+ echo pht(
+ 'Failed to migrate mailing list "%s": an existing user already '.
+ 'has the email address "%s".',
+ $name,
+ $email)."\n";
+ continue;
+ }
+
+ $user = id(new PhabricatorUser())
+ ->setUsername($username)
+ ->setRealName(pht('Mailing List "%s"', $name))
+ ->setIsApproved(1)
+ ->setIsMailingList(1);
+
+ $email_object = id(new PhabricatorUserEmail())
+ ->setAddress($email)
+ ->setIsVerified(1);
+
+ try {
+ id(new PhabricatorUserEditor())
+ ->setActor($user)
+ ->createNewUser($user, $email_object);
+ } catch (Exception $ex) {
+ echo pht(
+ 'Failed to migrate mailing list "%s": %s.',
+ $name,
+ $ex->getMessage())."\n";
+ continue;
+ }
+
+ $new_phid = $user->getPHID();
+
+ // NOTE: After the PHID type is removed we can't use any Edge code to
+ // modify edges.
+
+ $edge_type = PhabricatorSubscribedToObjectEdgeType::EDGECONST;
+ $edge_inverse = PhabricatorObjectHasSubscriberEdgeType::EDGECONST;
+
+ $map = PhabricatorPHIDType::getAllTypes();
+ foreach ($map as $type => $spec) {
+ try {
+ $object = $spec->newObject();
+ if (!$object) {
+ continue;
+ }
+ $object_conn_w = $object->establishConnection('w');
+ queryfx(
+ $object_conn_w,
+ 'UPDATE %T SET dst = %s WHERE dst = %s AND type = %s',
+ PhabricatorEdgeConfig::TABLE_NAME_EDGE,
+ $new_phid,
+ $old_phid,
+ $edge_inverse);
+ } catch (Exception $ex) {
+ // Just ignore these; they're mostly tables not existing.
+ continue;
+ }
+ }
+
+ try {
+ $dst_phids = queryfx_all(
+ $conn_w,
+ 'SELECT dst FROM %T WHERE src = %s AND type = %s',
+ PhabricatorEdgeConfig::TABLE_NAME_EDGE,
+ $old_phid,
+ $edge_type);
+ if ($dst_phids) {
+ $editor = new PhabricatorEdgeEditor();
+ foreach ($dst_phids as $dst_phid) {
+ $editor->addEdge($new_phid, $edge_type, $dst_phid['dst']);
+ }
+ $editor->save();
+ }
+ } catch (Exception $ex) {
+ echo pht(
+ 'Unable to migrate some inverse edges for mailing list "%s": %s.',
+ $name,
+ $ex->getMessage())."\n";
+ continue;
+ }
+
+ echo pht(
+ 'Migrated mailing list "%s" to mailing list user "%s".',
+ $name,
+ $user->getUsername())."\n";
+}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Jan 19 2025, 12:15 (4 w, 2 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1124462
Default Alt Text
(4 KB)
Attached To
Mode
rP Phorge
Attached
Detach File
Event Timeline
Log In to Comment