Source for file shell.php
Documentation is available at shell.php
* Class used internally by Diff to actually compute the diffs.
* This class uses the Unix `diff` program via shell_exec to compute the
* differences between the two input arrays.
* $Horde: framework/Text_Diff/Diff/Engine/shell.php,v 1.6.2.4 2009/01/06 15:23:41 jan Exp $
* Copyright 2007-2009 The Horde Project (http://www.horde.org/)
* See the enclosed file COPYING for license information (LGPL). If you did
* not receive this file, see http://opensource.org/licenses/lgpl-license.php.
* @author Milian Wolff <mail@milianw.de>
* Path to the diff executable
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'));
// 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');
$fp = fopen($to_file, 'w');
$diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file);
return array (new Text_Diff_Op_copy ($from_lines));
// Get changed lines by parsing something like:
$matches, PREG_SET_ORDER );
foreach ($matches as $match) {
// This paren is not set every time (see regex).
if ($from_line_no < $match[1 ] || $to_line_no < $match[4 ]) {
assert('$match[1] - $from_line_no == $match[4] - $to_line_no');
$this->_getLines ($from_lines, $from_line_no, $match[1 ] - 1 ),
$this->_getLines ($to_lines, $to_line_no, $match[4 ] - 1 )));
$this->_getLines ($from_lines, $from_line_no, $match[2 ])));
$this->_getLines ($from_lines, $from_line_no, $match[2 ]),
$this->_getLines ($to_lines, $to_line_no, $match[5 ])));
$this->_getLines ($to_lines, $to_line_no, $match[5 ])));
if (!empty ($from_lines)) {
// Some lines might still be pending. Add them as copied
$this->_getLines ($from_lines, $from_line_no,
$from_line_no + count($from_lines) - 1 ),
$this->_getLines ($to_lines, $to_line_no,
$to_line_no + count($to_lines) - 1 )));
* Get lines from either the old or new text
* @param array &$text_lines Either $from_lines or $to_lines
* @param int &$line_no Current line number
* @param int $end Optional end line, when we want to chop more
* @return array The chopped lines
function _getLines (&$text_lines, &$line_no, $end = false )
// We can shift even more
while ($line_no <= $end) {
Documentation generated on Mon, 11 Mar 2019 16:03:27 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|