*
* @param \OCP\IConfig $config
* @return bool whether the core or any app needs an upgrade
+ * @throws \OC\HintException When the upgrade from the given version is not allowed
*/
public static function needUpgrade(\OCP\IConfig $config) {
if ($config->getSystemValue('installed', false)) {
$versionDiff = version_compare($currentVersion, $installedVersion);
if ($versionDiff > 0) {
return true;
+ } else if ($config->getSystemValue('debug', false) && $versionDiff < 0) {
+ // downgrade with debug
+ $installedMajor = explode('.', $installedVersion);
+ $installedMajor = $installedMajor[0] . '.' . $installedMajor[1];
+ $currentMajor = explode('.', $currentVersion);
+ $currentMajor = $currentMajor[0] . '.' . $currentMajor[1];
+ if ($installedMajor === $currentMajor) {
+ // Same major, allow downgrade for developers
+ return true;
+ } else {
+ // downgrade attempt, throw exception
+ throw new \OC\HintException('Downgrading is not supported and is likely to cause unpredictable issues (from ' . $installedVersion . ' to ' . $currentVersion . ')');
+ }
} else if ($versionDiff < 0) {
// downgrade attempt, throw exception
throw new \OC\HintException('Downgrading is not supported and is likely to cause unpredictable issues (from ' . $installedVersion . ' to ' . $currentVersion . ')');
use OC\IntegrityCheck\Checker;
class UpdaterTest extends \Test\TestCase {
- /** @var IConfig */
+ /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
private $config;
/** @var HTTPHelper */
private $httpHelper;
['9.0.0.0', '8.0.0.0', '7.0', false],
['9.1.0.0', '8.0.0.0', '7.0', false],
['8.2.0.0', '8.1.0.0', '8.0', false],
+
+ // With debug enabled
+ ['8.0.0.0', '8.2.0.0', '8.1', false, true],
+ ['8.1.0.0', '8.2.0.0', '8.1', true, true],
+ ['8.2.0.1', '8.2.0.1', '8.1', true, true],
+ ['8.3.0.0', '8.2.0.0', '8.1', true, true],
];
}
+ /**
+ * @dataProvider versionCompatibilityTestData
+ *
+ * @param string $oldVersion
+ * @param string $newVersion
+ * @param string $allowedVersion
+ * @param bool $result
+ * @param bool $debug
+ */
+ public function testIsUpgradePossible($oldVersion, $newVersion, $allowedVersion, $result, $debug = false) {
+ $this->config->expects($this->any())
+ ->method('getSystemValue')
+ ->with('debug', false)
+ ->willReturn($debug);
+
+ $this->assertSame($result, $this->updater->isUpgradePossible($oldVersion, $newVersion, $allowedVersion));
+ }
+
public function testSetSimulateStepEnabled() {
$this->updater->setSimulateStepEnabled(true);
$this->assertSame(true, $this->invokePrivate($this->updater, 'simulateStepEnabled'));
$this->assertSame(false, $this->invokePrivate($this->updater, 'skip3rdPartyAppsDisable'));
}
- /**
- * @dataProvider versionCompatibilityTestData
- *
- * @param string $oldVersion
- * @param string $newVersion
- * @param string $allowedVersion
- * @param bool $result
- */
- public function testIsUpgradePossible($oldVersion, $newVersion, $allowedVersion, $result) {
- $this->assertSame($result, $this->updater->isUpgradePossible($oldVersion, $newVersion, $allowedVersion));
- }
-
public function testCheckInCache() {
$expectedResult = [
'version' => '8.0.4.2',