mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-23 15:22:41 +01:00
7abe9dc4c0
Summary: Ref T2217. This is the risky, hard part; everything after this should be smooth sailing. This is //mostly// clean, except: - The old format would opportunistically combine a comment with some other transaction type if it could. We no longer do that, so: - When migrating, "edit" + "comment" transactions need to be split in two. - When editing now, we should no longer combine these transaction types. - These changes are pretty straightforward and low-impact. - This migration promotes "auxiliary field" data to the new CustomField/StandardField format, so that's not a straight migration either. The formats are very similar, though. Broadly, this takes the same attack that the auth migration did: proxy all the code through to the new storage. `ManiphestTransaction` is now just an API on top of `ManiphestTransactionPro`, which is the new storage format. The two formats are very similar, so this was mostly a straight copy from one table to the other. Test Plan: - Without performing the migration, made a bunch of edits and comments on tasks and verified the new code works correctly. - Droped the test data and performed the migration. - Looked at the resulting data for obvious discrepancies. - Looked at a bunch of tasks and their transaction history. - Used Conduit to pull transaction data. - Edited task description and clicked "View Details" on transaction. - Used batch editor. - Made a bunch more edits. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2217 Differential Revision: https://secure.phabricator.com/D7068
147 lines
4.4 KiB
PHP
147 lines
4.4 KiB
PHP
<?php
|
|
|
|
$task_table = new ManiphestTask();
|
|
$conn_w = $task_table->establishConnection('w');
|
|
|
|
$rows = new LiskRawMigrationIterator($conn_w, 'maniphest_transaction');
|
|
$conn_w->openTransaction();
|
|
|
|
$xaction_table = new ManiphestTransactionPro();
|
|
$comment_table = new ManiphestTransactionComment();
|
|
|
|
foreach ($rows as $row) {
|
|
$row_id = $row['id'];
|
|
$task_id = $row['taskID'];
|
|
|
|
echo "Migrating row {$row_id} (T{$task_id})...\n";
|
|
|
|
$task_row = queryfx_one(
|
|
$conn_w,
|
|
'SELECT phid FROM %T WHERE id = %d',
|
|
$task_table->getTableName(),
|
|
$task_id);
|
|
if (!$task_row) {
|
|
echo "Skipping, no such task.\n";
|
|
continue;
|
|
}
|
|
|
|
$task_phid = $task_row['phid'];
|
|
|
|
$has_comment = strlen(trim($row['comments']));
|
|
|
|
$xaction_type = $row['transactionType'];
|
|
$xaction_old = $row['oldValue'];
|
|
$xaction_new = $row['newValue'];
|
|
$xaction_source = $row['contentSource'];
|
|
$xaction_meta = $row['metadata'];
|
|
|
|
// Convert "aux" (auxiliary field) transactions to proper CustomField
|
|
// transactions. The formats are very similar, except that the type constant
|
|
// is different and the auxiliary key should be prefixed.
|
|
if ($xaction_type == 'aux') {
|
|
$xaction_meta = @json_decode($xaction_meta, true);
|
|
$xaction_meta = nonempty($xaction_meta, array());
|
|
|
|
$xaction_type = PhabricatorTransactions::TYPE_CUSTOMFIELD;
|
|
|
|
$aux_key = idx($xaction_meta, 'aux:key');
|
|
if (!preg_match('/^std:maniphest:/', $aux_key)) {
|
|
$aux_key = 'std:maniphest:'.$aux_key;
|
|
}
|
|
|
|
$xaction_meta = array(
|
|
'customfield:key' => $aux_key,
|
|
);
|
|
|
|
$xaction_meta = json_encode($xaction_meta);
|
|
}
|
|
|
|
// If this transaction did something other than just leaving a comment,
|
|
// insert a new transaction for that action. If there was a comment (or
|
|
// a comment in addition to an action) we'll insert that below.
|
|
if ($row['transactionType'] != 'comment') {
|
|
$xaction_phid = PhabricatorPHID::generateNewPHID(
|
|
PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST,
|
|
ManiphestPHIDTypeTask::TYPECONST);
|
|
|
|
queryfx(
|
|
$conn_w,
|
|
'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy,
|
|
commentPHID, commentVersion, transactionType, oldValue, newValue,
|
|
contentSource, metadata, dateCreated, dateModified)
|
|
VALUES (%s, %s, %s, %s, %s, %s, %d, %s, %ns, %ns, %s, %s, %d, %d)',
|
|
$xaction_table->getTableName(),
|
|
$xaction_phid,
|
|
$row['authorPHID'],
|
|
$task_phid,
|
|
'public',
|
|
$row['authorPHID'],
|
|
null,
|
|
0,
|
|
$xaction_type,
|
|
$xaction_old,
|
|
$xaction_new,
|
|
$xaction_source,
|
|
$xaction_meta,
|
|
$row['dateCreated'],
|
|
$row['dateModified']);
|
|
}
|
|
|
|
// Now, if the old transaction has a comment, we insert an explicit new
|
|
// transaction for it.
|
|
if ($has_comment) {
|
|
$comment_phid = PhabricatorPHID::generateNewPHID(
|
|
PhabricatorPHIDConstants::PHID_TYPE_XCMT,
|
|
ManiphestPHIDTypeTask::TYPECONST);
|
|
$comment_version = 1;
|
|
|
|
$comment_xaction_phid = PhabricatorPHID::generateNewPHID(
|
|
PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST,
|
|
ManiphestPHIDTypeTask::TYPECONST);
|
|
|
|
// Insert the comment data.
|
|
queryfx(
|
|
$conn_w,
|
|
'INSERT INTO %T (phid, transactionPHID, authorPHID, viewPolicy,
|
|
editPolicy, commentVersion, content, contentSource, isDeleted,
|
|
dateCreated, dateModified)
|
|
VALUES (%s, %s, %s, %s, %s, %d, %s, %s, %d, %d, %d)',
|
|
$comment_table->getTableName(),
|
|
$comment_phid,
|
|
$comment_xaction_phid,
|
|
$row['authorPHID'],
|
|
'public',
|
|
$row['authorPHID'],
|
|
$comment_version,
|
|
$row['comments'],
|
|
$xaction_source,
|
|
0,
|
|
$row['dateCreated'],
|
|
$row['dateModified']);
|
|
|
|
queryfx(
|
|
$conn_w,
|
|
'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy,
|
|
commentPHID, commentVersion, transactionType, oldValue, newValue,
|
|
contentSource, metadata, dateCreated, dateModified)
|
|
VALUES (%s, %s, %s, %s, %s, %s, %d, %s, %ns, %ns, %s, %s, %d, %d)',
|
|
$xaction_table->getTableName(),
|
|
$comment_xaction_phid,
|
|
$row['authorPHID'],
|
|
$task_phid,
|
|
'public',
|
|
$row['authorPHID'],
|
|
$comment_phid,
|
|
$comment_version,
|
|
PhabricatorTransactions::TYPE_COMMENT,
|
|
$xaction_old,
|
|
$xaction_new,
|
|
$xaction_source,
|
|
$xaction_meta,
|
|
$row['dateCreated'],
|
|
$row['dateModified']);
|
|
}
|
|
}
|
|
|
|
$conn_w->saveTransaction();
|
|
echo "Done.\n";
|