Add support for monotone's diff header

master
Thomas Keller 2010-05-01 00:56:48 +02:00
parent c49a8204e0
commit 15a2bd90b3
1 changed files with 21 additions and 7 deletions

View File

@ -51,7 +51,7 @@ class IDF_Diff
$i = 0; // Used to skip the end of a git patch with --\nversion number
foreach ($this->lines as $line) {
$i++;
if (0 === strpos($line, '--') and isset($this->lines[$i])
if (0 === strpos($line, '--') and isset($this->lines[$i])
and preg_match('/^\d+\.\d+\.\d+\.\d+$/', $this->lines[$i])) {
break;
}
@ -71,6 +71,14 @@ class IDF_Diff
$current_chunk = 0;
$indiff = true;
continue;
} else if (0 === strpos($line, '=========')) {
$current_file = self::getMtnFile($this->lines[$i+1]);
$files[$current_file] = array();
$files[$current_file]['chunks'] = array();
$files[$current_file]['chunks_def'] = array();
$current_chunk = 0;
$indiff = true;
continue;
} else if (0 === strpos($line, 'Index: ')) {
$current_file = self::getSvnFile($line);
$files[$current_file] = array();
@ -133,6 +141,12 @@ class IDF_Diff
return substr(trim($line), 7);
}
public static function getMtnFile($line)
{
preg_match("/^[+-]{3} ([^\t]+)/", $line, $m);
return $m[1];
}
/**
* Return the html version of a parsed diff.
*/
@ -215,14 +229,14 @@ class IDF_Diff
* @param int Number of lines before/after the chunk to be displayed (10)
* @return Pluf_Template_SafeString The table body
*/
public function fileCompare($orig, $chunks, $filename, $context=10)
public function fileCompare($orig, $chunks, $filename, $context=10)
{
$orig_lines = preg_split("/\015\012|\015|\012/", $orig);
$new_chunks = $this->mergeChunks($orig_lines, $chunks, $context);
return $this->renderCompared($new_chunks, $filename);
}
public function mergeChunks($orig_lines, $chunks, $context=10)
public function mergeChunks($orig_lines, $chunks, $context=10)
{
$spans = array();
$new_chunks = array();
@ -250,7 +264,7 @@ class IDF_Diff
for ($lc=$spans[$i][0];$lc<$chunk[0][0];$lc++) {
$exists = false;
foreach ($chunk_lines as $line) {
if ($lc == $line[0]
if ($lc == $line[0]
or ($chunk[0][1]-$chunk[0][0]+$lc) == $line[1]) {
$exists = true;
break;
@ -259,7 +273,7 @@ class IDF_Diff
if (!$exists) {
$orig = isset($orig_lines[$lc-1]) ? $orig_lines[$lc-1] : '';
$n_chunk[] = array(
$lc,
$lc,
$chunk[0][1]-$chunk[0][0]+$lc,
$orig
);
@ -283,7 +297,7 @@ class IDF_Diff
}
if (!$exists) {
$n_chunk[] = array(
$lc,
$lc,
$lline[1]-$lline[0]+$lc,
$orig_lines[$lc-1]
);
@ -305,7 +319,7 @@ class IDF_Diff
foreach ($chunk as $line) {
if ($line[0] > $lline[0] or empty($line[0])) {
$nnew_chunks[$i-1][] = $line;
}
}
}
} else {
$nnew_chunks[] = $chunk;