mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
72 lines
1.9 KiB
PHP
72 lines
1.9 KiB
PHP
|
<?php
|
||
|
|
||
|
$table = new PhabricatorRepositoryRefCursor();
|
||
|
$conn = $table->establishConnection('w');
|
||
|
|
||
|
$map = array();
|
||
|
foreach (new LiskMigrationIterator($table) as $ref) {
|
||
|
$repository_phid = $ref->getRepositoryPHID();
|
||
|
$ref_type = $ref->getRefType();
|
||
|
$ref_hash = $ref->getRefNameHash();
|
||
|
|
||
|
$ref_key = "{$repository_phid}/{$ref_type}/{$ref_hash}";
|
||
|
|
||
|
if (!isset($map[$ref_key])) {
|
||
|
$map[$ref_key] = array(
|
||
|
'id' => $ref->getID(),
|
||
|
'type' => $ref_type,
|
||
|
'hash' => $ref_hash,
|
||
|
'repositoryPHID' => $repository_phid,
|
||
|
'positions' => array(),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// NOTE: When this migration runs, the table will have "commitIdentifier" and
|
||
|
// "isClosed" fields. Later, it won't. Since they'll be removed, we can't
|
||
|
// rely on being able to access them via the object. Instead, run a separate
|
||
|
// raw query to read them.
|
||
|
|
||
|
$row = queryfx_one(
|
||
|
$conn,
|
||
|
'SELECT commitIdentifier, isClosed FROM %T WHERE id = %d',
|
||
|
$ref->getTableName(),
|
||
|
$ref->getID());
|
||
|
|
||
|
$map[$ref_key]['positions'][] = array(
|
||
|
'identifier' => $row['commitIdentifier'],
|
||
|
'isClosed' => (int)$row['isClosed'],
|
||
|
);
|
||
|
}
|
||
|
|
||
|
// Now, write all the position rows.
|
||
|
$position_table = new PhabricatorRepositoryRefPosition();
|
||
|
foreach ($map as $ref_key => $spec) {
|
||
|
$id = $spec['id'];
|
||
|
foreach ($spec['positions'] as $position) {
|
||
|
queryfx(
|
||
|
$conn,
|
||
|
'INSERT IGNORE INTO %T (cursorID, commitIdentifier, isClosed)
|
||
|
VALUES (%d, %s, %d)',
|
||
|
$position_table->getTableName(),
|
||
|
$id,
|
||
|
$position['identifier'],
|
||
|
$position['isClosed']);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Finally, delete all the redundant RefCursor rows (rows with the same name)
|
||
|
// so we can add proper unique keys in the next migration.
|
||
|
foreach ($map as $ref_key => $spec) {
|
||
|
queryfx(
|
||
|
$conn,
|
||
|
'DELETE FROM %T WHERE refType = %s
|
||
|
AND refNameHash = %s
|
||
|
AND repositoryPHID = %s
|
||
|
AND id != %d',
|
||
|
$table->getTableName(),
|
||
|
$spec['type'],
|
||
|
$spec['hash'],
|
||
|
$spec['repositoryPHID'],
|
||
|
$spec['id']);
|
||
|
}
|