From 037f056e0e7d11c6ff9a8226289caf2d8b3dfb57 Mon Sep 17 00:00:00 2001 From: Kunal Mehta Date: Fri, 1 Jul 2016 17:01:09 -0700 Subject: [PATCH] DifferenceEngine: Autodetect if wikidiff2 is installed If wikidiff2 is installed, use it for diffing without requiring $wgExternalDiffEngine to be set to 'wikidiff2'. Also add some extra sanity-checking by coercing all non-string values to false and make sure the custom diff executable passes `is_executable()`. Change-Id: I32b670ebf613be9f1c034d65d006829a215614da --- includes/DefaultSettings.php | 7 +++---- includes/diff/DifferenceEngine.php | 23 ++++++++++++++--------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 6d08eecaa6..f2e2420c12 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -8059,10 +8059,9 @@ $wgUpdateRowsPerQuery = 100; /** * Name of the external diff engine to use. Supported values: - * * false: default PHP implementation - * * 'wikidiff2': Wikimedia's fast difference engine implemented as a PHP/HHVM module - * * 'wikidiff' and 'wikidiff3' are treated as false for backwards compatibility - * * any other string is treated as a path to external diff executable + * * string: path to an external diff executable + * * false: wikidiff2 PHP/HHVM module if installed, otherwise the default PHP implementation + * * 'wikidiff', 'wikidiff2', and 'wikidiff3' are treated as false for backwards compatibility */ $wgExternalDiffEngine = false; diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index c5e94c5010..7471b78a6b 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -923,18 +923,23 @@ class DifferenceEngine extends ContextSource { if ( $wgExternalDiffEngine == 'wikidiff' || $wgExternalDiffEngine == 'wikidiff3' ) { wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.27' ); $wgExternalDiffEngine = false; + } elseif ( $wgExternalDiffEngine == 'wikidiff2' ) { + // Same as above, but with no deprecation warnings + $wgExternalDiffEngine = false; + } elseif ( !is_string( $wgExternalDiffEngine ) ) { + // And prevent people from shooting themselves in the foot... + wfWarn( '$wgExternalDiffEngine is set to a non-string value, forcing it to false' ); + $wgExternalDiffEngine = false; } - if ( $wgExternalDiffEngine == 'wikidiff2' ) { - if ( function_exists( 'wikidiff2_do_diff' ) ) { - # Better external diff engine, the 2 may some day be dropped - # This one does the escaping and segmenting itself - $text = wikidiff2_do_diff( $otext, $ntext, 2 ); - $text .= $this->debug( 'wikidiff2' ); + if ( function_exists( 'wikidiff2_do_diff' ) && $wgExternalDiffEngine === false ) { + # Better external diff engine, the 2 may some day be dropped + # This one does the escaping and segmenting itself + $text = wikidiff2_do_diff( $otext, $ntext, 2 ); + $text .= $this->debug( 'wikidiff2' ); - return $text; - } - } elseif ( $wgExternalDiffEngine !== false ) { + return $text; + } elseif ( $wgExternalDiffEngine !== false && is_executable( $wgExternalDiffEngine ) ) { # Diff via the shell $tmpDir = wfTempDir(); $tempName1 = tempnam( $tmpDir, 'diff_' ); -- 2.20.1