* @ingroup DifferenceEngine
*/
use MediaWiki\MediaWikiServices;
+use MediaWiki\Shell\Shell;
/** @deprecated use class constant instead */
define( 'MW_DIFF_VERSION', '1.11a' );
public function deletedLink( $id ) {
if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
$dbr = wfGetDB( DB_REPLICA );
- $row = $dbr->selectRow( 'archive', '*',
+ $row = $dbr->selectRow( 'archive',
+ array_merge(
+ Revision::selectArchiveFields(),
+ [ 'ar_namespace', 'ar_title' ]
+ ),
[ 'ar_rev_id' => $id ],
__METHOD__ );
if ( $row ) {
$wikidiff2Version = phpversion( 'wikidiff2' );
if (
$wikidiff2Version !== false &&
- version_compare( $wikidiff2Version, '0.3.0', '>=' )
+ version_compare( $wikidiff2Version, '0.3', '>=' )
) {
$text = wikidiff2_do_diff(
$otext,
fwrite( $tempFile2, $ntext );
fclose( $tempFile1 );
fclose( $tempFile2 );
- $cmd = wfEscapeShellArg( $wgExternalDiffEngine, $tempName1, $tempName2 );
- $difftext = wfShellExec( $cmd );
+ $cmd = [ $wgExternalDiffEngine, $tempName1, $tempName2 ];
+ $result = Shell::command( $cmd )
+ ->execute();
+ $exitCode = $result->getExitCode();
+ if ( $exitCode !== 0 ) {
+ throw new Exception( "External diff command returned code {$exitCode}. Stderr: "
+ . wfEscapeWikiText( $result->getStderr() )
+ );
+ }
+ $difftext = $result->getStdout();
$difftext .= $this->debug( "external $wgExternalDiffEngine" );
unlink( $tempName1 );
unlink( $tempName2 );