rework api of DependencyAnalyzer
This commit is contained in:
parent
d94c1731d7
commit
dcb88e395b
|
@ -1112,8 +1112,8 @@ class OC_App {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for required dependencies
|
// check for required dependencies
|
||||||
$dependencyAnalyzer = new DependencyAnalyzer($app, new Platform($config), $l);
|
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
|
||||||
$missing = $dependencyAnalyzer->analyze();
|
$missing = $dependencyAnalyzer->analyze($app);
|
||||||
if(!empty($missing)) {
|
if(!empty($missing)) {
|
||||||
$missingMsg = join(PHP_EOL, $missing);
|
$missingMsg = join(PHP_EOL, $missing);
|
||||||
throw new \Exception(
|
throw new \Exception(
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @author Thomas Müller
|
* @author Thomas Müller
|
||||||
* @copyright 2014 Thomas Müller deepdiver@owncloud.com
|
* @copyright 2014 Thomas Müller deepdiver@owncloud.com
|
||||||
*
|
*
|
||||||
|
@ -20,112 +20,114 @@ class DependencyAnalyzer {
|
||||||
/** @var \OCP\IL10N */
|
/** @var \OCP\IL10N */
|
||||||
private $l;
|
private $l;
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
private $missing = array();
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
private $dependencies = array();
|
|
||||||
|
|
||||||
private $appInfo = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $app
|
|
||||||
* @param Platform $platform
|
* @param Platform $platform
|
||||||
* @param \OCP\IL10N $l
|
* @param \OCP\IL10N $l
|
||||||
*/
|
*/
|
||||||
function __construct(array $app, Platform $platform, IL10N $l) {
|
function __construct(Platform $platform, IL10N $l) {
|
||||||
$this->platform = $platform;
|
$this->platform = $platform;
|
||||||
$this->l = $l;
|
$this->l = $l;
|
||||||
if (isset($app['dependencies'])) {
|
|
||||||
$this->dependencies = $app['dependencies'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $app
|
* @param array $app
|
||||||
* @returns array of missing dependencies
|
* @returns array of missing dependencies
|
||||||
*/
|
*/
|
||||||
public function analyze() {
|
public function analyze($app) {
|
||||||
$this->analyzePhpVersion();
|
$this->appInfo = $app;
|
||||||
$this->analyzeDatabases();
|
if (isset($app['dependencies'])) {
|
||||||
$this->analyzeCommands();
|
$dependencies = $app['dependencies'];
|
||||||
$this->analyzeLibraries();
|
} else {
|
||||||
$this->analyzeOS();
|
$dependencies = [];
|
||||||
$this->analyzeOC();
|
}
|
||||||
return $this->missing;
|
|
||||||
|
return array_merge(
|
||||||
|
$this->analyzePhpVersion($dependencies),
|
||||||
|
$this->analyzeDatabases($dependencies),
|
||||||
|
$this->analyzeCommands($dependencies),
|
||||||
|
$this->analyzeLibraries($dependencies),
|
||||||
|
$this->analyzeOS($dependencies),
|
||||||
|
$this->analyzeOC($dependencies, $app));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function analyzePhpVersion() {
|
private function analyzePhpVersion($dependencies) {
|
||||||
if (isset($this->dependencies['php']['@attributes']['min-version'])) {
|
$missing = [];
|
||||||
$minVersion = $this->dependencies['php']['@attributes']['min-version'];
|
if (isset($dependencies['php']['@attributes']['min-version'])) {
|
||||||
|
$minVersion = $dependencies['php']['@attributes']['min-version'];
|
||||||
if (version_compare($this->platform->getPhpVersion(), $minVersion, '<')) {
|
if (version_compare($this->platform->getPhpVersion(), $minVersion, '<')) {
|
||||||
$this->addMissing((string)$this->l->t('PHP %s or higher is required.', $minVersion));
|
$missing[] = (string)$this->l->t('PHP %s or higher is required.', $minVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($this->dependencies['php']['@attributes']['max-version'])) {
|
if (isset($dependencies['php']['@attributes']['max-version'])) {
|
||||||
$maxVersion = $this->dependencies['php']['@attributes']['max-version'];
|
$maxVersion = $dependencies['php']['@attributes']['max-version'];
|
||||||
if (version_compare($this->platform->getPhpVersion(), $maxVersion, '>')) {
|
if (version_compare($this->platform->getPhpVersion(), $maxVersion, '>')) {
|
||||||
$this->addMissing((string)$this->l->t('PHP with a version lower than %s is required.', $maxVersion));
|
$missing[] = (string)$this->l->t('PHP with a version lower than %s is required.', $maxVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function analyzeDatabases() {
|
private function analyzeDatabases($dependencies) {
|
||||||
if (!isset($this->dependencies['database'])) {
|
$missing = [];
|
||||||
return;
|
if (!isset($dependencies['database'])) {
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
$supportedDatabases = $this->dependencies['database'];
|
$supportedDatabases = $dependencies['database'];
|
||||||
if (empty($supportedDatabases)) {
|
if (empty($supportedDatabases)) {
|
||||||
return;
|
return $missing;
|
||||||
}
|
}
|
||||||
if (!is_array($supportedDatabases)) {
|
if (!is_array($supportedDatabases)) {
|
||||||
$supportedDatabases = array($supportedDatabases);
|
$supportedDatabases = array($supportedDatabases);
|
||||||
}
|
}
|
||||||
$supportedDatabases = array_map(function($db) {
|
$supportedDatabases = array_map(function ($db) {
|
||||||
return $this->getValue($db);
|
return $this->getValue($db);
|
||||||
}, $supportedDatabases);
|
}, $supportedDatabases);
|
||||||
$currentDatabase = $this->platform->getDatabase();
|
$currentDatabase = $this->platform->getDatabase();
|
||||||
if (!in_array($currentDatabase, $supportedDatabases)) {
|
if (!in_array($currentDatabase, $supportedDatabases)) {
|
||||||
$this->addMissing((string)$this->l->t('Following databases are supported: %s', join(', ', $supportedDatabases)));
|
$missing[] = (string)$this->l->t('Following databases are supported: %s', join(', ', $supportedDatabases));
|
||||||
}
|
}
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function analyzeCommands() {
|
private function analyzeCommands($dependencies) {
|
||||||
if (!isset($this->dependencies['command'])) {
|
$missing = [];
|
||||||
return;
|
if (!isset($dependencies['command'])) {
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
$commands = $this->dependencies['command'];
|
$commands = $dependencies['command'];
|
||||||
if (!is_array($commands)) {
|
if (!is_array($commands)) {
|
||||||
$commands = array($commands);
|
$commands = array($commands);
|
||||||
}
|
}
|
||||||
$os = $this->platform->getOS();
|
$os = $this->platform->getOS();
|
||||||
foreach($commands as $command) {
|
foreach ($commands as $command) {
|
||||||
if (isset($command['@attributes']['os']) && $command['@attributes']['os'] !== $os) {
|
if (isset($command['@attributes']['os']) && $command['@attributes']['os'] !== $os) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$commandName = $this->getValue($command);
|
$commandName = $this->getValue($command);
|
||||||
if (!$this->platform->isCommandKnown($commandName)) {
|
if (!$this->platform->isCommandKnown($commandName)) {
|
||||||
$this->addMissing((string)$this->l->t('The command line tool %s could not be found', $commandName));
|
$missing[] = (string)$this->l->t('The command line tool %s could not be found', $commandName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function analyzeLibraries() {
|
private function analyzeLibraries($dependencies) {
|
||||||
if (!isset($this->dependencies['lib'])) {
|
$missing = [];
|
||||||
return;
|
if (!isset($dependencies['lib'])) {
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
$libs = $this->dependencies['lib'];
|
$libs = $dependencies['lib'];
|
||||||
if (!is_array($libs)) {
|
if (!is_array($libs)) {
|
||||||
$libs = array($libs);
|
$libs = array($libs);
|
||||||
}
|
}
|
||||||
foreach($libs as $lib) {
|
foreach ($libs as $lib) {
|
||||||
$libName = $this->getValue($lib);
|
$libName = $this->getValue($lib);
|
||||||
$libVersion = $this->platform->getLibraryVersion($libName);
|
$libVersion = $this->platform->getLibraryVersion($libName);
|
||||||
if (is_null($libVersion)) {
|
if (is_null($libVersion)) {
|
||||||
$this->addMissing((string)$this->l->t('The library %s is not available.', $libName));
|
$missing[] = (string)$this->l->t('The library %s is not available.', $libName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,29 +135,31 @@ class DependencyAnalyzer {
|
||||||
if (isset($lib['@attributes']['min-version'])) {
|
if (isset($lib['@attributes']['min-version'])) {
|
||||||
$minVersion = $lib['@attributes']['min-version'];
|
$minVersion = $lib['@attributes']['min-version'];
|
||||||
if (version_compare($libVersion, $minVersion, '<')) {
|
if (version_compare($libVersion, $minVersion, '<')) {
|
||||||
$this->addMissing((string)$this->l->t('Library %s with a version higher than %s is required - available version %s.',
|
$missing[] = (string)$this->l->t('Library %s with a version higher than %s is required - available version %s.',
|
||||||
array($libName, $minVersion, $libVersion)));
|
array($libName, $minVersion, $libVersion));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($lib['@attributes']['max-version'])) {
|
if (isset($lib['@attributes']['max-version'])) {
|
||||||
$maxVersion = $lib['@attributes']['max-version'];
|
$maxVersion = $lib['@attributes']['max-version'];
|
||||||
if (version_compare($libVersion, $maxVersion, '>')) {
|
if (version_compare($libVersion, $maxVersion, '>')) {
|
||||||
$this->addMissing((string)$this->l->t('Library %s with a version lower than %s is required - available version %s.',
|
$missing[] = (string)$this->l->t('Library %s with a version lower than %s is required - available version %s.',
|
||||||
array($libName, $maxVersion, $libVersion)));
|
array($libName, $maxVersion, $libVersion));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function analyzeOS() {
|
private function analyzeOS($dependencies) {
|
||||||
if (!isset($this->dependencies['os'])) {
|
$missing = [];
|
||||||
return;
|
if (!isset($dependencies['os'])) {
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
$oss = $this->dependencies['os'];
|
$oss = $dependencies['os'];
|
||||||
if (empty($oss)) {
|
if (empty($oss)) {
|
||||||
return;
|
return $missing;
|
||||||
}
|
}
|
||||||
if (is_array($oss)) {
|
if (is_array($oss)) {
|
||||||
$oss = array_map(function ($os) {
|
$oss = array_map(function ($os) {
|
||||||
|
@ -166,34 +170,37 @@ class DependencyAnalyzer {
|
||||||
}
|
}
|
||||||
$currentOS = $this->platform->getOS();
|
$currentOS = $this->platform->getOS();
|
||||||
if (!in_array($currentOS, $oss)) {
|
if (!in_array($currentOS, $oss)) {
|
||||||
$this->addMissing((string)$this->l->t('Following platforms are supported: %s', join(', ', $oss)));
|
$missing[] = (string)$this->l->t('Following platforms are supported: %s', join(', ', $oss));
|
||||||
}
|
}
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function analyzeOC() {
|
private function analyzeOC($dependencies, $appInfo) {
|
||||||
|
$missing = [];
|
||||||
$minVersion = null;
|
$minVersion = null;
|
||||||
if (isset($this->dependencies['owncloud']['@attributes']['min-version'])) {
|
if (isset($dependencies['owncloud']['@attributes']['min-version'])) {
|
||||||
$minVersion = $this->dependencies['owncloud']['@attributes']['min-version'];
|
$minVersion = $dependencies['owncloud']['@attributes']['min-version'];
|
||||||
} elseif (isset($this->appInfo['requiremin'])) {
|
} elseif (isset($appInfo['requiremin'])) {
|
||||||
$minVersion = $this->appInfo['requiremin'];
|
$minVersion = $appInfo['requiremin'];
|
||||||
}
|
}
|
||||||
$maxVersion = null;
|
$maxVersion = null;
|
||||||
if (isset($this->dependencies['owncloud']['@attributes']['max-version'])) {
|
if (isset($dependencies['owncloud']['@attributes']['max-version'])) {
|
||||||
$maxVersion = $this->dependencies['owncloud']['@attributes']['max-version'];
|
$maxVersion = $dependencies['owncloud']['@attributes']['max-version'];
|
||||||
} elseif (isset($this->appInfo['requiremax'])) {
|
} elseif (isset($appInfo['requiremax'])) {
|
||||||
$maxVersion = $this->appInfo['requiremax'];
|
$maxVersion = $appInfo['requiremax'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_null($minVersion)) {
|
if (!is_null($minVersion)) {
|
||||||
if (version_compare($this->platform->getOcVersion(), $minVersion, '<')) {
|
if (version_compare($this->platform->getOcVersion(), $minVersion, '<')) {
|
||||||
$this->addMissing((string)$this->l->t('ownCloud %s or higher is required.', $minVersion));
|
$missing[] = (string)$this->l->t('ownCloud %s or higher is required.', $minVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!is_null($maxVersion)) {
|
if (!is_null($maxVersion)) {
|
||||||
if (version_compare($this->platform->getOcVersion(), $maxVersion, '>')) {
|
if (version_compare($this->platform->getOcVersion(), $maxVersion, '>')) {
|
||||||
$this->addMissing((string)$this->l->t('ownCloud with a version lower than %s is required.', $maxVersion));
|
$missing[] = (string)$this->l->t('ownCloud with a version lower than %s is required.', $maxVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return $missing;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -205,11 +212,4 @@ class DependencyAnalyzer {
|
||||||
return $element['@value'];
|
return $element['@value'];
|
||||||
return (string)$element;
|
return (string)$element;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $minVersion
|
|
||||||
*/
|
|
||||||
private function addMissing($message) {
|
|
||||||
$this->missing[] = $message;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,8 @@ class AppSettingsController extends Controller {
|
||||||
}
|
}
|
||||||
|
|
||||||
// fix groups to be an array
|
// fix groups to be an array
|
||||||
$apps = array_map(function($app){
|
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($this->config), $this->l10n);
|
||||||
|
$apps = array_map(function($app) use ($dependencyAnalyzer) {
|
||||||
$groups = array();
|
$groups = array();
|
||||||
if (is_string($app['groups'])) {
|
if (is_string($app['groups'])) {
|
||||||
$groups = json_decode($app['groups']);
|
$groups = json_decode($app['groups']);
|
||||||
|
@ -127,8 +128,7 @@ class AppSettingsController extends Controller {
|
||||||
$app['canUnInstall'] = !$app['active'] && $app['removable'];
|
$app['canUnInstall'] = !$app['active'] && $app['removable'];
|
||||||
|
|
||||||
// analyse dependencies
|
// analyse dependencies
|
||||||
$dependencyAnalyzer = new DependencyAnalyzer($app, new Platform($this->config), $this->l10n);
|
$missing = $dependencyAnalyzer->analyze($app);
|
||||||
$missing = $dependencyAnalyzer->analyze();
|
|
||||||
|
|
||||||
$app['canInstall'] = empty($missing);
|
$app['canInstall'] = empty($missing);
|
||||||
$app['missingDependencies'] = $missing;
|
$app['missingDependencies'] = $missing;
|
||||||
|
|
|
@ -15,16 +15,15 @@ use OCP\IL10N;
|
||||||
|
|
||||||
class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
/**
|
/** @var Platform */
|
||||||
* @var Platform
|
|
||||||
*/
|
|
||||||
private $platformMock;
|
private $platformMock;
|
||||||
|
|
||||||
/**
|
/** @var IL10N */
|
||||||
* @var IL10N
|
|
||||||
*/
|
|
||||||
private $l10nMock;
|
private $l10nMock;
|
||||||
|
|
||||||
|
/** @var \OC\App\DependencyAnalyzer */
|
||||||
|
private $analyser;
|
||||||
|
|
||||||
public function setUp() {
|
public function setUp() {
|
||||||
$this->platformMock = $this->getMockBuilder('\OC\App\Platform')
|
$this->platformMock = $this->getMockBuilder('\OC\App\Platform')
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
|
@ -63,6 +62,8 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
->will($this->returnCallback(function($text, $parameters = array()) {
|
->will($this->returnCallback(function($text, $parameters = array()) {
|
||||||
return vsprintf($text, $parameters);
|
return vsprintf($text, $parameters);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
$this->analyser = new \OC\App\DependencyAnalyzer($this->platformMock, $this->l10nMock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,8 +81,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
if (!is_null($maxVersion)) {
|
if (!is_null($maxVersion)) {
|
||||||
$app['dependencies']['php']['@attributes']['max-version'] = $maxVersion;
|
$app['dependencies']['php']['@attributes']['max-version'] = $maxVersion;
|
||||||
}
|
}
|
||||||
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock);
|
$missing = $this->analyser->analyze($app);
|
||||||
$missing = $analyser->analyze();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($missing));
|
$this->assertTrue(is_array($missing));
|
||||||
$this->assertEquals($expectedMissing, $missing);
|
$this->assertEquals($expectedMissing, $missing);
|
||||||
|
@ -98,8 +98,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
if (!is_null($databases)) {
|
if (!is_null($databases)) {
|
||||||
$app['dependencies']['database'] = $databases;
|
$app['dependencies']['database'] = $databases;
|
||||||
}
|
}
|
||||||
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock);
|
$missing = $this->analyser->analyze($app);
|
||||||
$missing = $analyser->analyze();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($missing));
|
$this->assertTrue(is_array($missing));
|
||||||
$this->assertEquals($expectedMissing, $missing);
|
$this->assertEquals($expectedMissing, $missing);
|
||||||
|
@ -116,8 +115,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
if (!is_null($commands)) {
|
if (!is_null($commands)) {
|
||||||
$app['dependencies']['command'] = $commands;
|
$app['dependencies']['command'] = $commands;
|
||||||
}
|
}
|
||||||
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock);
|
$missing = $this->analyser->analyze($app);
|
||||||
$missing = $analyser->analyze();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($missing));
|
$this->assertTrue(is_array($missing));
|
||||||
$this->assertEquals($expectedMissing, $missing);
|
$this->assertEquals($expectedMissing, $missing);
|
||||||
|
@ -137,8 +135,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
$app['dependencies']['lib'] = $libs;
|
$app['dependencies']['lib'] = $libs;
|
||||||
}
|
}
|
||||||
|
|
||||||
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock);
|
$missing = $this->analyser->analyze($app);
|
||||||
$missing = $analyser->analyze();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($missing));
|
$this->assertTrue(is_array($missing));
|
||||||
$this->assertEquals($expectedMissing, $missing);
|
$this->assertEquals($expectedMissing, $missing);
|
||||||
|
@ -157,8 +154,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
$app['dependencies']['os'] = $oss;
|
$app['dependencies']['os'] = $oss;
|
||||||
}
|
}
|
||||||
|
|
||||||
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock);
|
$missing = $this->analyser->analyze($app);
|
||||||
$missing = $analyser->analyze();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($missing));
|
$this->assertTrue(is_array($missing));
|
||||||
$this->assertEquals($expectedMissing, $missing);
|
$this->assertEquals($expectedMissing, $missing);
|
||||||
|
@ -177,8 +173,7 @@ class DependencyAnalyzer extends \PHPUnit_Framework_TestCase {
|
||||||
$app['dependencies']['owncloud'] = $oc;
|
$app['dependencies']['owncloud'] = $oc;
|
||||||
}
|
}
|
||||||
|
|
||||||
$analyser = new \OC\App\DependencyAnalyzer($app, $this->platformMock, $this->l10nMock);
|
$missing = $this->analyser->analyze($app);
|
||||||
$missing = $analyser->analyze();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($missing));
|
$this->assertTrue(is_array($missing));
|
||||||
$this->assertEquals($expectedMissing, $missing);
|
$this->assertEquals($expectedMissing, $missing);
|
||||||
|
|
Loading…
Reference in New Issue