Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F94138357
20150602.mlist.2.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Dec 4, 05:04
Size
3 KB
Mime Type
text/x-php
Expires
Fri, Dec 6, 05:04 (1 d, 12 h)
Engine
blob
Format
Raw Data
Handle
22742223
Attached To
rPH Phabricator
20150602.mlist.2.php
View Options
<?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
"
;
}
Event Timeline
Log In to Comment