From 7eb7fd77d81eba75a99288935131881b38c464f6 Mon Sep 17 00:00:00 2001 From: Tim Steiner <tsteiner2@unl.edu> Date: Fri, 20 Apr 2012 15:45:52 +0000 Subject: [PATCH] Add Text_Diff via pyrus. --- vendor/pyrus/.pear2registry | Bin 152576 -> 158720 bytes .../docs/Text_Diff/Text/docs/examples/1.txt | 3 + .../docs/Text_Diff/Text/docs/examples/2.txt | 3 + .../Text_Diff/Text/docs/examples/diff.php | 39 ++ vendor/pyrus/php/Text/Diff.php | 453 ++++++++++++++++++ vendor/pyrus/php/Text/Diff/Engine/native.php | 438 +++++++++++++++++ vendor/pyrus/php/Text/Diff/Engine/shell.php | 164 +++++++ vendor/pyrus/php/Text/Diff/Engine/string.php | 250 ++++++++++ vendor/pyrus/php/Text/Diff/Engine/xdiff.php | 66 +++ vendor/pyrus/php/Text/Diff/Mapped.php | 55 +++ vendor/pyrus/php/Text/Diff/Renderer.php | 237 +++++++++ .../pyrus/php/Text/Diff/Renderer/context.php | 77 +++ .../pyrus/php/Text/Diff/Renderer/inline.php | 172 +++++++ .../pyrus/php/Text/Diff/Renderer/unified.php | 67 +++ vendor/pyrus/php/Text/Diff/ThreeWay.php | 276 +++++++++++ vendor/pyrus/php/Text/Diff3.php | 276 +++++++++++ vendor/pyrus/tests/Text_Diff/Text/tests/1.txt | 3 + vendor/pyrus/tests/Text_Diff/Text/tests/2.txt | 3 + vendor/pyrus/tests/Text_Diff/Text/tests/3.txt | 4 + vendor/pyrus/tests/Text_Diff/Text/tests/4.txt | 3 + vendor/pyrus/tests/Text_Diff/Text/tests/5.txt | 5 + vendor/pyrus/tests/Text_Diff/Text/tests/6.txt | 7 + .../tests/Text_Diff/Text/tests/context.patch | 11 + .../tests/Text_Diff/Text/tests/context.phpt | 25 + .../tests/Text_Diff/Text/tests/context2.phpt | 31 ++ .../tests/Text_Diff/Text/tests/diff.phpt | 62 +++ .../tests/Text_Diff/Text/tests/inline.phpt | 19 + .../tests/Text_Diff/Text/tests/inline2.phpt | 37 ++ .../Text_Diff/Text/tests/pear_bug12740.phpt | 30 ++ .../Text_Diff/Text/tests/pear_bug4879.phpt | 30 ++ .../Text_Diff/Text/tests/pear_bug6251.phpt | 45 ++ .../Text_Diff/Text/tests/pear_bug6428.phpt | 18 + .../tests/Text_Diff/Text/tests/string.phpt | 145 ++++++ .../tests/Text_Diff/Text/tests/unified.patch | 7 + .../tests/Text_Diff/Text/tests/unified.phpt | 21 + .../tests/Text_Diff/Text/tests/unified2.phpt | 26 + .../tests/Text_Diff/Text/tests/xdiff.phpt | 24 + 37 files changed, 3132 insertions(+) create mode 100644 vendor/pyrus/docs/Text_Diff/Text/docs/examples/1.txt create mode 100644 vendor/pyrus/docs/Text_Diff/Text/docs/examples/2.txt create mode 100644 vendor/pyrus/docs/Text_Diff/Text/docs/examples/diff.php create mode 100644 vendor/pyrus/php/Text/Diff.php create mode 100644 vendor/pyrus/php/Text/Diff/Engine/native.php create mode 100644 vendor/pyrus/php/Text/Diff/Engine/shell.php create mode 100644 vendor/pyrus/php/Text/Diff/Engine/string.php create mode 100644 vendor/pyrus/php/Text/Diff/Engine/xdiff.php create mode 100644 vendor/pyrus/php/Text/Diff/Mapped.php create mode 100644 vendor/pyrus/php/Text/Diff/Renderer.php create mode 100644 vendor/pyrus/php/Text/Diff/Renderer/context.php create mode 100644 vendor/pyrus/php/Text/Diff/Renderer/inline.php create mode 100644 vendor/pyrus/php/Text/Diff/Renderer/unified.php create mode 100644 vendor/pyrus/php/Text/Diff/ThreeWay.php create mode 100644 vendor/pyrus/php/Text/Diff3.php create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/1.txt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/2.txt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/3.txt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/4.txt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/5.txt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/6.txt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/context.patch create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/context.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/context2.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/diff.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/inline.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/inline2.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug12740.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug4879.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6251.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6428.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/string.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/unified.patch create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/unified.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/unified2.phpt create mode 100644 vendor/pyrus/tests/Text_Diff/Text/tests/xdiff.phpt diff --git a/vendor/pyrus/.pear2registry b/vendor/pyrus/.pear2registry index f45eda32d1bf1c8490fa5e365d9a75d2a1ed0b13..40ecf286c609ce76aa8c5feedc3a113dedfaf42d 100644 GIT binary patch delta 16301 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 delta 9250 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 diff --git a/vendor/pyrus/docs/Text_Diff/Text/docs/examples/1.txt b/vendor/pyrus/docs/Text_Diff/Text/docs/examples/1.txt new file mode 100644 index 00000000..976c4475 --- /dev/null +++ b/vendor/pyrus/docs/Text_Diff/Text/docs/examples/1.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 1.txt +This line is the same. diff --git a/vendor/pyrus/docs/Text_Diff/Text/docs/examples/2.txt b/vendor/pyrus/docs/Text_Diff/Text/docs/examples/2.txt new file mode 100644 index 00000000..6fa8051d --- /dev/null +++ b/vendor/pyrus/docs/Text_Diff/Text/docs/examples/2.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 2.txt +This line is the same. diff --git a/vendor/pyrus/docs/Text_Diff/Text/docs/examples/diff.php b/vendor/pyrus/docs/Text_Diff/Text/docs/examples/diff.php new file mode 100644 index 00000000..66914c25 --- /dev/null +++ b/vendor/pyrus/docs/Text_Diff/Text/docs/examples/diff.php @@ -0,0 +1,39 @@ +#!/usr/bin/php +<?php +/** + * Text_Diff example script. + * + * Take two files from the command line args and produce a unified + * diff of them. + * + * @package Text_Diff + */ + +require_once 'Text/Diff.php'; +require_once 'Text/Diff/Renderer.php'; +require_once 'Text/Diff/Renderer/unified.php'; + +/* Make sure we have enough arguments. */ +if (count($argv) < 3) { + echo "Usage: diff.php <file1> <file2>\n\n"; + exit; +} + +/* Make sure both files exist. */ +if (!is_readable($argv[1])) { + echo "$argv[1] not found or not readable.\n\n"; +} +if (!is_readable($argv[2])) { + echo "$argv[2] not found or not readable.\n\n"; +} + +/* Load the lines of each file. */ +$lines1 = file($argv[1]); +$lines2 = file($argv[2]); + +/* Create the Diff object. */ +$diff = new Text_Diff('auto', array($lines1, $lines2)); + +/* Output the diff in unified format. */ +$renderer = new Text_Diff_Renderer_unified(); +echo $renderer->render($diff); diff --git a/vendor/pyrus/php/Text/Diff.php b/vendor/pyrus/php/Text/Diff.php new file mode 100644 index 00000000..ceeca60f --- /dev/null +++ b/vendor/pyrus/php/Text/Diff.php @@ -0,0 +1,453 @@ +<?php +/** + * General API for generating and formatting diffs - the differences between + * two sequences of strings. + * + * The original PHP version of this code was written by Geoffrey T. Dairiki + * <dairiki@dairiki.org>, and is used/adapted with his permission. + * + * $Horde: framework/Text_Diff/Diff.php,v 1.11.2.12 2009/01/06 15:23:41 jan Exp $ + * + * Copyright 2004 Geoffrey T. Dairiki <dairiki@dairiki.org> + * Copyright 2004-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. + * + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_Diff { + + /** + * Array of changes. + * + * @var array + */ + var $_edits; + + /** + * Computes diffs between sequences of strings. + * + * @param string $engine Name of the diffing engine to use. 'auto' + * will automatically select the best. + * @param array $params Parameters to pass to the diffing engine. + * Normally an array of two arrays, each + * containing the lines from a file. + */ + function Text_Diff($engine, $params) + { + // Backward compatibility workaround. + if (!is_string($engine)) { + $params = array($engine, $params); + $engine = 'auto'; + } + + if ($engine == 'auto') { + $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; + } else { + $engine = basename($engine); + } + + require_once 'Text/Diff/Engine/' . $engine . '.php'; + $class = 'Text_Diff_Engine_' . $engine; + $diff_engine = new $class(); + + $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); + } + + /** + * Returns the array of differences. + */ + function getDiff() + { + return $this->_edits; + } + + /** + * returns the number of new (added) lines in a given diff. + * + * @since Text_Diff 1.1.0 + * @since Horde 3.2 + * + * @return integer The number of new lines + */ + function countAddedLines() + { + $count = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_add') || + is_a($edit, 'Text_Diff_Op_change')) { + $count += $edit->nfinal(); + } + } + return $count; + } + + /** + * Returns the number of deleted (removed) lines in a given diff. + * + * @since Text_Diff 1.1.0 + * @since Horde 3.2 + * + * @return integer The number of deleted lines + */ + function countDeletedLines() + { + $count = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_delete') || + is_a($edit, 'Text_Diff_Op_change')) { + $count += $edit->norig(); + } + } + return $count; + } + + /** + * Computes a reversed diff. + * + * Example: + * <code> + * $diff = new Text_Diff($lines1, $lines2); + * $rev = $diff->reverse(); + * </code> + * + * @return Text_Diff A Diff object representing the inverse of the + * original diff. Note that we purposely don't return a + * reference here, since this essentially is a clone() + * method. + */ + function reverse() + { + if (version_compare(zend_version(), '2', '>')) { + $rev = clone($this); + } else { + $rev = $this; + } + $rev->_edits = array(); + foreach ($this->_edits as $edit) { + $rev->_edits[] = $edit->reverse(); + } + return $rev; + } + + /** + * Checks for an empty diff. + * + * @return boolean True if two sequences were identical. + */ + function isEmpty() + { + foreach ($this->_edits as $edit) { + if (!is_a($edit, 'Text_Diff_Op_copy')) { + return false; + } + } + return true; + } + + /** + * Computes the length of the Longest Common Subsequence (LCS). + * + * This is mostly for diagnostic purposes. + * + * @return integer The length of the LCS. + */ + function lcs() + { + $lcs = 0; + foreach ($this->_edits as $edit) { + if (is_a($edit, 'Text_Diff_Op_copy')) { + $lcs += count($edit->orig); + } + } + return $lcs; + } + + /** + * Gets the original set of lines. + * + * This reconstructs the $from_lines parameter passed to the constructor. + * + * @return array The original sequence of strings. + */ + function getOriginal() + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->orig) { + array_splice($lines, count($lines), 0, $edit->orig); + } + } + return $lines; + } + + /** + * Gets the final set of lines. + * + * This reconstructs the $to_lines parameter passed to the constructor. + * + * @return array The sequence of strings. + */ + function getFinal() + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->final) { + array_splice($lines, count($lines), 0, $edit->final); + } + } + return $lines; + } + + /** + * Removes trailing newlines from a line of text. This is meant to be used + * with array_walk(). + * + * @param string $line The line to trim. + * @param integer $key The index of the line in the array. Not used. + */ + static function trimNewlines(&$line, $key) + { + $line = str_replace(array("\n", "\r"), '', $line); + } + + /** + * Determines the location of the system temporary directory. + * + * @static + * + * @access protected + * + * @return string A directory name which can be used for temp files. + * Returns false if one could not be found. + */ + function _getTempDir() + { + $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', + 'c:\windows\temp', 'c:\winnt\temp'); + + /* Try PHP's upload_tmp_dir directive. */ + $tmp = ini_get('upload_tmp_dir'); + + /* Otherwise, try to determine the TMPDIR environment variable. */ + if (!strlen($tmp)) { + $tmp = getenv('TMPDIR'); + } + + /* If we still cannot determine a value, then cycle through a list of + * preset possibilities. */ + while (!strlen($tmp) && count($tmp_locations)) { + $tmp_check = array_shift($tmp_locations); + if (@is_dir($tmp_check)) { + $tmp = $tmp_check; + } + } + + /* If it is still empty, we have failed, so return false; otherwise + * return the directory determined. */ + return strlen($tmp) ? $tmp : false; + } + + /** + * Checks a diff for validity. + * + * This is here only for debugging purposes. + */ + function _check($from_lines, $to_lines) + { + if (serialize($from_lines) != serialize($this->getOriginal())) { + trigger_error("Reconstructed original doesn't match", E_USER_ERROR); + } + if (serialize($to_lines) != serialize($this->getFinal())) { + trigger_error("Reconstructed final doesn't match", E_USER_ERROR); + } + + $rev = $this->reverse(); + if (serialize($to_lines) != serialize($rev->getOriginal())) { + trigger_error("Reversed original doesn't match", E_USER_ERROR); + } + if (serialize($from_lines) != serialize($rev->getFinal())) { + trigger_error("Reversed final doesn't match", E_USER_ERROR); + } + + $prevtype = null; + foreach ($this->_edits as $edit) { + if ($prevtype == get_class($edit)) { + trigger_error("Edit sequence is non-optimal", E_USER_ERROR); + } + $prevtype = get_class($edit); + } + + return true; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_MappedDiff extends Text_Diff { + + /** + * Computes a diff between sequences of strings. + * + * This can be used to compute things like case-insensitve diffs, or diffs + * which ignore changes in white-space. + * + * @param array $from_lines An array of strings. + * @param array $to_lines An array of strings. + * @param array $mapped_from_lines This array should have the same size + * number of elements as $from_lines. The + * elements in $mapped_from_lines and + * $mapped_to_lines are what is actually + * compared when computing the diff. + * @param array $mapped_to_lines This array should have the same number + * of elements as $to_lines. + */ + function Text_MappedDiff($from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines) + { + assert(count($from_lines) == count($mapped_from_lines)); + assert(count($to_lines) == count($mapped_to_lines)); + + parent::Text_Diff($mapped_from_lines, $mapped_to_lines); + + $xi = $yi = 0; + for ($i = 0; $i < count($this->_edits); $i++) { + $orig = &$this->_edits[$i]->orig; + if (is_array($orig)) { + $orig = array_slice($from_lines, $xi, count($orig)); + $xi += count($orig); + } + + $final = &$this->_edits[$i]->final; + if (is_array($final)) { + $final = array_slice($to_lines, $yi, count($final)); + $yi += count($final); + } + } + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op { + + var $orig; + var $final; + + function &reverse() + { + trigger_error('Abstract method', E_USER_ERROR); + } + + function norig() + { + return $this->orig ? count($this->orig) : 0; + } + + function nfinal() + { + return $this->final ? count($this->final) : 0; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_copy extends Text_Diff_Op { + + function Text_Diff_Op_copy($orig, $final = false) + { + if (!is_array($final)) { + $final = $orig; + } + $this->orig = $orig; + $this->final = $final; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_copy($this->final, $this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_delete extends Text_Diff_Op { + + function Text_Diff_Op_delete($lines) + { + $this->orig = $lines; + $this->final = false; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_add($this->orig); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_add extends Text_Diff_Op { + + function Text_Diff_Op_add($lines) + { + $this->final = $lines; + $this->orig = false; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_delete($this->final); + return $reverse; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_Op_change extends Text_Diff_Op { + + function Text_Diff_Op_change($orig, $final) + { + $this->orig = $orig; + $this->final = $final; + } + + function &reverse() + { + $reverse = new Text_Diff_Op_change($this->final, $this->orig); + return $reverse; + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Engine/native.php b/vendor/pyrus/php/Text/Diff/Engine/native.php new file mode 100644 index 00000000..84168c0b --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Engine/native.php @@ -0,0 +1,438 @@ +<?php +/** + * Class used internally by Text_Diff to actually compute the diffs. + * + * This class is implemented using native PHP code. + * + * The algorithm used here is mostly lifted from the perl module + * Algorithm::Diff (version 1.06) by Ned Konz, which is available at: + * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip + * + * More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html + * + * Some ideas (and a bit of code) are taken from analyze.c, of GNU + * diffutils-2.7, which can be found at: + * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz + * + * Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from + * Geoffrey T. Dairiki <dairiki@dairiki.org>. The original PHP version of this + * code was written by him, and is used/adapted with his permission. + * + * $Horde: framework/Text_Diff/Diff/Engine/native.php,v 1.7.2.5 2009/01/06 15:23:41 jan Exp $ + * + * Copyright 2004-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 Geoffrey T. Dairiki <dairiki@dairiki.org> + * @package Text_Diff + */ +class Text_Diff_Engine_native { + + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + $n_from = count($from_lines); + $n_to = count($to_lines); + + $this->xchanged = $this->ychanged = array(); + $this->xv = $this->yv = array(); + $this->xind = $this->yind = array(); + unset($this->seq); + unset($this->in_seq); + unset($this->lcs); + + // Skip leading common lines. + for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { + if ($from_lines[$skip] !== $to_lines[$skip]) { + break; + } + $this->xchanged[$skip] = $this->ychanged[$skip] = false; + } + + // Skip trailing common lines. + $xi = $n_from; $yi = $n_to; + for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { + if ($from_lines[$xi] !== $to_lines[$yi]) { + break; + } + $this->xchanged[$xi] = $this->ychanged[$yi] = false; + } + + // Ignore lines which do not exist in both files. + for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { + $xhash[$from_lines[$xi]] = 1; + } + for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { + $line = $to_lines[$yi]; + if (($this->ychanged[$yi] = empty($xhash[$line]))) { + continue; + } + $yhash[$line] = 1; + $this->yv[] = $line; + $this->yind[] = $yi; + } + for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { + $line = $from_lines[$xi]; + if (($this->xchanged[$xi] = empty($yhash[$line]))) { + continue; + } + $this->xv[] = $line; + $this->xind[] = $xi; + } + + // Find the LCS. + $this->_compareseq(0, count($this->xv), 0, count($this->yv)); + + // Merge edits when possible. + $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); + $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); + + // Compute the edit operations. + $edits = array(); + $xi = $yi = 0; + while ($xi < $n_from || $yi < $n_to) { + assert($yi < $n_to || $this->xchanged[$xi]); + assert($xi < $n_from || $this->ychanged[$yi]); + + // Skip matching "snake". + $copy = array(); + while ($xi < $n_from && $yi < $n_to + && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { + $copy[] = $from_lines[$xi++]; + ++$yi; + } + if ($copy) { + $edits[] = &new Text_Diff_Op_copy($copy); + } + + // Find deletes & adds. + $delete = array(); + while ($xi < $n_from && $this->xchanged[$xi]) { + $delete[] = $from_lines[$xi++]; + } + + $add = array(); + while ($yi < $n_to && $this->ychanged[$yi]) { + $add[] = $to_lines[$yi++]; + } + + if ($delete && $add) { + $edits[] = &new Text_Diff_Op_change($delete, $add); + } elseif ($delete) { + $edits[] = &new Text_Diff_Op_delete($delete); + } elseif ($add) { + $edits[] = &new Text_Diff_Op_add($add); + } + } + + return $edits; + } + + /** + * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, + * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized + * segments. + * + * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of + * NCHUNKS+1 (X, Y) indexes giving the diving points between sub + * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), + * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == + * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). + * + * This function assumes that the first lines of the specified portions of + * the two files do not match, and likewise that the last lines do not + * match. The caller must trim matching lines from the beginning and end + * of the portions it is going to specify. + */ + function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) + { + $flip = false; + + if ($xlim - $xoff > $ylim - $yoff) { + /* Things seems faster (I'm not sure I understand why) when the + * shortest sequence is in X. */ + $flip = true; + list ($xoff, $xlim, $yoff, $ylim) + = array($yoff, $ylim, $xoff, $xlim); + } + + if ($flip) { + for ($i = $ylim - 1; $i >= $yoff; $i--) { + $ymatches[$this->xv[$i]][] = $i; + } + } else { + for ($i = $ylim - 1; $i >= $yoff; $i--) { + $ymatches[$this->yv[$i]][] = $i; + } + } + + $this->lcs = 0; + $this->seq[0]= $yoff - 1; + $this->in_seq = array(); + $ymids[0] = array(); + + $numer = $xlim - $xoff + $nchunks - 1; + $x = $xoff; + for ($chunk = 0; $chunk < $nchunks; $chunk++) { + if ($chunk > 0) { + for ($i = 0; $i <= $this->lcs; $i++) { + $ymids[$i][$chunk - 1] = $this->seq[$i]; + } + } + + $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); + for (; $x < $x1; $x++) { + $line = $flip ? $this->yv[$x] : $this->xv[$x]; + if (empty($ymatches[$line])) { + continue; + } + $matches = $ymatches[$line]; + reset($matches); + while (list(, $y) = each($matches)) { + if (empty($this->in_seq[$y])) { + $k = $this->_lcsPos($y); + assert($k > 0); + $ymids[$k] = $ymids[$k - 1]; + break; + } + } + while (list(, $y) = each($matches)) { + if ($y > $this->seq[$k - 1]) { + assert($y <= $this->seq[$k]); + /* Optimization: this is a common case: next match is + * just replacing previous match. */ + $this->in_seq[$this->seq[$k]] = false; + $this->seq[$k] = $y; + $this->in_seq[$y] = 1; + } elseif (empty($this->in_seq[$y])) { + $k = $this->_lcsPos($y); + assert($k > 0); + $ymids[$k] = $ymids[$k - 1]; + } + } + } + } + + $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); + $ymid = $ymids[$this->lcs]; + for ($n = 0; $n < $nchunks - 1; $n++) { + $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); + $y1 = $ymid[$n] + 1; + $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); + } + $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); + + return array($this->lcs, $seps); + } + + function _lcsPos($ypos) + { + $end = $this->lcs; + if ($end == 0 || $ypos > $this->seq[$end]) { + $this->seq[++$this->lcs] = $ypos; + $this->in_seq[$ypos] = 1; + return $this->lcs; + } + + $beg = 1; + while ($beg < $end) { + $mid = (int)(($beg + $end) / 2); + if ($ypos > $this->seq[$mid]) { + $beg = $mid + 1; + } else { + $end = $mid; + } + } + + assert($ypos != $this->seq[$end]); + + $this->in_seq[$this->seq[$end]] = false; + $this->seq[$end] = $ypos; + $this->in_seq[$ypos] = 1; + return $end; + } + + /** + * Finds LCS of two sequences. + * + * The results are recorded in the vectors $this->{x,y}changed[], by + * storing a 1 in the element for each line that is an insertion or + * deletion (ie. is not in the LCS). + * + * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. + * + * Note that XLIM, YLIM are exclusive bounds. All line numbers are + * origin-0 and discarded lines are not counted. + */ + function _compareseq ($xoff, $xlim, $yoff, $ylim) + { + /* Slide down the bottom initial diagonal. */ + while ($xoff < $xlim && $yoff < $ylim + && $this->xv[$xoff] == $this->yv[$yoff]) { + ++$xoff; + ++$yoff; + } + + /* Slide up the top initial diagonal. */ + while ($xlim > $xoff && $ylim > $yoff + && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { + --$xlim; + --$ylim; + } + + if ($xoff == $xlim || $yoff == $ylim) { + $lcs = 0; + } else { + /* This is ad hoc but seems to work well. $nchunks = + * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = + * max(2,min(8,(int)$nchunks)); */ + $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; + list($lcs, $seps) + = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); + } + + if ($lcs == 0) { + /* X and Y sequences have no common subsequence: mark all + * changed. */ + while ($yoff < $ylim) { + $this->ychanged[$this->yind[$yoff++]] = 1; + } + while ($xoff < $xlim) { + $this->xchanged[$this->xind[$xoff++]] = 1; + } + } else { + /* Use the partitions to split this problem into subproblems. */ + reset($seps); + $pt1 = $seps[0]; + while ($pt2 = next($seps)) { + $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); + $pt1 = $pt2; + } + } + } + + /** + * Adjusts inserts/deletes of identical lines to join changes as much as + * possible. + * + * We do something when a run of changed lines include a line at one end + * and has an excluded, identical line at the other. We are free to + * choose which identical line is included. `compareseq' usually chooses + * the one at the beginning, but usually it is cleaner to consider the + * following identical line to be the "change". + * + * This is extracted verbatim from analyze.c (GNU diffutils-2.7). + */ + function _shiftBoundaries($lines, &$changed, $other_changed) + { + $i = 0; + $j = 0; + + assert('count($lines) == count($changed)'); + $len = count($lines); + $other_len = count($other_changed); + + while (1) { + /* Scan forward to find the beginning of another run of + * changes. Also keep track of the corresponding point in the + * other file. + * + * Throughout this code, $i and $j are adjusted together so that + * the first $i elements of $changed and the first $j elements of + * $other_changed both contain the same number of zeros (unchanged + * lines). + * + * Furthermore, $j is always kept so that $j == $other_len or + * $other_changed[$j] == false. */ + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + + while ($i < $len && ! $changed[$i]) { + assert('$j < $other_len && ! $other_changed[$j]'); + $i++; $j++; + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + } + + if ($i == $len) { + break; + } + + $start = $i; + + /* Find the end of this run of changes. */ + while (++$i < $len && $changed[$i]) { + continue; + } + + do { + /* Record the length of this run of changes, so that we can + * later determine whether the run has grown. */ + $runlength = $i - $start; + + /* Move the changed region back, so long as the previous + * unchanged line matches the last changed one. This merges + * with previous changed regions. */ + while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { + $changed[--$start] = 1; + $changed[--$i] = false; + while ($start > 0 && $changed[$start - 1]) { + $start--; + } + assert('$j > 0'); + while ($other_changed[--$j]) { + continue; + } + assert('$j >= 0 && !$other_changed[$j]'); + } + + /* Set CORRESPONDING to the end of the changed run, at the + * last point where it corresponds to a changed run in the + * other file. CORRESPONDING == LEN means no such point has + * been found. */ + $corresponding = $j < $other_len ? $i : $len; + + /* Move the changed region forward, so long as the first + * changed line matches the following unchanged one. This + * merges with following changed regions. Do this second, so + * that if there are no merges, the changed region is moved + * forward as far as possible. */ + while ($i < $len && $lines[$start] == $lines[$i]) { + $changed[$start++] = false; + $changed[$i++] = 1; + while ($i < $len && $changed[$i]) { + $i++; + } + + assert('$j < $other_len && ! $other_changed[$j]'); + $j++; + if ($j < $other_len && $other_changed[$j]) { + $corresponding = $i; + while ($j < $other_len && $other_changed[$j]) { + $j++; + } + } + } + } while ($runlength != $i - $start); + + /* If possible, move the fully-merged run of changes back to a + * corresponding run in the other file. */ + while ($corresponding < $i) { + $changed[--$start] = 1; + $changed[--$i] = 0; + assert('$j > 0'); + while ($other_changed[--$j]) { + continue; + } + assert('$j >= 0 && !$other_changed[$j]'); + } + } + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Engine/shell.php b/vendor/pyrus/php/Text/Diff/Engine/shell.php new file mode 100644 index 00000000..7f858cbf --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Engine/shell.php @@ -0,0 +1,164 @@ +<?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> + * @package Text_Diff + * @since 0.3.0 + */ +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, + new Text_Diff_Op_delete( + $this->_getLines($from_lines, $from_line_no, $match[2]))); + $to_line_no++; + break; + + case 'c': + // changed lines + array_push($edits, + new Text_Diff_Op_change( + $this->_getLines($from_lines, $from_line_no, $match[2]), + $this->_getLines($to_lines, $to_line_no, $match[5]))); + break; + + case 'a': + // added lines + array_push($edits, + new Text_Diff_Op_add( + $this->_getLines($to_lines, $to_line_no, $match[5]))); + $from_line_no++; + break; + } + } + + if (!empty($from_lines)) { + // Some lines might still be pending. Add them as copied + array_push($edits, + new Text_Diff_Op_copy( + $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))); + } + + return $edits; + } + + /** + * Get lines from either the old or new text + * + * @access private + * + * @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 + * than one line. + * + * @return array The chopped lines + */ + function _getLines(&$text_lines, &$line_no, $end = false) + { + if (!empty($end)) { + $lines = array(); + // We can shift even more + while ($line_no <= $end) { + array_push($lines, array_shift($text_lines)); + $line_no++; + } + } else { + $lines = array(array_shift($text_lines)); + $line_no++; + } + + return $lines; + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Engine/string.php b/vendor/pyrus/php/Text/Diff/Engine/string.php new file mode 100644 index 00000000..9352e60d --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Engine/string.php @@ -0,0 +1,250 @@ +<?php +/** + * Parses unified or context diffs output from eg. the diff utility. + * + * Example: + * <code> + * $patch = file_get_contents('example.patch'); + * $diff = new Text_Diff('string', array($patch)); + * $renderer = new Text_Diff_Renderer_inline(); + * echo $renderer->render($diff); + * </code> + * + * $Horde: framework/Text_Diff/Diff/Engine/string.php,v 1.5.2.7 2009/07/24 13:04:43 jan Exp $ + * + * Copyright 2005 �rjan Persson <o@42mm.org> + * Copyright 2005-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 �rjan Persson <o@42mm.org> + * @package Text_Diff + * @since 0.2.0 + */ +class Text_Diff_Engine_string { + + /** + * Parses a unified or context diff. + * + * First param contains the whole diff and the second can be used to force + * a specific diff type. If the second parameter is 'autodetect', the + * diff will be examined to find out which type of diff this is. + * + * @param string $diff The diff content. + * @param string $mode The diff mode of the content in $diff. One of + * 'context', 'unified', or 'autodetect'. + * + * @return array List of all diff operations. + */ + function diff($diff, $mode = 'autodetect') + { + // Detect line breaks. + $lnbr = "\n"; + if (strpos($diff, "\r\n") !== false) { + $lnbr = "\r\n"; + } elseif (strpos($diff, "\r") !== false) { + $lnbr = "\r"; + } + + // Make sure we have a line break at the EOF. + if (substr($diff, -strlen($lnbr)) != $lnbr) { + $diff .= $lnbr; + } + + if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { + return PEAR::raiseError('Type of diff is unsupported'); + } + + if ($mode == 'autodetect') { + $context = strpos($diff, '***'); + $unified = strpos($diff, '---'); + if ($context === $unified) { + return PEAR::raiseError('Type of diff could not be detected'); + } elseif ($context === false || $unified === false) { + $mode = $context !== false ? 'context' : 'unified'; + } else { + $mode = $context < $unified ? 'context' : 'unified'; + } + } + + // Split by new line and remove the diff header, if there is one. + $diff = explode($lnbr, $diff); + if (($mode == 'context' && strpos($diff[0], '***') === 0) || + ($mode == 'unified' && strpos($diff[0], '---') === 0)) { + array_shift($diff); + array_shift($diff); + } + + if ($mode == 'context') { + return $this->parseContextDiff($diff); + } else { + return $this->parseUnifiedDiff($diff); + } + } + + /** + * Parses an array containing the unified diff. + * + * @param array $diff Array of lines. + * + * @return array List of all diff operations. + */ + function parseUnifiedDiff($diff) + { + $edits = array(); + $end = count($diff) - 1; + for ($i = 0; $i < $end;) { + $diff1 = array(); + switch (substr($diff[$i], 0, 1)) { + case ' ': + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); + $edits[] = new Text_Diff_Op_copy($diff1); + break; + + case '+': + // get all new lines + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff1); + break; + + case '-': + // get changed or removed lines + $diff2 = array(); + do { + $diff1[] = substr($diff[$i], 1); + } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); + + while ($i < $end && substr($diff[$i], 0, 1) == '+') { + $diff2[] = substr($diff[$i++], 1); + } + if (count($diff2) == 0) { + $edits[] = new Text_Diff_Op_delete($diff1); + } else { + $edits[] = new Text_Diff_Op_change($diff1, $diff2); + } + break; + + default: + $i++; + break; + } + } + + return $edits; + } + + /** + * Parses an array containing the context diff. + * + * @param array $diff Array of lines. + * + * @return array List of all diff operations. + */ + function parseContextDiff(&$diff) + { + $edits = array(); + $i = $max_i = $j = $max_j = 0; + $end = count($diff) - 1; + while ($i < $end && $j < $end) { + while ($i >= $max_i && $j >= $max_j) { + // Find the boundaries of the diff output of the two files + for ($i = $j; + $i < $end && substr($diff[$i], 0, 3) == '***'; + $i++); + for ($max_i = $i; + $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; + $max_i++); + for ($j = $max_i; + $j < $end && substr($diff[$j], 0, 3) == '---'; + $j++); + for ($max_j = $j; + $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; + $max_j++); + } + + // find what hasn't been changed + $array = array(); + while ($i < $max_i && + $j < $max_j && + strcmp($diff[$i], $diff[$j]) == 0) { + $array[] = substr($diff[$i], 2); + $i++; + $j++; + } + + while ($i < $max_i && ($max_j-$j) <= 1) { + if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { + break; + } + $array[] = substr($diff[$i++], 2); + } + + while ($j < $max_j && ($max_i-$i) <= 1) { + if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { + break; + } + $array[] = substr($diff[$j++], 2); + } + if (count($array) > 0) { + $edits[] = new Text_Diff_Op_copy($array); + } + + if ($i < $max_i) { + $diff1 = array(); + switch (substr($diff[$i], 0, 1)) { + case '!': + $diff2 = array(); + do { + $diff1[] = substr($diff[$i], 2); + if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { + $diff2[] = substr($diff[$j++], 2); + } + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); + $edits[] = new Text_Diff_Op_change($diff1, $diff2); + break; + + case '+': + do { + $diff1[] = substr($diff[$i], 2); + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff1); + break; + + case '-': + do { + $diff1[] = substr($diff[$i], 2); + } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); + $edits[] = new Text_Diff_Op_delete($diff1); + break; + } + } + + if ($j < $max_j) { + $diff2 = array(); + switch (substr($diff[$j], 0, 1)) { + case '+': + do { + $diff2[] = substr($diff[$j++], 2); + } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); + $edits[] = new Text_Diff_Op_add($diff2); + break; + + case '-': + do { + $diff2[] = substr($diff[$j++], 2); + } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); + $edits[] = new Text_Diff_Op_delete($diff2); + break; + } + } + } + + return $edits; + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Engine/xdiff.php b/vendor/pyrus/php/Text/Diff/Engine/xdiff.php new file mode 100644 index 00000000..241d2e52 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Engine/xdiff.php @@ -0,0 +1,66 @@ +<?php +/** + * Class used internally by Diff to actually compute the diffs. + * + * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff) + * to compute the differences between the two input arrays. + * + * $Horde: framework/Text_Diff/Diff/Engine/xdiff.php,v 1.4.2.5 2009/07/24 13:06:24 jan Exp $ + * + * Copyright 2004-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 Jon Parise <jon@horde.org> + * @package Text_Diff + */ +class Text_Diff_Engine_xdiff { + + /** + */ + function diff($from_lines, $to_lines) + { + array_walk($from_lines, array('Text_Diff', 'trimNewlines')); + array_walk($to_lines, array('Text_Diff', 'trimNewlines')); + + /* Convert the two input arrays into strings for xdiff processing. */ + $from_string = implode("\n", $from_lines); + $to_string = implode("\n", $to_lines); + + /* Diff the two strings and convert the result to an array. */ + $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); + $diff = explode("\n", $diff); + + /* Walk through the diff one line at a time. We build the $edits + * array of diff operations by reading the first character of the + * xdiff output (which is in the "unified diff" format). + * + * Note that we don't have enough information to detect "changed" + * lines using this approach, so we can't add Text_Diff_Op_changed + * instances to the $edits array. The result is still perfectly + * valid, albeit a little less descriptive and efficient. */ + $edits = array(); + foreach ($diff as $line) { + if (!strlen($line)) { + continue; + } + switch ($line[0]) { + case ' ': + $edits[] = &new Text_Diff_Op_copy(array(substr($line, 1))); + break; + + case '+': + $edits[] = &new Text_Diff_Op_add(array(substr($line, 1))); + break; + + case '-': + $edits[] = &new Text_Diff_Op_delete(array(substr($line, 1))); + break; + } + } + + return $edits; + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Mapped.php b/vendor/pyrus/php/Text/Diff/Mapped.php new file mode 100644 index 00000000..dc46e5e4 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Mapped.php @@ -0,0 +1,55 @@ +<?php +/** + * $Horde: framework/Text_Diff/Diff/Mapped.php,v 1.3.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. + * + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_Diff_Mapped extends Text_Diff { + + /** + * Computes a diff between sequences of strings. + * + * This can be used to compute things like case-insensitve diffs, or diffs + * which ignore changes in white-space. + * + * @param array $from_lines An array of strings. + * @param array $to_lines An array of strings. + * @param array $mapped_from_lines This array should have the same size + * number of elements as $from_lines. The + * elements in $mapped_from_lines and + * $mapped_to_lines are what is actually + * compared when computing the diff. + * @param array $mapped_to_lines This array should have the same number + * of elements as $to_lines. + */ + function Text_Diff_Mapped($from_lines, $to_lines, + $mapped_from_lines, $mapped_to_lines) + { + assert(count($from_lines) == count($mapped_from_lines)); + assert(count($to_lines) == count($mapped_to_lines)); + + parent::Text_Diff($mapped_from_lines, $mapped_to_lines); + + $xi = $yi = 0; + for ($i = 0; $i < count($this->_edits); $i++) { + $orig = &$this->_edits[$i]->orig; + if (is_array($orig)) { + $orig = array_slice($from_lines, $xi, count($orig)); + $xi += count($orig); + } + + $final = &$this->_edits[$i]->final; + if (is_array($final)) { + $final = array_slice($to_lines, $yi, count($final)); + $yi += count($final); + } + } + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Renderer.php b/vendor/pyrus/php/Text/Diff/Renderer.php new file mode 100644 index 00000000..3a516504 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Renderer.php @@ -0,0 +1,237 @@ +<?php +/** + * A class to render Diffs in different formats. + * + * This class renders the diff in classic diff format. It is intended that + * this class be customized via inheritance, to obtain fancier outputs. + * + * $Horde: framework/Text_Diff/Diff/Renderer.php,v 1.5.10.12 2009/07/24 13:26:40 jan Exp $ + * + * Copyright 2004-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. + * + * @package Text_Diff + */ +class Text_Diff_Renderer { + + /** + * Number of leading context "lines" to preserve. + * + * This should be left at zero for this class, but subclasses may want to + * set this to other values. + */ + var $_leading_context_lines = 0; + + /** + * Number of trailing context "lines" to preserve. + * + * This should be left at zero for this class, but subclasses may want to + * set this to other values. + */ + var $_trailing_context_lines = 0; + + /** + * Constructor. + */ + function Text_Diff_Renderer($params = array()) + { + foreach ($params as $param => $value) { + $v = '_' . $param; + if (isset($this->$v)) { + $this->$v = $value; + } + } + } + + /** + * Get any renderer parameters. + * + * @return array All parameters of this renderer object. + */ + function getParams() + { + $params = array(); + foreach (get_object_vars($this) as $k => $v) { + if ($k[0] == '_') { + $params[substr($k, 1)] = $v; + } + } + + return $params; + } + + /** + * Renders a diff. + * + * @param Text_Diff $diff A Text_Diff object. + * + * @return string The formatted output. + */ + function render($diff) + { + $xi = $yi = 1; + $block = false; + $context = array(); + + $nlead = $this->_leading_context_lines; + $ntrail = $this->_trailing_context_lines; + + $output = $this->_startDiff(); + + $diffs = $diff->getDiff(); + foreach ($diffs as $i => $edit) { + /* If these are unchanged (copied) lines, and we want to keep + * leading or trailing context lines, extract them from the copy + * block. */ + if (is_a($edit, 'Text_Diff_Op_copy')) { + /* Do we have any diff blocks yet? */ + if (is_array($block)) { + /* How many lines to keep as context from the copy + * block. */ + $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail; + if (count($edit->orig) <= $keep) { + /* We have less lines in the block than we want for + * context => keep the whole block. */ + $block[] = $edit; + } else { + if ($ntrail) { + /* Create a new block with as many lines as we need + * for the trailing context. */ + $context = array_slice($edit->orig, 0, $ntrail); + $block[] = new Text_Diff_Op_copy($context); + } + /* @todo */ + $output .= $this->_block($x0, $ntrail + $xi - $x0, + $y0, $ntrail + $yi - $y0, + $block); + $block = false; + } + } + /* Keep the copy block as the context for the next block. */ + $context = $edit->orig; + } else { + /* Don't we have any diff blocks yet? */ + if (!is_array($block)) { + /* Extract context lines from the preceding copy block. */ + $context = array_slice($context, count($context) - $nlead); + $x0 = $xi - count($context); + $y0 = $yi - count($context); + $block = array(); + if ($context) { + $block[] = new Text_Diff_Op_copy($context); + } + } + $block[] = $edit; + } + + if ($edit->orig) { + $xi += count($edit->orig); + } + if ($edit->final) { + $yi += count($edit->final); + } + } + + if (is_array($block)) { + $output .= $this->_block($x0, $xi - $x0, + $y0, $yi - $y0, + $block); + } + + return $output . $this->_endDiff(); + } + + function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) + { + $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); + + foreach ($edits as $edit) { + switch (strtolower(get_class($edit))) { + case 'text_diff_op_copy': + $output .= $this->_context($edit->orig); + break; + + case 'text_diff_op_add': + $output .= $this->_added($edit->final); + break; + + case 'text_diff_op_delete': + $output .= $this->_deleted($edit->orig); + break; + + case 'text_diff_op_change': + $output .= $this->_changed($edit->orig, $edit->final); + break; + } + } + + return $output . $this->_endBlock(); + } + + function _startDiff() + { + return ''; + } + + function _endDiff() + { + return ''; + } + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + if ($xlen > 1) { + $xbeg .= ',' . ($xbeg + $xlen - 1); + } + if ($ylen > 1) { + $ybeg .= ',' . ($ybeg + $ylen - 1); + } + + // this matches the GNU Diff behaviour + if ($xlen && !$ylen) { + $ybeg--; + } elseif (!$xlen) { + $xbeg--; + } + + return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; + } + + function _startBlock($header) + { + return $header . "\n"; + } + + function _endBlock() + { + return ''; + } + + function _lines($lines, $prefix = ' ') + { + return $prefix . implode("\n$prefix", $lines) . "\n"; + } + + function _context($lines) + { + return $this->_lines($lines, ' '); + } + + function _added($lines) + { + return $this->_lines($lines, '> '); + } + + function _deleted($lines) + { + return $this->_lines($lines, '< '); + } + + function _changed($orig, $final) + { + return $this->_deleted($orig) . "---\n" . $this->_added($final); + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Renderer/context.php b/vendor/pyrus/php/Text/Diff/Renderer/context.php new file mode 100644 index 00000000..af538015 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Renderer/context.php @@ -0,0 +1,77 @@ +<?php +/** + * "Context" diff renderer. + * + * This class renders the diff in classic "context diff" format. + * + * $Horde: framework/Text_Diff/Diff/Renderer/context.php,v 1.3.2.4 2009/01/06 15:23:42 jan Exp $ + * + * Copyright 2004-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. + * + * @package Text_Diff + */ + +/** Text_Diff_Renderer */ +require_once 'Text/Diff/Renderer.php'; + +/** + * @package Text_Diff + */ +class Text_Diff_Renderer_context extends Text_Diff_Renderer { + + /** + * Number of leading context "lines" to preserve. + */ + var $_leading_context_lines = 4; + + /** + * Number of trailing context "lines" to preserve. + */ + var $_trailing_context_lines = 4; + + var $_second_block = ''; + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + if ($xlen != 1) { + $xbeg .= ',' . $xlen; + } + if ($ylen != 1) { + $ybeg .= ',' . $ylen; + } + $this->_second_block = "--- $ybeg ----\n"; + return "***************\n*** $xbeg ****"; + } + + function _endBlock() + { + return $this->_second_block; + } + + function _context($lines) + { + $this->_second_block .= $this->_lines($lines, ' '); + return $this->_lines($lines, ' '); + } + + function _added($lines) + { + $this->_second_block .= $this->_lines($lines, '+ '); + return ''; + } + + function _deleted($lines) + { + return $this->_lines($lines, '- '); + } + + function _changed($orig, $final) + { + $this->_second_block .= $this->_lines($final, '! '); + return $this->_lines($orig, '! '); + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Renderer/inline.php b/vendor/pyrus/php/Text/Diff/Renderer/inline.php new file mode 100644 index 00000000..5dd20d2f --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Renderer/inline.php @@ -0,0 +1,172 @@ +<?php +/** + * "Inline" diff renderer. + * + * $Horde: framework/Text_Diff/Diff/Renderer/inline.php,v 1.4.10.16 2009/07/24 13:25:29 jan Exp $ + * + * Copyright 2004-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 Ciprian Popovici + * @package Text_Diff + */ + +/** Text_Diff_Renderer */ +require_once 'Text/Diff/Renderer.php'; + +/** + * "Inline" diff renderer. + * + * This class renders diffs in the Wiki-style "inline" format. + * + * @author Ciprian Popovici + * @package Text_Diff + */ +class Text_Diff_Renderer_inline extends Text_Diff_Renderer { + + /** + * Number of leading context "lines" to preserve. + */ + var $_leading_context_lines = 10000; + + /** + * Number of trailing context "lines" to preserve. + */ + var $_trailing_context_lines = 10000; + + /** + * Prefix for inserted text. + */ + var $_ins_prefix = '<ins>'; + + /** + * Suffix for inserted text. + */ + var $_ins_suffix = '</ins>'; + + /** + * Prefix for deleted text. + */ + var $_del_prefix = '<del>'; + + /** + * Suffix for deleted text. + */ + var $_del_suffix = '</del>'; + + /** + * Header for each change block. + */ + var $_block_header = ''; + + /** + * What are we currently splitting on? Used to recurse to show word-level + * changes. + */ + var $_split_level = 'lines'; + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + return $this->_block_header; + } + + function _startBlock($header) + { + return $header; + } + + function _lines($lines, $prefix = ' ', $encode = true) + { + if ($encode) { + array_walk($lines, array(&$this, '_encode')); + } + + if ($this->_split_level == 'words') { + return implode('', $lines); + } else { + return implode("\n", $lines) . "\n"; + } + } + + function _added($lines) + { + array_walk($lines, array(&$this, '_encode')); + $lines[0] = $this->_ins_prefix . $lines[0]; + $lines[count($lines) - 1] .= $this->_ins_suffix; + return $this->_lines($lines, ' ', false); + } + + function _deleted($lines, $words = false) + { + array_walk($lines, array(&$this, '_encode')); + $lines[0] = $this->_del_prefix . $lines[0]; + $lines[count($lines) - 1] .= $this->_del_suffix; + return $this->_lines($lines, ' ', false); + } + + function _changed($orig, $final) + { + /* If we've already split on words, don't try to do so again - just + * display. */ + if ($this->_split_level == 'words') { + $prefix = ''; + while ($orig[0] !== false && $final[0] !== false && + substr($orig[0], 0, 1) == ' ' && + substr($final[0], 0, 1) == ' ') { + $prefix .= substr($orig[0], 0, 1); + $orig[0] = substr($orig[0], 1); + $final[0] = substr($final[0], 1); + } + return $prefix . $this->_deleted($orig) . $this->_added($final); + } + + $text1 = implode("\n", $orig); + $text2 = implode("\n", $final); + + /* Non-printing newline marker. */ + $nl = "\0"; + + /* We want to split on word boundaries, but we need to + * preserve whitespace as well. Therefore we split on words, + * but include all blocks of whitespace in the wordlist. */ + $diff = new Text_Diff('native', + array($this->_splitOnWords($text1, $nl), + $this->_splitOnWords($text2, $nl))); + + /* Get the diff in inline format. */ + $renderer = new Text_Diff_Renderer_inline + (array_merge($this->getParams(), + array('split_level' => 'words'))); + + /* Run the diff and get the output. */ + return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; + } + + function _splitOnWords($string, $newlineEscape = "\n") + { + // Ignore \0; otherwise the while loop will never finish. + $string = str_replace("\0", '', $string); + + $words = array(); + $length = strlen($string); + $pos = 0; + + while ($pos < $length) { + // Eat a word with any preceding whitespace. + $spaces = strspn(substr($string, $pos), " \n"); + $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); + $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); + $pos += $spaces + $nextpos; + } + + return $words; + } + + function _encode(&$string) + { + $string = htmlspecialchars($string); + } + +} diff --git a/vendor/pyrus/php/Text/Diff/Renderer/unified.php b/vendor/pyrus/php/Text/Diff/Renderer/unified.php new file mode 100644 index 00000000..f990f729 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/Renderer/unified.php @@ -0,0 +1,67 @@ +<?php +/** + * "Unified" diff renderer. + * + * This class renders the diff in classic "unified diff" format. + * + * $Horde: framework/Text_Diff/Diff/Renderer/unified.php,v 1.3.10.7 2009/01/06 15:23:42 jan Exp $ + * + * Copyright 2004-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 Ciprian Popovici + * @package Text_Diff + */ + +/** Text_Diff_Renderer */ +require_once 'Text/Diff/Renderer.php'; + +/** + * @package Text_Diff + */ +class Text_Diff_Renderer_unified extends Text_Diff_Renderer { + + /** + * Number of leading context "lines" to preserve. + */ + var $_leading_context_lines = 4; + + /** + * Number of trailing context "lines" to preserve. + */ + var $_trailing_context_lines = 4; + + function _blockHeader($xbeg, $xlen, $ybeg, $ylen) + { + if ($xlen != 1) { + $xbeg .= ',' . $xlen; + } + if ($ylen != 1) { + $ybeg .= ',' . $ylen; + } + return "@@ -$xbeg +$ybeg @@"; + } + + function _context($lines) + { + return $this->_lines($lines, ' '); + } + + function _added($lines) + { + return $this->_lines($lines, '+'); + } + + function _deleted($lines) + { + return $this->_lines($lines, '-'); + } + + function _changed($orig, $final) + { + return $this->_deleted($orig) . $this->_added($final); + } + +} diff --git a/vendor/pyrus/php/Text/Diff/ThreeWay.php b/vendor/pyrus/php/Text/Diff/ThreeWay.php new file mode 100644 index 00000000..5b0357c6 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff/ThreeWay.php @@ -0,0 +1,276 @@ +<?php +/** + * A class for computing three way diffs. + * + * $Horde: framework/Text_Diff/Diff/ThreeWay.php,v 1.3.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. + * + * @package Text_Diff + * @since 0.3.0 + */ + +/** Text_Diff */ +require_once 'Text/Diff.php'; + +/** + * A class for computing three way diffs. + * + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_Diff_ThreeWay extends Text_Diff { + + /** + * Conflict counter. + * + * @var integer + */ + var $_conflictingBlocks = 0; + + /** + * Computes diff between 3 sequences of strings. + * + * @param array $orig The original lines to use. + * @param array $final1 The first version to compare to. + * @param array $final2 The second version to compare to. + */ + function Text_Diff_ThreeWay($orig, $final1, $final2) + { + if (extension_loaded('xdiff')) { + $engine = new Text_Diff_Engine_xdiff(); + } else { + $engine = new Text_Diff_Engine_native(); + } + + $this->_edits = $this->_diff3($engine->diff($orig, $final1), + $engine->diff($orig, $final2)); + } + + /** + */ + function mergedOutput($label1 = false, $label2 = false) + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->isConflict()) { + /* FIXME: this should probably be moved somewhere else. */ + $lines = array_merge($lines, + array('<<<<<<<' . ($label1 ? ' ' . $label1 : '')), + $edit->final1, + array("======="), + $edit->final2, + array('>>>>>>>' . ($label2 ? ' ' . $label2 : ''))); + $this->_conflictingBlocks++; + } else { + $lines = array_merge($lines, $edit->merged()); + } + } + + return $lines; + } + + /** + * @access private + */ + function _diff3($edits1, $edits2) + { + $edits = array(); + $bb = new Text_Diff_ThreeWay_BlockBuilder(); + + $e1 = current($edits1); + $e2 = current($edits2); + while ($e1 || $e2) { + if ($e1 && $e2 && is_a($e1, 'Text_Diff_Op_copy') && is_a($e2, 'Text_Diff_Op_copy')) { + /* We have copy blocks from both diffs. This is the (only) + * time we want to emit a diff3 copy block. Flush current + * diff3 diff block, if any. */ + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + $ncopy = min($e1->norig(), $e2->norig()); + assert($ncopy > 0); + $edits[] = new Text_Diff_ThreeWay_Op_copy(array_slice($e1->orig, 0, $ncopy)); + + if ($e1->norig() > $ncopy) { + array_splice($e1->orig, 0, $ncopy); + array_splice($e1->final, 0, $ncopy); + } else { + $e1 = next($edits1); + } + + if ($e2->norig() > $ncopy) { + array_splice($e2->orig, 0, $ncopy); + array_splice($e2->final, 0, $ncopy); + } else { + $e2 = next($edits2); + } + } else { + if ($e1 && $e2) { + if ($e1->orig && $e2->orig) { + $norig = min($e1->norig(), $e2->norig()); + $orig = array_splice($e1->orig, 0, $norig); + array_splice($e2->orig, 0, $norig); + $bb->input($orig); + } + + if (is_a($e1, 'Text_Diff_Op_copy')) { + $bb->out1(array_splice($e1->final, 0, $norig)); + } + + if (is_a($e2, 'Text_Diff_Op_copy')) { + $bb->out2(array_splice($e2->final, 0, $norig)); + } + } + + if ($e1 && ! $e1->orig) { + $bb->out1($e1->final); + $e1 = next($edits1); + } + if ($e2 && ! $e2->orig) { + $bb->out2($e2->final); + $e2 = next($edits2); + } + } + } + + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + return $edits; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_ThreeWay_Op { + + function Text_Diff_ThreeWay_Op($orig = false, $final1 = false, $final2 = false) + { + $this->orig = $orig ? $orig : array(); + $this->final1 = $final1 ? $final1 : array(); + $this->final2 = $final2 ? $final2 : array(); + } + + function merged() + { + if (!isset($this->_merged)) { + if ($this->final1 === $this->final2) { + $this->_merged = &$this->final1; + } elseif ($this->final1 === $this->orig) { + $this->_merged = &$this->final2; + } elseif ($this->final2 === $this->orig) { + $this->_merged = &$this->final1; + } else { + $this->_merged = false; + } + } + + return $this->_merged; + } + + function isConflict() + { + return $this->merged() === false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_ThreeWay_Op_copy extends Text_Diff_ThreeWay_Op { + + function Text_Diff_ThreeWay_Op_Copy($lines = false) + { + $this->orig = $lines ? $lines : array(); + $this->final1 = &$this->orig; + $this->final2 = &$this->orig; + } + + function merged() + { + return $this->orig; + } + + function isConflict() + { + return false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff_ThreeWay_BlockBuilder { + + function Text_Diff_ThreeWay_BlockBuilder() + { + $this->_init(); + } + + function input($lines) + { + if ($lines) { + $this->_append($this->orig, $lines); + } + } + + function out1($lines) + { + if ($lines) { + $this->_append($this->final1, $lines); + } + } + + function out2($lines) + { + if ($lines) { + $this->_append($this->final2, $lines); + } + } + + function isEmpty() + { + return !$this->orig && !$this->final1 && !$this->final2; + } + + function finish() + { + if ($this->isEmpty()) { + return false; + } else { + $edit = new Text_Diff_ThreeWay_Op($this->orig, $this->final1, $this->final2); + $this->_init(); + return $edit; + } + } + + function _init() + { + $this->orig = $this->final1 = $this->final2 = array(); + } + + function _append(&$array, $lines) + { + array_splice($array, sizeof($array), 0, $lines); + } + +} diff --git a/vendor/pyrus/php/Text/Diff3.php b/vendor/pyrus/php/Text/Diff3.php new file mode 100644 index 00000000..e9aea9f8 --- /dev/null +++ b/vendor/pyrus/php/Text/Diff3.php @@ -0,0 +1,276 @@ +<?php +/** + * A class for computing three way diffs. + * + * $Horde: framework/Text_Diff/Diff3.php,v 1.2.10.7 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. + * + * @package Text_Diff + * @since 0.3.0 + */ + +/** Text_Diff */ +require_once 'Text/Diff.php'; + +/** + * A class for computing three way diffs. + * + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + */ +class Text_Diff3 extends Text_Diff { + + /** + * Conflict counter. + * + * @var integer + */ + var $_conflictingBlocks = 0; + + /** + * Computes diff between 3 sequences of strings. + * + * @param array $orig The original lines to use. + * @param array $final1 The first version to compare to. + * @param array $final2 The second version to compare to. + */ + function Text_Diff3($orig, $final1, $final2) + { + if (extension_loaded('xdiff')) { + $engine = new Text_Diff_Engine_xdiff(); + } else { + $engine = new Text_Diff_Engine_native(); + } + + $this->_edits = $this->_diff3($engine->diff($orig, $final1), + $engine->diff($orig, $final2)); + } + + /** + */ + function mergedOutput($label1 = false, $label2 = false) + { + $lines = array(); + foreach ($this->_edits as $edit) { + if ($edit->isConflict()) { + /* FIXME: this should probably be moved somewhere else. */ + $lines = array_merge($lines, + array('<<<<<<<' . ($label1 ? ' ' . $label1 : '')), + $edit->final1, + array("======="), + $edit->final2, + array('>>>>>>>' . ($label2 ? ' ' . $label2 : ''))); + $this->_conflictingBlocks++; + } else { + $lines = array_merge($lines, $edit->merged()); + } + } + + return $lines; + } + + /** + * @access private + */ + function _diff3($edits1, $edits2) + { + $edits = array(); + $bb = new Text_Diff3_BlockBuilder(); + + $e1 = current($edits1); + $e2 = current($edits2); + while ($e1 || $e2) { + if ($e1 && $e2 && is_a($e1, 'Text_Diff_Op_copy') && is_a($e2, 'Text_Diff_Op_copy')) { + /* We have copy blocks from both diffs. This is the (only) + * time we want to emit a diff3 copy block. Flush current + * diff3 diff block, if any. */ + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + $ncopy = min($e1->norig(), $e2->norig()); + assert($ncopy > 0); + $edits[] = new Text_Diff3_Op_copy(array_slice($e1->orig, 0, $ncopy)); + + if ($e1->norig() > $ncopy) { + array_splice($e1->orig, 0, $ncopy); + array_splice($e1->final, 0, $ncopy); + } else { + $e1 = next($edits1); + } + + if ($e2->norig() > $ncopy) { + array_splice($e2->orig, 0, $ncopy); + array_splice($e2->final, 0, $ncopy); + } else { + $e2 = next($edits2); + } + } else { + if ($e1 && $e2) { + if ($e1->orig && $e2->orig) { + $norig = min($e1->norig(), $e2->norig()); + $orig = array_splice($e1->orig, 0, $norig); + array_splice($e2->orig, 0, $norig); + $bb->input($orig); + } + + if (is_a($e1, 'Text_Diff_Op_copy')) { + $bb->out1(array_splice($e1->final, 0, $norig)); + } + + if (is_a($e2, 'Text_Diff_Op_copy')) { + $bb->out2(array_splice($e2->final, 0, $norig)); + } + } + + if ($e1 && ! $e1->orig) { + $bb->out1($e1->final); + $e1 = next($edits1); + } + if ($e2 && ! $e2->orig) { + $bb->out2($e2->final); + $e2 = next($edits2); + } + } + } + + if ($edit = $bb->finish()) { + $edits[] = $edit; + } + + return $edits; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff3_Op { + + function Text_Diff3_Op($orig = false, $final1 = false, $final2 = false) + { + $this->orig = $orig ? $orig : array(); + $this->final1 = $final1 ? $final1 : array(); + $this->final2 = $final2 ? $final2 : array(); + } + + function merged() + { + if (!isset($this->_merged)) { + if ($this->final1 === $this->final2) { + $this->_merged = &$this->final1; + } elseif ($this->final1 === $this->orig) { + $this->_merged = &$this->final2; + } elseif ($this->final2 === $this->orig) { + $this->_merged = &$this->final1; + } else { + $this->_merged = false; + } + } + + return $this->_merged; + } + + function isConflict() + { + return $this->merged() === false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff3_Op_copy extends Text_Diff3_Op { + + function Text_Diff3_Op_Copy($lines = false) + { + $this->orig = $lines ? $lines : array(); + $this->final1 = &$this->orig; + $this->final2 = &$this->orig; + } + + function merged() + { + return $this->orig; + } + + function isConflict() + { + return false; + } + +} + +/** + * @package Text_Diff + * @author Geoffrey T. Dairiki <dairiki@dairiki.org> + * + * @access private + */ +class Text_Diff3_BlockBuilder { + + function Text_Diff3_BlockBuilder() + { + $this->_init(); + } + + function input($lines) + { + if ($lines) { + $this->_append($this->orig, $lines); + } + } + + function out1($lines) + { + if ($lines) { + $this->_append($this->final1, $lines); + } + } + + function out2($lines) + { + if ($lines) { + $this->_append($this->final2, $lines); + } + } + + function isEmpty() + { + return !$this->orig && !$this->final1 && !$this->final2; + } + + function finish() + { + if ($this->isEmpty()) { + return false; + } else { + $edit = new Text_Diff3_Op($this->orig, $this->final1, $this->final2); + $this->_init(); + return $edit; + } + } + + function _init() + { + $this->orig = $this->final1 = $this->final2 = array(); + } + + function _append(&$array, $lines) + { + array_splice($array, sizeof($array), 0, $lines); + } + +} diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/1.txt b/vendor/pyrus/tests/Text_Diff/Text/tests/1.txt new file mode 100644 index 00000000..976c4475 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/1.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 1.txt +This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/2.txt b/vendor/pyrus/tests/Text_Diff/Text/tests/2.txt new file mode 100644 index 00000000..6fa8051d --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/2.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 2.txt +This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/3.txt b/vendor/pyrus/tests/Text_Diff/Text/tests/3.txt new file mode 100644 index 00000000..0c26fe98 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/3.txt @@ -0,0 +1,4 @@ +This line is the same. +This line is different in 1.txt +This line is the same. +This line is new in 3.txt diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/4.txt b/vendor/pyrus/tests/Text_Diff/Text/tests/4.txt new file mode 100644 index 00000000..7cbc69d9 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/4.txt @@ -0,0 +1,3 @@ +This line is the same. +This line is different in 4.txt +This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/5.txt b/vendor/pyrus/tests/Text_Diff/Text/tests/5.txt new file mode 100644 index 00000000..d48db221 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/5.txt @@ -0,0 +1,5 @@ +This is a test. +Adding random text to simulate files. +Various Content. +More Content. +Testing diff and renderer. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/6.txt b/vendor/pyrus/tests/Text_Diff/Text/tests/6.txt new file mode 100644 index 00000000..5b421cd3 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/6.txt @@ -0,0 +1,7 @@ +This is a test. +Adding random text to simulate files. +Inserting a line. +Various Content. +Replacing content. +Testing similarities and renderer. +Append content. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/context.patch b/vendor/pyrus/tests/Text_Diff/Text/tests/context.patch new file mode 100644 index 00000000..2a4fad92 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/context.patch @@ -0,0 +1,11 @@ +*** 1.txt 2005-03-21 13:37:59.000000000 +0100 +--- 2.txt 2005-03-21 13:38:00.000000000 +0100 +*************** +*** 1,3 **** + This line is the same. +! This line is different in 1.txt + This line is the same. +--- 1,3 ---- + This line is the same. +! This line is different in 2.txt + This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/context.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/context.phpt new file mode 100644 index 00000000..5891ea40 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/context.phpt @@ -0,0 +1,25 @@ +--TEST-- +Text_Diff: Context renderer +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/context.php'; + +$lines1 = file(dirname(__FILE__) . '/1.txt'); +$lines2 = file(dirname(__FILE__) . '/2.txt'); + +$diff = new Text_Diff('native', array($lines1, $lines2)); + +$renderer = new Text_Diff_Renderer_context(); +echo $renderer->render($diff); +?> +--EXPECT-- +*************** +*** 1,3 **** + This line is the same. +! This line is different in 1.txt + This line is the same. +--- 1,3 ---- + This line is the same. +! This line is different in 2.txt + This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/context2.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/context2.phpt new file mode 100644 index 00000000..6d8f2485 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/context2.phpt @@ -0,0 +1,31 @@ +--TEST-- +Text_Diff: Context renderer 2 +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/context.php'; + +$lines1 = file(dirname(__FILE__) . '/5.txt'); +$lines2 = file(dirname(__FILE__) . '/6.txt'); + +$diff = new Text_Diff('native', array($lines1, $lines2)); + +$renderer = new Text_Diff_Renderer_context(); +echo $renderer->render($diff); +?> +--EXPECT-- +*************** +*** 1,5 **** + This is a test. + Adding random text to simulate files. + Various Content. +! More Content. +! Testing diff and renderer. +--- 1,7 ---- + This is a test. + Adding random text to simulate files. ++ Inserting a line. + Various Content. +! Replacing content. +! Testing similarities and renderer. +! Append content. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/diff.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/diff.phpt new file mode 100644 index 00000000..add291f1 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/diff.phpt @@ -0,0 +1,62 @@ +--TEST-- +Text_Diff: Basic diff operation +--FILE-- +<?php +include_once 'Text/Diff.php'; + +$lines1 = file(dirname(__FILE__) . '/1.txt'); +$lines2 = file(dirname(__FILE__) . '/2.txt'); + +$diff = new Text_Diff('native', array($lines1, $lines2)); +echo strtolower(print_r($diff, true)); +?> +--EXPECT-- +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + [1] => text_diff_op_change object + ( + [orig] => array + ( + [0] => this line is different in 1.txt + ) + + [final] => array + ( + [0] => this line is different in 2.txt + ) + + ) + + [2] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + ) + +) diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/inline.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/inline.phpt new file mode 100644 index 00000000..b3d1ba77 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/inline.phpt @@ -0,0 +1,19 @@ +--TEST-- +Text_Diff: Inline renderer +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/inline.php'; + +$lines1 = file(dirname(__FILE__) . '/1.txt'); +$lines2 = file(dirname(__FILE__) . '/2.txt'); + +$diff = new Text_Diff('native', array($lines1, $lines2)); + +$renderer = new Text_Diff_Renderer_inline(); +echo $renderer->render($diff); +?> +--EXPECT-- +This line is the same. +This line is different in <del>1.txt</del><ins>2.txt</ins> +This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/inline2.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/inline2.phpt new file mode 100644 index 00000000..153a39f0 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/inline2.phpt @@ -0,0 +1,37 @@ +--TEST-- +Text_Diff: Inline renderer 2 +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/inline.php'; + +$lines1 = array( + "This is a test.\n", + "Adding random text to simulate files.\n", + "Various Content.\n", + "More Content.\n", + "Testing diff and renderer.\n" +); +$lines2 = array( + "This is a test.\n", + "Adding random text to simulate files.\n", + "Inserting a line.\n", + "Various Content.\n", + "Replacing content.\n", + "Testing similarities and renderer.\n", + "Append content.\n" +); + +$diff = new Text_Diff('native', array($lines1, $lines2)); + +$renderer = new Text_Diff_Renderer_inline(); +echo $renderer->render($diff); +?> +--EXPECT-- +This is a test. +Adding random text to simulate files. +<ins>Inserting a line.</ins> +Various Content. +<del>More Content.</del><ins>Replacing content.</ins> +Testing <del>diff</del><ins>similarities</ins> and renderer.<ins> +Append content.</ins> diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug12740.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug12740.phpt new file mode 100644 index 00000000..56b4ced1 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug12740.phpt @@ -0,0 +1,30 @@ +--TEST-- +Text_Diff: PEAR Bug #12740 (failed assertion) +--FILE-- +<?php + +require dirname(__FILE__) . '/../Diff.php'; +require dirname(__FILE__) . '/../Diff/Renderer/inline.php'; + +$a = <<<QQ +<li>The tax credit amounts to 30% of the cost of the system, with a +maximum of 2,000. This credit is separate from the 500 home improvement +credit.</li> +<h3>Fuel Cells<a +href="12341234213421341234123412341234123421341234213412342134213423" +class="anchor" title="Link to this section"><br /> +<li>Your fuel 123456789</li> +QQ; + +$b = <<<QQ +<li> of gas emissions by 2050</li> +<li>Raise car fuel economy to 50 mpg by 2017</li> +<li>Increase access to mass transit systems</li> +QQ; + +$diff = new Text_Diff('native', array(explode("\n", $b), explode("\n", $a))); +$renderer = new Text_Diff_Renderer_inline(); +$renderer->render($diff); + +?> +--EXPECT-- diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug4879.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug4879.phpt new file mode 100644 index 00000000..5bb657b6 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug4879.phpt @@ -0,0 +1,30 @@ +--TEST-- +Text_Diff: PEAR Bug #4879 (inline renderer hangs on numbers in input string) +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/inline.php'; + +$oldtext = <<<EOT +Common text +Bob had 1 apple, Alice had 2. +Bon appetit! +EOT; + +$newtext = <<< EOT +Common text +Bob had 10 apples, Alice had 1. +Bon appetit! +EOT; + +$oldpieces = explode ("\n", $oldtext); +$newpieces = explode ("\n", $newtext); +$diff = new Text_Diff('native', array($oldpieces, $newpieces)); + +$renderer = new Text_Diff_Renderer_inline(); +echo $renderer->render($diff); +?> +--EXPECT-- +Common text +Bob had <del>1 apple,</del><ins>10 apples,</ins> Alice had <del>2.</del><ins>1.</ins> +Bon appetit! diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6251.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6251.phpt new file mode 100644 index 00000000..86af082c --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6251.phpt @@ -0,0 +1,45 @@ +--TEST-- +Text_Diff: PEAR Bug #6251 (too much trailing context) +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/unified.php'; + +$oldtext = <<<EOT + +Original Text + + + +ss +ttt +EOT; + +$newtext = <<< EOT + +Modified Text + + + +ss +ttt +EOT; + +$oldpieces = explode ("\n", $oldtext); +$newpieces = explode ("\n", $newtext); +$diff = new Text_Diff('native', array($oldpieces, $newpieces)); + +$renderer = new Text_Diff_Renderer_unified(array('leading_context_lines' => 3, 'trailing_context_lines' => 3)); + +// We need to use var_dump, as the test runner strips trailing empty lines. +var_dump($renderer->render($diff)); +?> +--EXPECT-- +string(54) "@@ -1,5 +1,5 @@ + +-Original Text ++Modified Text + + + +" diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6428.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6428.phpt new file mode 100644 index 00000000..9d5b982a --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/pear_bug6428.phpt @@ -0,0 +1,18 @@ +--TEST-- +Text_Diff: PEAR Bug #6428 (problem with single digits after space) +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/inline.php'; + +$from = array('Line 1', 'Another line'); +$to = array('Line 1', 'Another line'); + +$diff = new Text_Diff('native', array($from, $to)); +$renderer = new Text_Diff_Renderer_inline(); + +echo $renderer->render($diff); +?> +--EXPECT-- +Line <del>1</del><ins> 1</ins> +Another line diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/string.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/string.phpt new file mode 100644 index 00000000..90011989 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/string.phpt @@ -0,0 +1,145 @@ +--TEST-- +Text_Diff: Text_Diff_Engine_string test. +--FILE-- +<?php + +require_once 'PEAR.php'; +require_once 'Text/Diff.php'; + +$unified = file_get_contents(dirname(__FILE__) . '/unified.patch'); +$diff_u = new Text_Diff('string', array($unified)); +echo strtolower(print_r($diff_u, true)); + +$unified2 = file_get_contents(dirname(__FILE__) . '/unified2.patch'); +$diff_u2 = new Text_Diff('string', array($unified2)); +var_export(is_a($diff_u2->getDiff(), 'PEAR_Error')); +echo "\n"; +$diff_u2 = new Text_Diff('string', array($unified2, 'unified')); +echo strtolower(print_r($diff_u2, true)); + +$context = file_get_contents(dirname(__FILE__) . '/context.patch'); +$diff_c = new Text_Diff('string', array($context)); +echo strtolower(print_r($diff_c, true)); + +?> +--EXPECT-- +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + [1] => text_diff_op_change object + ( + [orig] => array + ( + [0] => this line is different in 1.txt + ) + + [final] => array + ( + [0] => this line is different in 2.txt + ) + + ) + + [2] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + ) + +) +true +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_change object + ( + [orig] => array + ( + [0] => for the first time in u.s. history number of private contractors and troops are equal + ) + + [final] => array + ( + [0] => number of private contractors and troops are equal for first time in u.s. history + ) + + ) + + ) + +) +text_diff object +( + [_edits] => array + ( + [0] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + [1] => text_diff_op_change object + ( + [orig] => array + ( + [0] => this line is different in 1.txt + ) + + [final] => array + ( + [0] => this line is different in 2.txt + ) + + ) + + [2] => text_diff_op_copy object + ( + [orig] => array + ( + [0] => this line is the same. + ) + + [final] => array + ( + [0] => this line is the same. + ) + + ) + + ) + +) diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/unified.patch b/vendor/pyrus/tests/Text_Diff/Text/tests/unified.patch new file mode 100644 index 00000000..b2b3f258 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/unified.patch @@ -0,0 +1,7 @@ +--- 1.txt 2005-03-21 13:37:59.000000000 +0100 ++++ 2.txt 2005-03-21 13:38:00.000000000 +0100 +@@ -1,3 +1,3 @@ + This line is the same. +-This line is different in 1.txt ++This line is different in 2.txt + This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/unified.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/unified.phpt new file mode 100644 index 00000000..4c279ddd --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/unified.phpt @@ -0,0 +1,21 @@ +--TEST-- +Text_Diff: Unified renderer +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/unified.php'; + +$lines1 = file(dirname(__FILE__) . '/1.txt'); +$lines2 = file(dirname(__FILE__) . '/2.txt'); + +$diff = new Text_Diff('native', array($lines1, $lines2)); + +$renderer = new Text_Diff_Renderer_unified(); +echo $renderer->render($diff); +?> +--EXPECT-- +@@ -1,3 +1,3 @@ + This line is the same. +-This line is different in 1.txt ++This line is different in 2.txt + This line is the same. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/unified2.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/unified2.phpt new file mode 100644 index 00000000..303b3290 --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/unified2.phpt @@ -0,0 +1,26 @@ +--TEST-- +Text_Diff: Unified renderer 2 +--FILE-- +<?php +include_once 'Text/Diff.php'; +include_once 'Text/Diff/Renderer/unified.php'; + +$lines1 = file(dirname(__FILE__) . '/5.txt'); +$lines2 = file(dirname(__FILE__) . '/6.txt'); + +$diff = new Text_Diff('native', array($lines1, $lines2)); + +$renderer = new Text_Diff_Renderer_unified(); +echo $renderer->render($diff); +?> +--EXPECT-- +@@ -1,5 +1,7 @@ + This is a test. + Adding random text to simulate files. ++Inserting a line. + Various Content. +-More Content. +-Testing diff and renderer. ++Replacing content. ++Testing similarities and renderer. ++Append content. diff --git a/vendor/pyrus/tests/Text_Diff/Text/tests/xdiff.phpt b/vendor/pyrus/tests/Text_Diff/Text/tests/xdiff.phpt new file mode 100644 index 00000000..0be5379c --- /dev/null +++ b/vendor/pyrus/tests/Text_Diff/Text/tests/xdiff.phpt @@ -0,0 +1,24 @@ +--TEST-- +Text_Diff: Text_Diff_Engine_xdiff test. +--SKIPIF-- +<?php if (!extension_loaded('xdiff')) echo 'skip xdiff extension not installed'; ?> +--FILE-- +<?php + +require_once 'PEAR.php'; +require_once 'Text/Diff.php'; +require_once 'Text/Diff/Renderer/unified.php'; + +$lines1 = file(dirname(__FILE__) . '/1.txt'); +$lines2 = file(dirname(__FILE__) . '/2.txt'); +$diff = new Text_Diff('xdiff', array($lines1, $lines2)); +$renderer = new Text_Diff_Renderer_unified(); +echo $renderer->render($diff); + +?> +--EXPECT-- +@@ -1,3 +1,3 @@ + This line is the same. +-This line is different in 1.txt ++This line is different in 2.txt + This line is the same. -- GitLab