Introduce OCP\Migration\IRepairStep and adopt all repair steps to this new interface - refs #24198
This commit is contained in:
parent
a4b1d9feee
commit
c7542c02db
35 changed files with 369 additions and 199 deletions
|
@ -23,23 +23,23 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use Doctrine\DBAL\Platforms\MySqlPlatform;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class AssetCache extends BasicEmitter implements \OC\RepairStep {
|
||||
class AssetCache implements IRepairStep {
|
||||
|
||||
public function getName() {
|
||||
return 'Clear asset cache after upgrade';
|
||||
}
|
||||
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
if (!\OC_Template::isAssetPipelineEnabled()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Asset pipeline disabled -> nothing to do'));
|
||||
$output->info('Asset pipeline disabled -> nothing to do');
|
||||
return;
|
||||
}
|
||||
$assetDir = \OC::$server->getConfig()->getSystemValue('assetdirectory', \OC::$SERVERROOT) . '/assets';
|
||||
\OC_Helper::rmdirr($assetDir, false);
|
||||
$this->emit('\OC\Repair', 'info', array('Asset cache cleared.'));
|
||||
$output->info('Asset cache cleared.');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,17 +22,17 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairStep;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Class RepairConfig
|
||||
*
|
||||
* @package OC\Repair
|
||||
*/
|
||||
class CleanTags extends BasicEmitter implements RepairStep {
|
||||
class CleanTags implements IRepairStep {
|
||||
|
||||
/** @var IDBConnection */
|
||||
protected $connection;
|
||||
|
@ -54,17 +54,18 @@ class CleanTags extends BasicEmitter implements RepairStep {
|
|||
/**
|
||||
* Updates the configuration after running an update
|
||||
*/
|
||||
public function run() {
|
||||
$this->deleteOrphanFileEntries();
|
||||
$this->deleteOrphanTagEntries();
|
||||
$this->deleteOrphanCategoryEntries();
|
||||
public function run(IOutput $output) {
|
||||
$this->deleteOrphanFileEntries($output);
|
||||
$this->deleteOrphanTagEntries($output);
|
||||
$this->deleteOrphanCategoryEntries($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete tag entries for deleted files
|
||||
*/
|
||||
protected function deleteOrphanFileEntries() {
|
||||
protected function deleteOrphanFileEntries(IOutput $output) {
|
||||
$this->deleteOrphanEntries(
|
||||
$output,
|
||||
'%d tags for delete files have been removed.',
|
||||
'vcategory_to_object', 'objid',
|
||||
'filecache', 'fileid', 'path_hash'
|
||||
|
@ -74,8 +75,9 @@ class CleanTags extends BasicEmitter implements RepairStep {
|
|||
/**
|
||||
* Delete tag entries for deleted tags
|
||||
*/
|
||||
protected function deleteOrphanTagEntries() {
|
||||
protected function deleteOrphanTagEntries(IOutput $output) {
|
||||
$this->deleteOrphanEntries(
|
||||
$output,
|
||||
'%d tag entries for deleted tags have been removed.',
|
||||
'vcategory_to_object', 'categoryid',
|
||||
'vcategory', 'id', 'uid'
|
||||
|
@ -85,8 +87,9 @@ class CleanTags extends BasicEmitter implements RepairStep {
|
|||
/**
|
||||
* Delete tags that have no entries
|
||||
*/
|
||||
protected function deleteOrphanCategoryEntries() {
|
||||
protected function deleteOrphanCategoryEntries(IOutput $output) {
|
||||
$this->deleteOrphanEntries(
|
||||
$output,
|
||||
'%d tags with no entries have been removed.',
|
||||
'vcategory', 'id',
|
||||
'vcategory_to_object', 'categoryid', 'type'
|
||||
|
@ -108,7 +111,7 @@ class CleanTags extends BasicEmitter implements RepairStep {
|
|||
* @param string $sourceNullColumn If this column is null in the source table,
|
||||
* the entry is deleted in the $deleteTable
|
||||
*/
|
||||
protected function deleteOrphanEntries($repairInfo, $deleteTable, $deleteId, $sourceTable, $sourceId, $sourceNullColumn) {
|
||||
protected function deleteOrphanEntries(IOutput $output, $repairInfo, $deleteTable, $deleteId, $sourceTable, $sourceId, $sourceNullColumn) {
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
|
||||
$qb->select('d.' . $deleteId)
|
||||
|
@ -141,7 +144,7 @@ class CleanTags extends BasicEmitter implements RepairStep {
|
|||
}
|
||||
|
||||
if ($repairInfo) {
|
||||
$this->emit('\OC\Repair', 'info', array(sprintf($repairInfo, sizeof($orphanItems))));
|
||||
$output->info(sprintf($repairInfo, sizeof($orphanItems)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,9 +23,10 @@
|
|||
namespace OC\Repair;
|
||||
|
||||
use Doctrine\DBAL\Platforms\MySqlPlatform;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class Collation extends BasicEmitter implements \OC\RepairStep {
|
||||
class Collation implements IRepairStep {
|
||||
/**
|
||||
* @var \OCP\IConfig
|
||||
*/
|
||||
|
@ -52,15 +53,15 @@ class Collation extends BasicEmitter implements \OC\RepairStep {
|
|||
/**
|
||||
* Fix mime types
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
if (!$this->connection->getDatabasePlatform() instanceof MySqlPlatform) {
|
||||
$this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to no'));
|
||||
$output->info('Not a mysql database -> nothing to no');
|
||||
return;
|
||||
}
|
||||
|
||||
$tables = $this->getAllNonUTF8BinTables($this->connection);
|
||||
foreach ($tables as $table) {
|
||||
$this->emit('\OC\Repair', 'info', array("Change collation for $table ..."));
|
||||
$output->info("Change collation for $table ...");
|
||||
$query = $this->connection->prepare('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;');
|
||||
$query->execute();
|
||||
}
|
||||
|
|
|
@ -22,11 +22,11 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairStep;
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class DropOldJobs extends BasicEmitter implements RepairStep {
|
||||
class DropOldJobs implements IRepairStep {
|
||||
|
||||
/** @var IJobList */
|
||||
protected $jobList;
|
||||
|
@ -53,7 +53,7 @@ class DropOldJobs extends BasicEmitter implements RepairStep {
|
|||
*
|
||||
* @throws \Exception in case of failure
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
$oldJobs = $this->oldJobs();
|
||||
foreach($oldJobs as $job) {
|
||||
if($this->jobList->has($job['class'], $job['arguments'])) {
|
||||
|
|
|
@ -23,11 +23,11 @@
|
|||
namespace OC\Repair;
|
||||
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairStep;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class DropOldTables extends BasicEmitter implements RepairStep {
|
||||
class DropOldTables implements IRepairStep {
|
||||
|
||||
/** @var IDBConnection */
|
||||
protected $connection;
|
||||
|
@ -54,12 +54,10 @@ class DropOldTables extends BasicEmitter implements RepairStep {
|
|||
*
|
||||
* @throws \Exception in case of failure
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
foreach ($this->oldDatabaseTables() as $tableName) {
|
||||
if ($this->connection->tableExists($tableName)){
|
||||
$this->emit('\OC\Repair', 'info', [
|
||||
sprintf('Table %s has been deleted', $tableName)
|
||||
]);
|
||||
$output->info(sprintf('Table %s has been deleted', $tableName));
|
||||
$this->connection->dropTable($tableName);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,9 +23,10 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class FillETags extends BasicEmitter implements \OC\RepairStep {
|
||||
class FillETags implements IRepairStep {
|
||||
|
||||
/** @var \OCP\IDBConnection */
|
||||
protected $connection;
|
||||
|
@ -41,7 +42,7 @@ class FillETags extends BasicEmitter implements \OC\RepairStep {
|
|||
return 'Generate ETags for file where no ETag is present.';
|
||||
}
|
||||
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$qb->update('filecache')
|
||||
->set('etag', $qb->expr()->literal('xxx'))
|
||||
|
@ -49,7 +50,7 @@ class FillETags extends BasicEmitter implements \OC\RepairStep {
|
|||
->orWhere($qb->expr()->isNull('etag'));
|
||||
|
||||
$result = $qb->execute();
|
||||
$this->emit('\OC\Repair', 'info', array("ETags have been fixed for $result files/folders."));
|
||||
$output->info("ETags have been fixed for $result files/folders.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -25,9 +25,10 @@
|
|||
namespace OC\Repair;
|
||||
|
||||
use Doctrine\DBAL\Platforms\MySqlPlatform;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class InnoDB extends BasicEmitter implements \OC\RepairStep {
|
||||
class InnoDB implements IRepairStep {
|
||||
|
||||
public function getName() {
|
||||
return 'Repair MySQL database engine';
|
||||
|
@ -36,10 +37,10 @@ class InnoDB extends BasicEmitter implements \OC\RepairStep {
|
|||
/**
|
||||
* Fix mime types
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
$connection = \OC::$server->getDatabaseConnection();
|
||||
if (!$connection->getDatabasePlatform() instanceof MySqlPlatform) {
|
||||
$this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to do'));
|
||||
$output->info('Not a mysql database -> nothing to do');
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -47,7 +48,7 @@ class InnoDB extends BasicEmitter implements \OC\RepairStep {
|
|||
if (is_array($tables)) {
|
||||
foreach ($tables as $table) {
|
||||
$connection->exec("ALTER TABLE $table ENGINE=InnoDB;");
|
||||
$this->emit('\OC\Repair', 'info', array("Fixed $table"));
|
||||
$output->info("Fixed $table");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,14 +21,13 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairStep;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
use OCP\Share;
|
||||
|
||||
class OldGroupMembershipShares extends BasicEmitter implements RepairStep {
|
||||
class OldGroupMembershipShares implements IRepairStep {
|
||||
|
||||
/** @var \OCP\IDBConnection */
|
||||
protected $connection;
|
||||
|
@ -65,7 +64,7 @@ class OldGroupMembershipShares extends BasicEmitter implements RepairStep {
|
|||
*
|
||||
* @throws \Exception in case of failure
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
$deletedEntries = 0;
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
|
@ -92,7 +91,7 @@ class OldGroupMembershipShares extends BasicEmitter implements RepairStep {
|
|||
$result->closeCursor();
|
||||
|
||||
if ($deletedEntries) {
|
||||
$this->emit('\OC\Repair', 'info', array('Removed ' . $deletedEntries . ' shares where user is not a member of the group anymore'));
|
||||
$output->info('Removed ' . $deletedEntries . ' shares where user is not a member of the group anymore');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,15 +21,16 @@
|
|||
namespace OC\Repair;
|
||||
|
||||
use OC\Files\View;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class Preview extends BasicEmitter implements \OC\RepairStep {
|
||||
class Preview implements IRepairStep {
|
||||
|
||||
public function getName() {
|
||||
return 'Cleaning-up broken previews';
|
||||
}
|
||||
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
$view = new View('/');
|
||||
$children = $view->getDirectoryContent('/');
|
||||
|
||||
|
@ -42,4 +43,4 @@ class Preview extends BasicEmitter implements \OC\RepairStep {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,10 +21,11 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class RemoveGetETagEntries extends BasicEmitter {
|
||||
class RemoveGetETagEntries implements IRepairStep {
|
||||
|
||||
/**
|
||||
* @var IDBConnection
|
||||
|
@ -45,15 +46,11 @@ class RemoveGetETagEntries extends BasicEmitter {
|
|||
/**
|
||||
* Removes all entries with the key "{DAV:}getetag" from the table properties
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
$sql = 'DELETE FROM `*PREFIX*properties`'
|
||||
. ' WHERE `propertyname` = ?';
|
||||
$deletedRows = $this->connection->executeUpdate($sql, ['{DAV:}getetag']);
|
||||
|
||||
$this->emit(
|
||||
'\OC\Repair',
|
||||
'info',
|
||||
['Removed ' . $deletedRows . ' unneeded "{DAV:}getetag" entries from properties table.']
|
||||
);
|
||||
$out->info('Removed ' . $deletedRows . ' unneeded "{DAV:}getetag" entries from properties table.');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,23 +23,20 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Repairs shares with invalid data
|
||||
*/
|
||||
class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
|
||||
class RepairInvalidShares implements IRepairStep {
|
||||
|
||||
const CHUNK_SIZE = 200;
|
||||
|
||||
/**
|
||||
* @var \OCP\IConfig
|
||||
*/
|
||||
/** @var \OCP\IConfig */
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* @var \OCP\IDBConnection
|
||||
*/
|
||||
/** @var \OCP\IDBConnection */
|
||||
protected $connection;
|
||||
|
||||
/**
|
||||
|
@ -59,7 +56,7 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
|
|||
* Past bugs would make it possible to set an expiration date on user shares even
|
||||
* though it is not supported. This functions removes the expiration date from such entries.
|
||||
*/
|
||||
private function removeExpirationDateFromNonLinkShares() {
|
||||
private function removeExpirationDateFromNonLinkShares(IOutput $out) {
|
||||
$builder = $this->connection->getQueryBuilder();
|
||||
$builder
|
||||
->update('share')
|
||||
|
@ -69,14 +66,14 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
|
|||
|
||||
$updatedEntries = $builder->execute();
|
||||
if ($updatedEntries > 0) {
|
||||
$this->emit('\OC\Repair', 'info', array('Removed invalid expiration date from ' . $updatedEntries . ' shares'));
|
||||
$out->info('Removed invalid expiration date from ' . $updatedEntries . ' shares');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove shares where the parent share does not exist anymore
|
||||
*/
|
||||
private function removeSharesNonExistingParent() {
|
||||
private function removeSharesNonExistingParent(IOutput $out) {
|
||||
$deletedEntries = 0;
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
|
@ -105,17 +102,17 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
|
|||
}
|
||||
|
||||
if ($deletedEntries) {
|
||||
$this->emit('\OC\Repair', 'info', array('Removed ' . $deletedEntries . ' shares where the parent did not exist'));
|
||||
$out->info('Removed ' . $deletedEntries . ' shares where the parent did not exist');
|
||||
}
|
||||
}
|
||||
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
$ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
|
||||
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.7', '<')) {
|
||||
// this situation was only possible before 8.2
|
||||
$this->removeExpirationDateFromNonLinkShares();
|
||||
$this->removeExpirationDateFromNonLinkShares($out);
|
||||
}
|
||||
|
||||
$this->removeSharesNonExistingParent();
|
||||
$this->removeSharesNonExistingParent($out);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,10 +24,11 @@
|
|||
namespace OC\Repair;
|
||||
|
||||
use OC\Files\Cache\Storage;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairException;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class RepairLegacyStorages extends BasicEmitter {
|
||||
class RepairLegacyStorages implements IRepairStep{
|
||||
/**
|
||||
* @var \OCP\IConfig
|
||||
*/
|
||||
|
@ -149,7 +150,7 @@ class RepairLegacyStorages extends BasicEmitter {
|
|||
* Converts legacy home storage ids in the format
|
||||
* "local::/data/dir/path/userid/" to the new format "home::userid"
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
// only run once
|
||||
if ($this->config->getAppValue('core', 'repairlegacystoragesdone') === 'yes') {
|
||||
return;
|
||||
|
@ -186,11 +187,7 @@ class RepairLegacyStorages extends BasicEmitter {
|
|||
}
|
||||
catch (RepairException $e) {
|
||||
$hasWarnings = true;
|
||||
$this->emit(
|
||||
'\OC\Repair',
|
||||
'warning',
|
||||
array('Could not repair legacy storage ' . $currentId . ' automatically.')
|
||||
);
|
||||
$out->warning('Could not repair legacy storage ' . $currentId . ' automatically.');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -233,11 +230,7 @@ class RepairLegacyStorages extends BasicEmitter {
|
|||
}
|
||||
catch (RepairException $e) {
|
||||
$hasWarnings = true;
|
||||
$this->emit(
|
||||
'\OC\Repair',
|
||||
'warning',
|
||||
array('Could not repair legacy storage ' . $storageId . ' automatically.')
|
||||
);
|
||||
$out->warning('Could not repair legacy storage ' . $storageId . ' automatically.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -245,16 +238,12 @@ class RepairLegacyStorages extends BasicEmitter {
|
|||
} while (count($results) >= $limit);
|
||||
}
|
||||
|
||||
$this->emit('\OC\Repair', 'info', array('Updated ' . $count . ' legacy home storage ids'));
|
||||
$out->info('Updated ' . $count . ' legacy home storage ids');
|
||||
|
||||
$this->connection->commit();
|
||||
|
||||
if ($hasWarnings) {
|
||||
$this->emit(
|
||||
'\OC\Repair',
|
||||
'warning',
|
||||
array('Some legacy storages could not be repaired. Please manually fix them then re-run ./occ maintenance:repair')
|
||||
);
|
||||
$out->warning('Some legacy storages could not be repaired. Please manually fix them then re-run ./occ maintenance:repair');
|
||||
} else {
|
||||
// if all were done, no need to redo the repair during next upgrade
|
||||
$this->config->setAppValue('core', 'repairlegacystoragesdone', 'yes');
|
||||
|
|
|
@ -28,9 +28,10 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
|
||||
class RepairMimeTypes implements IRepairStep {
|
||||
/**
|
||||
* @var \OCP\IConfig
|
||||
*/
|
||||
|
@ -308,7 +309,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
|
|||
/**
|
||||
* Fix mime types
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
|
||||
$ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
|
||||
|
||||
|
@ -318,60 +319,60 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
|
|||
// only update mime types if necessary as it can be expensive
|
||||
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0', '<')) {
|
||||
if ($this->fixOfficeMimeTypes()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
|
||||
$out->info('Fixed office mime types');
|
||||
}
|
||||
|
||||
if ($this->fixApkMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
|
||||
$out->info('Fixed APK mime type');
|
||||
}
|
||||
|
||||
if ($this->fixFontsMimeTypes()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
|
||||
$out->info('Fixed fonts mime types');
|
||||
}
|
||||
|
||||
if ($this->fixPostscriptMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
|
||||
$out->info('Fixed Postscript mime types');
|
||||
}
|
||||
|
||||
if ($this->introduceRawMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
|
||||
$out->info('Fixed Raw mime types');
|
||||
}
|
||||
|
||||
if ($this->introduce3dImagesMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
|
||||
$out->info('Fixed 3D images mime types');
|
||||
}
|
||||
|
||||
if ($this->introduceConfMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
|
||||
$out->info('Fixed Conf/cnf mime types');
|
||||
}
|
||||
|
||||
if ($this->introduceYamlMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
|
||||
$out->info('Fixed Yaml/Yml mime types');
|
||||
}
|
||||
}
|
||||
|
||||
// Mimetype updates from #19272
|
||||
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.8', '<')) {
|
||||
if ($this->introduceJavaMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed java/class mime types'));
|
||||
$out->info('Fixed java/class mime types');
|
||||
}
|
||||
|
||||
if ($this->introduceHppMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed hpp mime type'));
|
||||
$out->info('Fixed hpp mime type');
|
||||
}
|
||||
|
||||
if ($this->introduceRssMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed rss mime type'));
|
||||
$out->info('Fixed rss mime type');
|
||||
}
|
||||
|
||||
if ($this->introduceRtfMimeType()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed rtf mime type'));
|
||||
$out->info('Fixed rtf mime type');
|
||||
}
|
||||
}
|
||||
|
||||
if (version_compare($ocVersionFromBeforeUpdate, '9.0.0.10', '<')) {
|
||||
if ($this->introduceRichDocumentsMimeTypes()) {
|
||||
$this->emit('\OC\Repair', 'info', array('Fixed richdocuments additional office mime types'));
|
||||
$out->info('Fixed richdocuments additional office mime types');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,9 +22,10 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep {
|
||||
class SearchLuceneTables implements IRepairStep {
|
||||
|
||||
public function getName() {
|
||||
return 'Repair duplicate entries in oc_lucene_status';
|
||||
|
@ -51,10 +52,10 @@ class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep {
|
|||
*
|
||||
* search_lucene will then reindex the fileids without a status when the next indexing job is executed
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
$connection = \OC::$server->getDatabaseConnection();
|
||||
if ($connection->tableExists('lucene_status')) {
|
||||
$this->emit('\OC\Repair', 'info', array('removing duplicate entries from lucene_status'));
|
||||
$out->info('removing duplicate entries from lucene_status');
|
||||
|
||||
$query = $connection->prepare('
|
||||
DELETE FROM `*PREFIX*lucene_status`
|
||||
|
@ -69,7 +70,7 @@ class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep {
|
|||
)');
|
||||
$query->execute();
|
||||
} else {
|
||||
$this->emit('\OC\Repair', 'info', array('lucene_status table does not exist -> nothing to do'));
|
||||
$out->info('lucene_status table does not exist -> nothing to do');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,10 +20,12 @@
|
|||
*/
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\IConfig;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class SharePropagation implements IRepairStep {
|
||||
|
||||
class SharePropagation extends BasicEmitter implements \OC\RepairStep {
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
|
||||
|
@ -40,7 +42,7 @@ class SharePropagation extends BasicEmitter implements \OC\RepairStep {
|
|||
return 'Remove old share propagation app entries';
|
||||
}
|
||||
|
||||
public function run() {
|
||||
public function run(IOutput $out ) {
|
||||
$keys = $this->config->getAppKeys('files_sharing');
|
||||
|
||||
foreach ($keys as $key) {
|
||||
|
|
|
@ -26,13 +26,14 @@ use Doctrine\DBAL\Schema\SchemaException;
|
|||
use Doctrine\DBAL\Schema\SchemaDiff;
|
||||
use Doctrine\DBAL\Schema\TableDiff;
|
||||
use Doctrine\DBAL\Schema\ColumnDiff;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Fixes Sqlite autoincrement by forcing the SQLite table schemas to be
|
||||
* altered in order to retrigger SQL schema generation through OCSqlitePlatform.
|
||||
*/
|
||||
class SqliteAutoincrement extends BasicEmitter implements \OC\RepairStep {
|
||||
class SqliteAutoincrement implements IRepairStep {
|
||||
/**
|
||||
* @var \OC\DB\Connection
|
||||
*/
|
||||
|
@ -52,7 +53,7 @@ class SqliteAutoincrement extends BasicEmitter implements \OC\RepairStep {
|
|||
/**
|
||||
* Fix mime types
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
if (!$this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -22,10 +22,10 @@
|
|||
namespace OC\Repair;
|
||||
|
||||
use OC\Files\View;
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairStep;
|
||||
use OC\Server;
|
||||
use OCP\IConfig;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Class UpdateCertificateStore rewrites the user specific certificate store after
|
||||
|
@ -34,7 +34,7 @@ use OCP\IConfig;
|
|||
*
|
||||
* @package OC\Repair
|
||||
*/
|
||||
class UpdateCertificateStore extends BasicEmitter implements RepairStep {
|
||||
class UpdateCertificateStore implements IRepairStep {
|
||||
/**
|
||||
* FIXME: The certificate manager does only allow specifying the user
|
||||
* within the constructor. This makes DI impossible.
|
||||
|
@ -60,7 +60,7 @@ class UpdateCertificateStore extends BasicEmitter implements RepairStep {
|
|||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
public function run() {
|
||||
public function run(IOutput $out) {
|
||||
$rootView = new View();
|
||||
$dataDirectory = $this->config->getSystemValue('datadirectory', null);
|
||||
if(is_null($dataDirectory)) {
|
||||
|
|
|
@ -21,9 +21,9 @@
|
|||
|
||||
namespace OC\Repair;
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OC\RepairStep;
|
||||
use OCP\IConfig;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Class UpdateOutdatedOcsIds is used to update invalid outdated OCS IDs, this is
|
||||
|
@ -33,7 +33,7 @@ use OCP\IConfig;
|
|||
*
|
||||
* @package OC\Repair
|
||||
*/
|
||||
class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep {
|
||||
class UpdateOutdatedOcsIds implements IRepairStep {
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
|
||||
|
@ -71,7 +71,7 @@ class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function run() {
|
||||
public function run(IOutput $output) {
|
||||
$appsToUpdate = [
|
||||
'contacts' => [
|
||||
'old' => '166044',
|
||||
|
@ -97,11 +97,7 @@ class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep {
|
|||
|
||||
foreach($appsToUpdate as $appName => $ids) {
|
||||
if ($this->fixOcsId($appName, $ids['old'], $ids['new'])) {
|
||||
$this->emit(
|
||||
'\OC\Repair',
|
||||
'info',
|
||||
[sprintf('Fixed invalid %s OCS id', $appName)]
|
||||
);
|
||||
$output->info("Fixed invalid $appName OCS id");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,11 +46,13 @@ use OC\Repair\RepairMimeTypes;
|
|||
use OC\Repair\SearchLuceneTables;
|
||||
use OC\Repair\UpdateOutdatedOcsIds;
|
||||
use OC\Repair\RepairInvalidShares;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||
use Symfony\Component\EventDispatcher\GenericEvent;
|
||||
|
||||
class Repair extends BasicEmitter {
|
||||
/* @var RepairStep[] */
|
||||
class Repair extends BasicEmitter implements IOutput{
|
||||
/* @var IRepairStep[] */
|
||||
private $repairSteps;
|
||||
/** @var EventDispatcher */
|
||||
private $dispatcher;
|
||||
|
@ -58,7 +60,7 @@ class Repair extends BasicEmitter {
|
|||
/**
|
||||
* Creates a new repair step runner
|
||||
*
|
||||
* @param RepairStep[] $repairSteps array of RepairStep instances
|
||||
* @param IRepairStep[] $repairSteps array of RepairStep instances
|
||||
* @param EventDispatcher $dispatcher
|
||||
*/
|
||||
public function __construct($repairSteps = [], EventDispatcher $dispatcher = null) {
|
||||
|
@ -88,24 +90,24 @@ class Repair extends BasicEmitter {
|
|||
});
|
||||
}
|
||||
|
||||
$step->run();
|
||||
$step->run($this);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add repair step
|
||||
*
|
||||
* @param RepairStep|string $repairStep repair step
|
||||
* @param IRepairStep|string $repairStep repair step
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function addStep($repairStep) {
|
||||
if (is_string($repairStep)) {
|
||||
if (class_exists($repairStep)) {
|
||||
$s = new $repairStep();
|
||||
if ($s instanceof RepairStep) {
|
||||
if ($s instanceof IRepairStep) {
|
||||
$this->repairSteps[] = $s;
|
||||
} else {
|
||||
throw new \Exception("Repair step '$repairStep' is not of type \\OC\\RepairStep");
|
||||
throw new \Exception("Repair step '$repairStep' is not of type \\OCP\\Migration\\IRepairStep");
|
||||
}
|
||||
} else {
|
||||
throw new \Exception("Repair step '$repairStep' is unknown");
|
||||
|
@ -119,7 +121,7 @@ class Repair extends BasicEmitter {
|
|||
* Returns the default repair steps to be run on the
|
||||
* command line or after an upgrade.
|
||||
*
|
||||
* @return array of RepairStep instances
|
||||
* @return IRepairStep[]
|
||||
*/
|
||||
public static function getRepairSteps() {
|
||||
return [
|
||||
|
@ -141,7 +143,7 @@ class Repair extends BasicEmitter {
|
|||
* Returns expensive repair steps to be run on the
|
||||
* command line with a special option.
|
||||
*
|
||||
* @return array of RepairStep instances
|
||||
* @return IRepairStep[]
|
||||
*/
|
||||
public static function getExpensiveRepairSteps() {
|
||||
return [
|
||||
|
@ -153,7 +155,7 @@ class Repair extends BasicEmitter {
|
|||
* Returns the repair steps to be run before an
|
||||
* upgrade.
|
||||
*
|
||||
* @return array of RepairStep instances
|
||||
* @return IRepairStep[]
|
||||
*/
|
||||
public static function getBeforeUpgradeRepairSteps() {
|
||||
$connection = \OC::$server->getDatabaseConnection();
|
||||
|
@ -185,4 +187,41 @@ class Repair extends BasicEmitter {
|
|||
new GenericEvent("$scope::$method", $arguments));
|
||||
}
|
||||
}
|
||||
|
||||
public function info($string) {
|
||||
// for now just emit as we did in the past
|
||||
$this->emit('\OC\Repair', 'info', array($string));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
*/
|
||||
public function warning($message) {
|
||||
// for now just emit as we did in the past
|
||||
$this->emit('\OC\Repair', 'warning', [$message]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $max
|
||||
*/
|
||||
public function startProgress($max = 0) {
|
||||
// for now just emit as we did in the past
|
||||
$this->emit('\OC\Repair', 'startProgress', [$max]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $step
|
||||
*/
|
||||
public function advance($step = 1) {
|
||||
// for now just emit as we did in the past
|
||||
$this->emit('\OC\Repair', 'advance', [$step]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $max
|
||||
*/
|
||||
public function finishProgress() {
|
||||
// for now just emit as we did in the past
|
||||
$this->emit('\OC\Repair', 'finishProgress', []);
|
||||
}
|
||||
}
|
||||
|
|
61
lib/public/migration/ioutput.php
Normal file
61
lib/public/migration/ioutput.php
Normal file
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
namespace OCP\Migration;
|
||||
|
||||
/**
|
||||
* Interface IOutput
|
||||
*
|
||||
* @package OCP\Migration
|
||||
* @since 9.1.0
|
||||
*/
|
||||
interface IOutput {
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function info($message);
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function warning($message);
|
||||
|
||||
/**
|
||||
* @param int $max
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function startProgress($max = 0);
|
||||
|
||||
/**
|
||||
* @param int $step
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function advance($step = 1);
|
||||
|
||||
/**
|
||||
* @param int $max
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function finishProgress();
|
||||
|
||||
}
|
|
@ -18,17 +18,19 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
namespace OC;
|
||||
namespace OCP\Migration;
|
||||
|
||||
/**
|
||||
* Repair step
|
||||
* @since 9.1.0
|
||||
*/
|
||||
interface RepairStep {
|
||||
interface IRepairStep {
|
||||
|
||||
/**
|
||||
* Returns the step's name
|
||||
*
|
||||
* @return string
|
||||
* @since 9.1.0
|
||||
*/
|
||||
public function getName();
|
||||
|
||||
|
@ -36,8 +38,9 @@ interface RepairStep {
|
|||
* Run repair step.
|
||||
* Must throw exception on error.
|
||||
*
|
||||
* @since 9.1.0
|
||||
* @throws \Exception in case of failure
|
||||
*/
|
||||
public function run();
|
||||
public function run(IOutput $output);
|
||||
|
||||
}
|
|
@ -6,9 +6,9 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
use OC\Hooks\BasicEmitter;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class TestRepairStep extends BasicEmitter implements \OC\RepairStep{
|
||||
class TestRepairStep implements IRepairStep {
|
||||
private $warning;
|
||||
|
||||
public function __construct($warning = false) {
|
||||
|
@ -19,12 +19,12 @@ class TestRepairStep extends BasicEmitter implements \OC\RepairStep{
|
|||
return 'Test Name';
|
||||
}
|
||||
|
||||
public function run() {
|
||||
public function run(\OCP\Migration\IOutput $out) {
|
||||
if ($this->warning) {
|
||||
$this->emit('\OC\Repair', 'warning', array('Simulated warning'));
|
||||
$out->warning('Simulated warning');
|
||||
}
|
||||
else {
|
||||
$this->emit('\OC\Repair', 'info', array('Simulated info'));
|
||||
$out->info('Simulated info');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
namespace Test\Repair;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
/**
|
||||
* Tests for the cleaning the tags tables
|
||||
|
@ -18,7 +19,7 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
|
|||
*/
|
||||
class CleanTags extends \Test\TestCase {
|
||||
|
||||
/** @var \OC\RepairStep */
|
||||
/** @var \OC\Repair\CleanTags */
|
||||
protected $repair;
|
||||
|
||||
/** @var \OCP\IDBConnection */
|
||||
|
@ -27,9 +28,16 @@ class CleanTags extends \Test\TestCase {
|
|||
/** @var int */
|
||||
protected $createdFile;
|
||||
|
||||
/** @var IOutput */
|
||||
private $outputMock;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->connection = \OC::$server->getDatabaseConnection();
|
||||
$this->repair = new \OC\Repair\CleanTags($this->connection);
|
||||
$this->cleanUpTables();
|
||||
|
@ -67,15 +75,15 @@ class CleanTags extends \Test\TestCase {
|
|||
$this->assertEntryCount('vcategory_to_object', 4, 'Assert tag entries count before repair step');
|
||||
$this->assertEntryCount('vcategory', 4, 'Assert tag categories count before repair step');
|
||||
|
||||
self::invokePrivate($this->repair, 'deleteOrphanFileEntries');
|
||||
self::invokePrivate($this->repair, 'deleteOrphanFileEntries', [$this->outputMock]);
|
||||
$this->assertEntryCount('vcategory_to_object', 3, 'Assert tag entries count after cleaning file entries');
|
||||
$this->assertEntryCount('vcategory', 4, 'Assert tag categories count after cleaning file entries');
|
||||
|
||||
self::invokePrivate($this->repair, 'deleteOrphanTagEntries');
|
||||
self::invokePrivate($this->repair, 'deleteOrphanTagEntries', [$this->outputMock]);
|
||||
$this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning tag entries');
|
||||
$this->assertEntryCount('vcategory', 4, 'Assert tag categories count after cleaning tag entries');
|
||||
|
||||
self::invokePrivate($this->repair, 'deleteOrphanCategoryEntries');
|
||||
self::invokePrivate($this->repair, 'deleteOrphanCategoryEntries', [$this->outputMock]);
|
||||
$this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning category entries');
|
||||
$this->assertEntryCount('vcategory', 2, 'Assert tag categories count after cleaning category entries');
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
namespace Test\Repair;
|
||||
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
/**
|
||||
* Tests for the dropping old tables
|
||||
|
@ -33,8 +34,13 @@ class DropOldJobs extends \Test\TestCase {
|
|||
$this->assertTrue($this->jobList->has('OC\Cache\FileGlobalGC', null), 'Asserting that the job OC\Cache\FileGlobalGC exists before repairing');
|
||||
$this->assertTrue($this->jobList->has('OC_Cache_FileGlobalGC', null), 'Asserting that the job OC_Cache_FileGlobalGC exists before repairing');
|
||||
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$repair = new \OC\Repair\DropOldJobs($this->jobList);
|
||||
$repair->run();
|
||||
$repair->run($outputMock);
|
||||
|
||||
$this->assertFalse($this->jobList->has('OC\Cache\FileGlobalGC', null), 'Asserting that the job OC\Cache\FileGlobalGC does not exist after repairing');
|
||||
$this->assertFalse($this->jobList->has('OC_Cache_FileGlobalGC', null), 'Asserting that the job OC_Cache_FileGlobalGC does not exist after repairing');
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
*/
|
||||
|
||||
namespace Test\Repair;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
/**
|
||||
* Tests for the dropping old tables
|
||||
|
@ -31,8 +32,13 @@ class DropOldTables extends \Test\TestCase {
|
|||
$this->assertFalse($this->connection->tableExists('sharing'), 'Asserting that the table oc_sharing does not exist before repairing');
|
||||
$this->assertTrue($this->connection->tableExists('permissions'), 'Asserting that the table oc_permissions does exist before repairing');
|
||||
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$repair = new \OC\Repair\DropOldTables($this->connection);
|
||||
$repair->run();
|
||||
$repair->run($outputMock);
|
||||
|
||||
$this->assertFalse($this->connection->tableExists('sharing'), 'Asserting that the table oc_sharing does not exist after repairing');
|
||||
$this->assertFalse($this->connection->tableExists('permissions'), 'Asserting that the table oc_permissions does not exist after repairing');
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace Test\Repair;
|
|||
|
||||
use OC\Repair\OldGroupMembershipShares;
|
||||
use OC\Share\Constants;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
/**
|
||||
* Class OldGroupMembershipSharesTest
|
||||
|
@ -82,7 +83,12 @@ class OldGroupMembershipSharesTest extends \Test\TestCase {
|
|||
$this->assertEquals([['id' => $parent], ['id' => $group2], ['id' => $user1], ['id' => $member], ['id' => $notAMember]], $rows);
|
||||
$result->closeCursor();
|
||||
|
||||
$repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$repair->run($outputMock);
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$result = $query->select('id')
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
namespace Test\Repair;
|
||||
|
||||
use OC\Repair\RemoveGetETagEntries;
|
||||
use OCP\Migration\IOutput;
|
||||
use Test\TestCase;
|
||||
|
||||
/**
|
||||
|
@ -65,9 +66,14 @@ class RemoveGetETagEntriesTest extends TestCase {
|
|||
$this->assertTrue(in_array($entry, $data), 'Asserts that the entries are the ones from the test data set');
|
||||
}
|
||||
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
// run repair step
|
||||
$repair = new RemoveGetETagEntries($this->connection);
|
||||
$repair->run();
|
||||
$repair->run($outputMock);
|
||||
|
||||
// check if test data is correctly modified in DB
|
||||
$stmt = $this->connection->executeQuery($sqlToFetchProperties, [$userName]);
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2014 Thomas Müller <deepdiver@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
|
@ -70,7 +72,12 @@ class TestRepairCollation extends \Test\TestCase {
|
|||
$tables = $this->repair->getAllNonUTF8BinTables($this->connection);
|
||||
$this->assertGreaterThanOrEqual(1, count($tables));
|
||||
|
||||
$this->repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repair->run($outputMock);
|
||||
|
||||
$tables = $this->repair->getAllNonUTF8BinTables($this->connection);
|
||||
$this->assertCount(0, $tables);
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace Test\Repair;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Tests for the converting of MySQL tables to InnoDB engine
|
||||
|
@ -16,7 +18,7 @@ namespace Test\Repair;
|
|||
*/
|
||||
class RepairInnoDB extends \Test\TestCase {
|
||||
|
||||
/** @var \OC\RepairStep */
|
||||
/** @var IRepairStep */
|
||||
private $repair;
|
||||
|
||||
/** @var \Doctrine\DBAL\Connection */
|
||||
|
@ -49,7 +51,12 @@ class RepairInnoDB extends \Test\TestCase {
|
|||
$result = $this->countMyIsamTables();
|
||||
$this->assertEquals(1, $result);
|
||||
|
||||
$this->repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repair->run($outputMock);
|
||||
|
||||
$result = $this->countMyIsamTables();
|
||||
$this->assertEquals(0, $result);
|
||||
|
|
|
@ -11,6 +11,8 @@ namespace Test\Repair;
|
|||
|
||||
use OC\Repair\RepairInvalidShares;
|
||||
use OC\Share\Constants;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
use Test\TestCase;
|
||||
|
||||
/**
|
||||
|
@ -22,7 +24,7 @@ use Test\TestCase;
|
|||
*/
|
||||
class RepairInvalidSharesTest extends TestCase {
|
||||
|
||||
/** @var \OC\RepairStep */
|
||||
/** @var IRepairStep */
|
||||
private $repair;
|
||||
|
||||
/** @var \OCP\IDBConnection */
|
||||
|
@ -98,7 +100,12 @@ class RepairInvalidSharesTest extends TestCase {
|
|||
'token' => $qb->expr()->literal('abcdefg')
|
||||
])->execute();
|
||||
|
||||
$this->repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repair->run($outputMock);
|
||||
|
||||
$results = $this->connection->getQueryBuilder()
|
||||
->select('*')
|
||||
|
@ -167,7 +174,12 @@ class RepairInvalidSharesTest extends TestCase {
|
|||
$this->assertEquals([['id' => $parent], ['id' => $validChild], ['id' => $invalidChild]], $rows);
|
||||
$result->closeCursor();
|
||||
|
||||
$this->repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repair->run($outputMock);
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$result = $query->select('id')
|
||||
|
|
|
@ -10,6 +10,8 @@ namespace Test\Repair;
|
|||
|
||||
use OC\Files\Cache\Cache;
|
||||
use OC\Files\Cache\Storage;
|
||||
use OCP\Migration\IOutput;
|
||||
use PHPUnit_Framework_MockObject_MockObject;
|
||||
use Test\TestCase;
|
||||
|
||||
/**
|
||||
|
@ -34,7 +36,8 @@ class RepairLegacyStorages extends TestCase {
|
|||
private $legacyStorageId;
|
||||
private $newStorageId;
|
||||
|
||||
private $warnings;
|
||||
/** @var IOutput | PHPUnit_Framework_MockObject_MockObject */
|
||||
private $outputMock;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
@ -45,11 +48,9 @@ class RepairLegacyStorages extends TestCase {
|
|||
|
||||
$this->repair = new \OC\Repair\RepairLegacyStorages($this->config, $this->connection);
|
||||
|
||||
$this->warnings = [];
|
||||
|
||||
$this->repair->listen('\OC\Repair', 'warning', function ($description){
|
||||
$this->warnings[] = $description;
|
||||
});
|
||||
$this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
}
|
||||
|
||||
protected function tearDown() {
|
||||
|
@ -141,7 +142,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
$this->prepareSettings($dataDir, $userId);
|
||||
$newStorageNumId = $this->createStorage($this->newStorageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertNull($this->getStorageId($this->legacyStorageId));
|
||||
$this->assertEquals($newStorageNumId, $this->getStorageId($this->newStorageId));
|
||||
|
@ -160,7 +161,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
$this->prepareSettings($dataDir, $userId);
|
||||
$legacyStorageNumId = $this->createStorage($this->legacyStorageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertNull($this->getStorageId($this->legacyStorageId));
|
||||
$this->assertEquals($legacyStorageNumId, $this->getStorageId($this->newStorageId));
|
||||
|
@ -182,7 +183,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
|
||||
$this->createData($this->legacyStorageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertNull($this->getStorageId($this->legacyStorageId));
|
||||
$this->assertEquals($legacyStorageNumId, $this->getStorageId($this->newStorageId));
|
||||
|
@ -205,7 +206,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
|
||||
$this->createData($this->newStorageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertNull($this->getStorageId($this->legacyStorageId));
|
||||
$this->assertEquals($newStorageNumId, $this->getStorageId($this->newStorageId));
|
||||
|
@ -228,10 +229,8 @@ class RepairLegacyStorages extends TestCase {
|
|||
$this->createData($this->legacyStorageId);
|
||||
$this->createData($this->newStorageId);
|
||||
|
||||
$this->repair->run();
|
||||
|
||||
$this->assertEquals(2, count($this->warnings));
|
||||
$this->assertEquals('Could not repair legacy storage ', substr(current($this->warnings), 0, 32));
|
||||
$this->outputMock->expects($this->exactly(2))->method('warning');
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
// storages left alone
|
||||
$this->assertEquals($legacyStorageNumId, $this->getStorageId($this->legacyStorageId));
|
||||
|
@ -254,7 +253,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
$storageId = 'local::' . $this->dataDir;
|
||||
$numId = $this->createStorage($storageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertEquals($numId, $this->getStorageId($storageId));
|
||||
}
|
||||
|
@ -272,7 +271,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
$storageId = 'local::/tmp/somedir/' . $this->user;
|
||||
$numId = $this->createStorage($storageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertEquals($numId, $this->getStorageId($storageId));
|
||||
}
|
||||
|
@ -290,7 +289,7 @@ class RepairLegacyStorages extends TestCase {
|
|||
$storageId = 'smb::user@password/tmp/somedir/' . $this->user;
|
||||
$numId = $this->createStorage($storageId);
|
||||
|
||||
$this->repair->run();
|
||||
$this->repair->run($this->outputMock);
|
||||
|
||||
$this->assertEquals($numId, $this->getStorageId($storageId));
|
||||
}
|
||||
|
@ -322,21 +321,15 @@ class RepairLegacyStorages extends TestCase {
|
|||
* Only run the repair once
|
||||
*/
|
||||
public function testOnlyRunOnce() {
|
||||
$output = array();
|
||||
$this->repair->listen('\OC\Repair', 'info', function ($description) use (&$output) {
|
||||
$output[] = 'info: ' . $description;
|
||||
});
|
||||
$this->outputMock->expects($this->exactly(1))->method('info');
|
||||
|
||||
$this->prepareSettings('/tmp/oc-autotest/datadir', $this->getUniqueID('user_'));
|
||||
$this->assertNotEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone'));
|
||||
$this->repair->run();
|
||||
$this->assertEquals(1, count($output));
|
||||
$this->repair->run($this->outputMock);
|
||||
$this->assertEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone'));
|
||||
|
||||
$output = array();
|
||||
$this->repair->run();
|
||||
// no output which means it did not run
|
||||
$this->assertEquals(0, count($output));
|
||||
$this->outputMock->expects($this->never())->method('info');
|
||||
$this->repair->run($this->outputMock);
|
||||
$this->assertEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,12 @@
|
|||
*/
|
||||
namespace Test\Repair;
|
||||
|
||||
use OC\Files\Storage\Temporary;
|
||||
use OCP\Files\IMimeTypeLoader;
|
||||
use OCP\IConfig;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
/**
|
||||
* Tests for the converting of legacy storages to home storages.
|
||||
*
|
||||
|
@ -17,17 +23,22 @@ namespace Test\Repair;
|
|||
*/
|
||||
class RepairMimeTypes extends \Test\TestCase {
|
||||
|
||||
/** @var \OC\RepairStep */
|
||||
/** @var IRepairStep */
|
||||
private $repair;
|
||||
|
||||
/** @var Temporary */
|
||||
private $storage;
|
||||
|
||||
/** @var IMimeTypeLoader */
|
||||
private $mimetypeLoader;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->savedMimetypeLoader = \OC::$server->getMimeTypeLoader();
|
||||
$this->mimetypeLoader = \OC::$server->getMimeTypeLoader();
|
||||
|
||||
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject $config */
|
||||
$config = $this->getMockBuilder('OCP\IConfig')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
@ -96,7 +107,12 @@ class RepairMimeTypes extends \Test\TestCase {
|
|||
private function renameMimeTypes($currentMimeTypes, $fixedMimeTypes) {
|
||||
$this->addEntries($currentMimeTypes);
|
||||
|
||||
$this->repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repair->run($outputMock);
|
||||
|
||||
// force mimetype reload
|
||||
$this->mimetypeLoader->reset();
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
namespace Test\Repair;
|
||||
|
||||
use OC\Repair\SharePropagation;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
class RepairSharePropagation extends \Test\TestCase {
|
||||
public function keyProvider() {
|
||||
|
@ -40,8 +41,13 @@ class RepairSharePropagation extends \Test\TestCase {
|
|||
$removedKeys[] = $key;
|
||||
}));
|
||||
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$step = new SharePropagation($config);
|
||||
$step->run();
|
||||
$step->run($outputMock);
|
||||
|
||||
sort($expectedRemovedKeys);
|
||||
sort($removedKeys);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
*/
|
||||
|
||||
namespace Test\Repair;
|
||||
use OCP\Migration\IOutput;
|
||||
|
||||
/**
|
||||
* Tests for fixing the SQLite id recycling
|
||||
|
@ -76,7 +77,12 @@ class RepairSqliteAutoincrement extends \Test\TestCase {
|
|||
public function testConvertIdColumn() {
|
||||
$this->assertFalse($this->checkAutoincrement());
|
||||
|
||||
$this->repair->run();
|
||||
/** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
|
||||
$outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->repair->run($outputMock);
|
||||
|
||||
$this->assertTrue($this->checkAutoincrement());
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ use Test\TestCase;
|
|||
* @package Test\Repair
|
||||
*/
|
||||
class UpdateOutdatedOcsIds extends TestCase {
|
||||
/** @var IConfig */
|
||||
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
|
||||
private $config;
|
||||
/** @var \OC\Repair\UpdateOutdatedOcsIds */
|
||||
private $updateOutdatedOcsIds;
|
||||
|
|
Loading…
Reference in a new issue