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 ====
|
==== 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 ====
|
==== Changed configuration ====
|
||||||
* $wgResourceLoaderMaxage (T235314) - This configuration array controls the
|
* $wgResourceLoaderMaxage (T235314) - This configuration array controls the
|
||||||
|
|
|
||||||
|
|
@ -8480,10 +8480,23 @@ $wgUpdateRowsPerQuery = 100;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Name of the external diff engine to use. Supported values:
|
* Specify the difference engine to use.
|
||||||
* * string: path to an external diff executable
|
*
|
||||||
* * false: wikidiff2 PHP extension if installed, otherwise the default PHP implementation
|
* Supported values:
|
||||||
* * 'wikidiff', 'wikidiff2', and 'wikidiff3' are treated as false for backwards compatibility
|
* - '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;
|
$wgExternalDiffEngine = false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -651,7 +651,7 @@ abstract class ContentHandler {
|
||||||
$slotDiffRenderer->setLanguage( $contentLanguage );
|
$slotDiffRenderer->setLanguage( $contentLanguage );
|
||||||
|
|
||||||
$engine = DifferenceEngine::getEngine();
|
$engine = DifferenceEngine::getEngine();
|
||||||
if ( $engine === false ) {
|
if ( $engine === 'php' ) {
|
||||||
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP );
|
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_PHP );
|
||||||
} elseif ( $engine === 'wikidiff2' ) {
|
} elseif ( $engine === 'wikidiff2' ) {
|
||||||
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2 );
|
$slotDiffRenderer->setEngine( TextSlotDiffRenderer::ENGINE_WIKIDIFF2 );
|
||||||
|
|
|
||||||
|
|
@ -1232,7 +1232,7 @@ class DifferenceEngine extends ContextSource {
|
||||||
$engine = $this->getEngine();
|
$engine = $this->getEngine();
|
||||||
$params = [
|
$params = [
|
||||||
'diff',
|
'diff',
|
||||||
$engine,
|
$engine === 'php' ? false : $engine, // Back compat
|
||||||
self::DIFF_VERSION,
|
self::DIFF_VERSION,
|
||||||
"old-{$this->mOldid}",
|
"old-{$this->mOldid}",
|
||||||
"rev-{$this->mNewid}"
|
"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.
|
* @internal For use by this class and TextSlotDiffRenderer only.
|
||||||
*/
|
*/
|
||||||
public static function getEngine() {
|
public static function getEngine() {
|
||||||
|
$diffEngine = MediaWikiServices::getInstance()->getMainConfig()
|
||||||
|
->get( 'DiffEngine' );
|
||||||
$externalDiffEngine = MediaWikiServices::getInstance()->getMainConfig()
|
$externalDiffEngine = MediaWikiServices::getInstance()->getMainConfig()
|
||||||
->get( 'ExternalDiffEngine' );
|
->get( 'ExternalDiffEngine' );
|
||||||
|
|
||||||
if ( $externalDiffEngine ) {
|
if ( $diffEngine === null ) {
|
||||||
if ( is_string( $externalDiffEngine ) ) {
|
$engines = [ 'external', 'wikidiff2', 'php' ];
|
||||||
if ( is_executable( $externalDiffEngine ) ) {
|
} else {
|
||||||
return $externalDiffEngine;
|
$engines = [ $diffEngine ];
|
||||||
}
|
}
|
||||||
wfDebug( 'ExternalDiffEngine config points to a non-executable, ignoring' );
|
|
||||||
} else {
|
$failureReason = null;
|
||||||
wfWarn( 'ExternalDiffEngine config is set to a non-string value, ignoring' );
|
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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
throw new UnexpectedValueException( "Cannot use diff engine '$engine': $failureReason" );
|
||||||
if ( function_exists( 'wikidiff2_do_diff' ) ) {
|
|
||||||
return 'wikidiff2';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Native PHP
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1421,7 +1448,7 @@ class DifferenceEngine extends ContextSource {
|
||||||
$engine = self::getEngine();
|
$engine = self::getEngine();
|
||||||
if ( $engine === 'wikidiff2' ) {
|
if ( $engine === 'wikidiff2' ) {
|
||||||
return $this->debug( 'wikidiff2' );
|
return $this->debug( 'wikidiff2' );
|
||||||
} elseif ( $engine === false ) {
|
} elseif ( $engine === 'php' ) {
|
||||||
return $this->debug( 'native PHP' );
|
return $this->debug( 'native PHP' );
|
||||||
} else {
|
} else {
|
||||||
return $this->debug( "external $engine" );
|
return $this->debug( "external $engine" );
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,8 @@ class ApiComparePagesTest extends ApiTestCase {
|
||||||
* @dataProvider provideDiff
|
* @dataProvider provideDiff
|
||||||
*/
|
*/
|
||||||
public function testDiff( $params, $expect, $exceptionCode = false, $sysop = false ) {
|
public function testDiff( $params, $expect, $exceptionCode = false, $sysop = false ) {
|
||||||
|
$this->setMwGlobals( [ 'wgDiffEngine' => 'php' ] );
|
||||||
|
|
||||||
$this->doReplacements( $params );
|
$this->doReplacements( $params );
|
||||||
|
|
||||||
$params += [
|
$params += [
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,8 @@ class DifferenceEngineTest extends MediaWikiTestCase {
|
||||||
if ( !self::$revisions ) {
|
if ( !self::$revisions ) {
|
||||||
self::$revisions = $this->doEdits();
|
self::$revisions = $this->doEdits();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->setMwGlobals( [ 'wgDiffEngine' => 'php' ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,10 @@ class DifferenceEngineSlotDiffRendererIntegrationTest extends \MediaWikiIntegrat
|
||||||
* @covers DifferenceEngineSlotDiffRenderer::getExtraCacheKeys
|
* @covers DifferenceEngineSlotDiffRenderer::getExtraCacheKeys
|
||||||
*/
|
*/
|
||||||
public function testGetExtraCacheKeys_noExternalDiffEngineConfigured() {
|
public function testGetExtraCacheKeys_noExternalDiffEngineConfigured() {
|
||||||
$this->setMwGlobals( [ 'wgExternalDiffEngine' => null ] );
|
$this->setMwGlobals( [
|
||||||
|
'wgDiffEngine' => null,
|
||||||
|
'wgExternalDiffEngine' => null,
|
||||||
|
] );
|
||||||
|
|
||||||
$differenceEngine = new CustomDifferenceEngine();
|
$differenceEngine = new CustomDifferenceEngine();
|
||||||
$slotDiffRenderer = new DifferenceEngineSlotDiffRenderer( $differenceEngine );
|
$slotDiffRenderer = new DifferenceEngineSlotDiffRenderer( $differenceEngine );
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue