wppaste
WordPress

Text_Diff_Engine_shell

Since
0.3.0
Source
wp-includes/Text/Diff/Engine/shell.php:17
Class used internally by Diff to actually compute the diffs.

Description

This class uses the Unix diff program via shell_exec to compute the differences between the two input arrays.

Copyright 2007-2010 The Horde Project (http://www.horde.org/)

See the enclosed file COPYING for license information (LGPL). If you did not receive this file, see https://opensource.org/license/lgpl-2-1/.

Compatibility

WordPress
since 0.3.0
  • 6.7.7
  • 6.8.8
  • 6.9.7
  • 7.0.4
  • 7.1.0

Present in every tracked release (6.7.7 to 7.1.0).

Properties · 1

$_diffCommandstringpublic
Path to the diff executable

Methods · 2

  • diff()Returns the array of differences.
  • _getLines()Get lines from either the old or new text

Source code

class Text_Diff_Engine_shell {     /**     * Path to the diff executable     *     * @var string     */    var $_diffCommand = 'diff';     /**     * Returns the array of differences.     *     * @param array $from_lines lines of text from old file     * @param array $to_lines   lines of text from new file     *     * @return array all changes made (array with Text_Diff_Op_* objects)     */    function diff($from_lines, $to_lines)    {        array_walk($from_lines, array('Text_Diff', 'trimNewlines'));        array_walk($to_lines, array('Text_Diff', 'trimNewlines'));         $temp_dir = Text_Diff::_getTempDir();         // Execute gnu diff or similar to get a standard diff file.        $from_file = tempnam($temp_dir, 'Text_Diff');        $to_file = tempnam($temp_dir, 'Text_Diff');        $fp = fopen($from_file, 'w');        fwrite($fp, implode("\n", $from_lines));        fclose($fp);        $fp = fopen($to_file, 'w');        fwrite($fp, implode("\n", $to_lines));        fclose($fp);        $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file);        unlink($from_file);        unlink($to_file);         if (is_null($diff)) {            // No changes were made            return array(new Text_Diff_Op_copy($from_lines));        }         $from_line_no = 1;        $to_line_no = 1;        $edits = array();         // Get changed lines by parsing something like:        // 0a1,2        // 1,2c4,6        // 1,5d6        preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff,            $matches, PREG_SET_ORDER);         foreach ($matches as $match) {            if (!isset($match[5])) {                // This paren is not set every time (see regex).                $match[5] = false;            }             if ($match[3] == 'a') {                $from_line_no--;            }             if ($match[3] == 'd') {                $to_line_no--;            }             if ($from_line_no < $match[1] || $to_line_no < $match[4]) {                // copied lines                assert($match[1] - $from_line_no == $match[4] - $to_line_no);                array_push($edits,                    new Text_Diff_Op_copy(                        $this->_getLines($from_lines, $from_line_no, $match[1] - 1),                        $this->_getLines($to_lines, $to_line_no, $match[4] - 1)));            }             switch ($match[3]) {            case 'd':                // deleted lines                array_push($edits,

Changelog

Introduced in 0.3.0. Unchanged from 6.7.7 through 7.1.0.

  1. 6.7.7
  2. 6.8.8
  3. 6.9.7
  4. 7.0.4
  5. 7.1.0

Signature, return type and hooks compared across 5 parsed releases.

About this page

Parsed data
Generated from the wordpress-develop 7.1.0 tag, from src/wp-includes/Text/Diff/Engine/shell.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it.
Corrections
Something wrong on this page? Report it and it gets fixed in the next regeneration.