wiki.techinc.nl/includes/registration/ExtensionDependencyError.php
Kunal Mehta c8833d8e8e Handle extension dependencies in the installer
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
2018-04-13 15:28:40 -07:00

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 );
}
}