As there will likely be extensions bundled with the 1.31 release that depend upon other extensions, we should have the installer prevent users from enabling extensions that depend on other, not-enabled extensions. We can build a dependency map from extension.json's "requires" component. On the client-side, we'll first disable all checkboxes that require other extensions, and evaluate each checkbox click, updating the disabled checkboxes as possible. This required some refactoring of how ExtensionRegistry reports issues with dependency resolution so we could get a list of what was missing. While we're at it, sort the extensions under headings by type. This does not support skins that have dependencies yet (T186092). Bug: T31134 Bug: T55985 Change-Id: I5f0e3b1b540b5ef6f9b8e3fc2bbaad1c65b4b680
81 lines
1.9 KiB
PHP
81 lines
1.9 KiB
PHP
<?php
|
|
/**
|
|
* Copyright (C) 2018 Kunal Mehta <legoktm@member.fsf.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @since 1.31
|
|
*/
|
|
class ExtensionDependencyError extends Exception {
|
|
|
|
/**
|
|
* @var string[]
|
|
*/
|
|
public $missingExtensions = [];
|
|
|
|
/**
|
|
* @var string[]
|
|
*/
|
|
public $missingSkins = [];
|
|
|
|
/**
|
|
* @var string[]
|
|
*/
|
|
public $incompatibleExtensions = [];
|
|
|
|
/**
|
|
* @var string[]
|
|
*/
|
|
public $incompatibleSkins = [];
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
public $incompatibleCore = false;
|
|
|
|
/**
|
|
* @param array $errors Each error has a 'msg' and 'type' key at minimum
|
|
*/
|
|
public function __construct( array $errors ) {
|
|
$msg = '';
|
|
foreach ( $errors as $info ) {
|
|
$msg .= $info['msg'] . "\n";
|
|
switch ( $info['type'] ) {
|
|
case 'incompatible-core':
|
|
$this->incompatibleCore = true;
|
|
break;
|
|
case 'missing-skins':
|
|
$this->missingSkins[] = $info['missing'];
|
|
break;
|
|
case 'missing-extensions':
|
|
$this->missingExtensions[] = $info['missing'];
|
|
break;
|
|
case 'incompatible-skins':
|
|
$this->incompatibleSkins[] = $info['incompatible'];
|
|
break;
|
|
case 'incompatible-extensions':
|
|
$this->incompatibleExtensions[] = $info['incompatible'];
|
|
break;
|
|
// default: continue
|
|
}
|
|
}
|
|
|
|
parent::__construct( $msg );
|
|
}
|
|
|
|
}
|