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:
Brad Jorsch 2019-11-05 10:07:06 -05:00
parent e8e9d81f62
commit f3058c81b9
7 changed files with 75 additions and 27 deletions

View file

@ -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

View file

@ -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;

View file

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

View file

@ -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 ( $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;
}
wfDebug( 'ExternalDiffEngine config points to a non-executable, ignoring' );
$failureReason = 'ExternalDiffEngine config points to a non-executable';
if ( $diffEngine === null ) {
wfDebug( "$failureReason, ignoring" );
}
} else {
wfWarn( 'ExternalDiffEngine config is set to a non-string value, ignoring' );
$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;
// Native PHP
return false;
case 'php':
// Always available.
return 'php';
default:
throw new DomainException( 'Invalid value for $wgDiffEngine: ' . $engine );
}
}
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" );

View file

@ -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 += [

View file

@ -32,6 +32,8 @@ class DifferenceEngineTest extends MediaWikiTestCase {
if ( !self::$revisions ) {
self::$revisions = $this->doEdits();
}
$this->setMwGlobals( [ 'wgDiffEngine' => 'php' ] );
}
/**

View file

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