Add $wgDiffEngine
The immediate use case is for testing, where some tests need to use the PHP implementation even when wikidiff2 is installed. Bug: T237049 Change-Id: I41dc4c0933429065d7638f518ec31f0a056afc41
This commit is contained in:
parent
e8e9d81f62
commit
f3058c81b9
7 changed files with 75 additions and 27 deletions
|
|
@ -29,8 +29,9 @@ For notes on 1.34.x and older releases, see HISTORY.
|
|||
…
|
||||
|
||||
==== New configuration ====
|
||||
* …
|
||||
|
||||
* $wgDiffEngine can be used to specify the difference engine to use, rather
|
||||
than choosing the first of $wgExternalDiffEngine, wikidiff2, or php that
|
||||
is usable.
|
||||
|
||||
==== Changed configuration ====
|
||||
* $wgResourceLoaderMaxage (T235314) - This configuration array controls the
|
||||
|
|
|
|||
|
|
@ -8480,10 +8480,23 @@ $wgUpdateRowsPerQuery = 100;
|
|||
*/
|
||||
|
||||
/**
|
||||
* Name of the external diff engine to use. Supported values:
|
||||
* * string: path to an external diff executable
|
||||
* * false: wikidiff2 PHP extension if installed, otherwise the default PHP implementation
|
||||
* * 'wikidiff', 'wikidiff2', and 'wikidiff3' are treated as false for backwards compatibility
|
||||
* Specify the difference engine to use.
|
||||
*
|
||||
* Supported values:
|
||||
* - 'external': Use an external diff engine, which must be specified via $wgExternalDiffEngine
|
||||
* - 'wikidiff2': Use the wikidiff2 PHP extension
|
||||
* - 'php': PHP implementations included in MediaWiki
|
||||
*
|
||||
* The default (null) is to use the first engine that's available.
|
||||
*
|
||||
* @since 1.35
|
||||
* @var string|null
|
||||
*/
|
||||
$wgDiffEngine = null;
|
||||
|
||||
/**
|
||||
* Name of the external diff engine to use.
|
||||
* @var string|false Path to an external diff executable
|
||||
*/
|
||||
$wgExternalDiffEngine = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -651,7 +651,7 @@ abstract class ContentHandler {
|
|||
$slotDiffRenderer->setLanguage( $contentLanguage );
|
||||
|
||||
$engine = DifferenceEngine::getEngine();
|
||||
if ( $engine === false ) {
|
||||
if ( $engine === 'php' ) {
|
||||
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP );
|
||||
} elseif ( $engine === 'wikidiff2' ) {
|
||||
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2 );
|
||||
|
|
|
|||
|
|
@ -1232,7 +1232,7 @@ class DifferenceEngine extends ContextSource {
|
|||
$engine = $this->getEngine();
|
||||
$params = [
|
||||
'diff',
|
||||
$engine,
|
||||
$engine === 'php' ? false : $engine, // Back compat
|
||||
self::DIFF_VERSION,
|
||||
"old-{$this->mOldid}",
|
||||
"rev-{$this->mNewid}"
|
||||
|
|
@ -1342,32 +1342,59 @@ class DifferenceEngine extends ContextSource {
|
|||
}
|
||||
|
||||
/**
|
||||
* Process ExternalDiffEngine config and get a sane, usable engine
|
||||
* Process DiffEngine config and get a sane, usable engine
|
||||
*
|
||||
* @return bool|string 'wikidiff2', path to an executable, or false
|
||||
* @return string 'wikidiff2', 'php', or path to an executable
|
||||
* @internal For use by this class and TextSlotDiffRenderer only.
|
||||
*/
|
||||
public static function getEngine() {
|
||||
$diffEngine = MediaWikiServices::getInstance()->getMainConfig()
|
||||
->get( 'DiffEngine' );
|
||||
$externalDiffEngine = MediaWikiServices::getInstance()->getMainConfig()
|
||||
->get( 'ExternalDiffEngine' );
|
||||
|
||||
if ( $externalDiffEngine ) {
|
||||
if ( is_string( $externalDiffEngine ) ) {
|
||||
if ( is_executable( $externalDiffEngine ) ) {
|
||||
return $externalDiffEngine;
|
||||
}
|
||||
wfDebug( 'ExternalDiffEngine config points to a non-executable, ignoring' );
|
||||
} else {
|
||||
wfWarn( 'ExternalDiffEngine config is set to a non-string value, ignoring' );
|
||||
if ( $diffEngine === null ) {
|
||||
$engines = [ 'external', 'wikidiff2', 'php' ];
|
||||
} else {
|
||||
$engines = [ $diffEngine ];
|
||||
}
|
||||
|
||||
$failureReason = null;
|
||||
foreach ( $engines as $engine ) {
|
||||
switch ( $engine ) {
|
||||
case 'external':
|
||||
if ( is_string( $externalDiffEngine ) ) {
|
||||
if ( is_executable( $externalDiffEngine ) ) {
|
||||
return $externalDiffEngine;
|
||||
}
|
||||
$failureReason = 'ExternalDiffEngine config points to a non-executable';
|
||||
if ( $diffEngine === null ) {
|
||||
wfDebug( "$failureReason, ignoring" );
|
||||
}
|
||||
} else {
|
||||
$failureReason = 'ExternalDiffEngine config is set to a non-string value';
|
||||
if ( $diffEngine === null && $externalDiffEngine ) {
|
||||
wfWarn( "$failureReason, ignoring" );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'wikidiff2':
|
||||
if ( function_exists( 'wikidiff2_do_diff' ) ) {
|
||||
return 'wikidiff2';
|
||||
}
|
||||
$failureReason = 'wikidiff2 is not available';
|
||||
break;
|
||||
|
||||
case 'php':
|
||||
// Always available.
|
||||
return 'php';
|
||||
|
||||
default:
|
||||
throw new DomainException( 'Invalid value for $wgDiffEngine: ' . $engine );
|
||||
}
|
||||
}
|
||||
|
||||
if ( function_exists( 'wikidiff2_do_diff' ) ) {
|
||||
return 'wikidiff2';
|
||||
}
|
||||
|
||||
// Native PHP
|
||||
return false;
|
||||
throw new UnexpectedValueException( "Cannot use diff engine '$engine': $failureReason" );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1421,7 +1448,7 @@ class DifferenceEngine extends ContextSource {
|
|||
$engine = self::getEngine();
|
||||
if ( $engine === 'wikidiff2' ) {
|
||||
return $this->debug( 'wikidiff2' );
|
||||
} elseif ( $engine === false ) {
|
||||
} elseif ( $engine === 'php' ) {
|
||||
return $this->debug( 'native PHP' );
|
||||
} else {
|
||||
return $this->debug( "external $engine" );
|
||||
|
|
|
|||
|
|
@ -121,6 +121,8 @@ class ApiComparePagesTest extends ApiTestCase {
|
|||
* @dataProvider provideDiff
|
||||
*/
|
||||
public function testDiff( $params, $expect, $exceptionCode = false, $sysop = false ) {
|
||||
$this->setMwGlobals( [ 'wgDiffEngine' => 'php' ] );
|
||||
|
||||
$this->doReplacements( $params );
|
||||
|
||||
$params += [
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@ class DifferenceEngineTest extends MediaWikiTestCase {
|
|||
if ( !self::$revisions ) {
|
||||
self::$revisions = $this->doEdits();
|
||||
}
|
||||
|
||||
$this->setMwGlobals( [ 'wgDiffEngine' => 'php' ] );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -9,7 +9,10 @@ class DifferenceEngineSlotDiffRendererIntegrationTest extends \MediaWikiIntegrat
|
|||
* @covers DifferenceEngineSlotDiffRenderer::getExtraCacheKeys
|
||||
*/
|
||||
public function testGetExtraCacheKeys_noExternalDiffEngineConfigured() {
|
||||
$this->setMwGlobals( [ 'wgExternalDiffEngine' => null ] );
|
||||
$this->setMwGlobals( [
|
||||
'wgDiffEngine' => null,
|
||||
'wgExternalDiffEngine' => null,
|
||||
] );
|
||||
|
||||
$differenceEngine = new CustomDifferenceEngine();
|
||||
$slotDiffRenderer = new DifferenceEngineSlotDiffRenderer( $differenceEngine );
|
||||
|
|
|
|||
Loading…
Reference in a new issue