Fixed issue 129, code review crashes on git diff files.
The diff parser tries now to skip the header and possible footer.
This commit is contained in:
parent
269f1db816
commit
d594b3412a
@ -47,13 +47,21 @@ class IDF_Diff
|
|||||||
$lline = 0;
|
$lline = 0;
|
||||||
$rline = 0;
|
$rline = 0;
|
||||||
$files = array();
|
$files = array();
|
||||||
|
$indiff = false; // Used to skip the headers in the git patches
|
||||||
|
$i = 0; // Used to skip the end of a git patch with --\nversion number
|
||||||
foreach ($this->lines as $line) {
|
foreach ($this->lines as $line) {
|
||||||
|
$i++;
|
||||||
|
if (0 === strpos($line, '--') and isset($this->lines[$i])
|
||||||
|
and preg_match('/^\d+\.\d+\.\d+\.\d+$/', $this->lines[$i])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (0 === strpos($line, 'diff --git a')) {
|
if (0 === strpos($line, 'diff --git a')) {
|
||||||
$current_file = self::getFile($line);
|
$current_file = self::getFile($line);
|
||||||
$files[$current_file] = array();
|
$files[$current_file] = array();
|
||||||
$files[$current_file]['chunks'] = array();
|
$files[$current_file]['chunks'] = array();
|
||||||
$files[$current_file]['chunks_def'] = array();
|
$files[$current_file]['chunks_def'] = array();
|
||||||
$current_chunk = 0;
|
$current_chunk = 0;
|
||||||
|
$indiff = true;
|
||||||
continue;
|
continue;
|
||||||
} else if (preg_match('#^diff -r [^\s]+ -r [^\s]+ (.+)$#', $line, $matches)) {
|
} else if (preg_match('#^diff -r [^\s]+ -r [^\s]+ (.+)$#', $line, $matches)) {
|
||||||
$current_file = $matches[1];
|
$current_file = $matches[1];
|
||||||
@ -61,6 +69,7 @@ class IDF_Diff
|
|||||||
$files[$current_file]['chunks'] = array();
|
$files[$current_file]['chunks'] = array();
|
||||||
$files[$current_file]['chunks_def'] = array();
|
$files[$current_file]['chunks_def'] = array();
|
||||||
$current_chunk = 0;
|
$current_chunk = 0;
|
||||||
|
$indiff = true;
|
||||||
continue;
|
continue;
|
||||||
} else if (0 === strpos($line, 'Index: ')) {
|
} else if (0 === strpos($line, 'Index: ')) {
|
||||||
$current_file = self::getSvnFile($line);
|
$current_file = self::getSvnFile($line);
|
||||||
@ -68,6 +77,10 @@ class IDF_Diff
|
|||||||
$files[$current_file]['chunks'] = array();
|
$files[$current_file]['chunks'] = array();
|
||||||
$files[$current_file]['chunks_def'] = array();
|
$files[$current_file]['chunks_def'] = array();
|
||||||
$current_chunk = 0;
|
$current_chunk = 0;
|
||||||
|
$indiff = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!$indiff) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (0 === strpos($line, '@@ ')) {
|
if (0 === strpos($line, '@@ ')) {
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
From ec6cb8b19ee3a08f48625181d6a74744b3950e90 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Manuel Eidenberger <eidenberger@...>
|
||||||
|
Date: Mon, 2 Feb 2009 15:11:23 +0100
|
||||||
|
Subject: [PATCH] Some configuration variables have been added in order to manually set svn and svnlook binarie paths (see issue 123)
|
||||||
|
|
||||||
|
---
|
||||||
|
src/IDF/Scm/Svn.php | 24 ++++++++++++------------
|
||||||
|
src/IDF/conf/idf.php-dist | 8 ++++++++
|
||||||
|
2 files changed, 20 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/IDF/Scm/Svn.php b/src/IDF/Scm/Svn.php
|
||||||
|
index e2f7a61..e1359c7 100644
|
||||||
|
--- a/src/IDF/Scm/Svn.php
|
||||||
|
+++ b/src/IDF/Scm/Svn.php
|
||||||
|
@@ -108,7 +108,7 @@ class IDF_Scm_Svn
|
||||||
|
}
|
||||||
|
|
||||||
|
// Else, test the path on revision
|
||||||
|
- $cmd = sprintf('svn info --xml --username=%s --password=%s %s@%s',
|
||||||
|
+ $cmd = sprintf(Pluf::f('svn_path').' info --xml --username=%s --password=%s %s@%s',
|
||||||
|
escapeshellarg($this->username),
|
||||||
|
escapeshellarg($this->password),
|
||||||
|
escapeshellarg($this->repo.'/'.$path),
|
||||||
|
@@ -190,7 +190,7 @@ class IDF_Scm_Svn
|
||||||
|
*/
|
||||||
|
private function getCommitMessage($file, $rev='HEAD')
|
||||||
|
{
|
||||||
|
- $cmd = sprintf('svn log --xml --limit 1 --username=%s --password=%s %s@%s',
|
||||||
|
+ $cmd = sprintf(Pluf::f('svn_path').' log --xml --limit 1 --username=%s --password=%s %s@%s',
|
||||||
|
escapeshellarg($this->username),
|
||||||
|
escapeshellarg($this->password),
|
||||||
|
escapeshellarg($file),
|
||||||
|
diff --git a/src/IDF/conf/idf.php-dist b/src/IDF/conf/idf.php-dist
|
||||||
|
index 8aca31f..abb4ecd 100644
|
||||||
|
--- a/src/IDF/conf/idf.php-dist
|
||||||
|
+++ b/src/IDF/conf/idf.php-dist
|
||||||
|
@@ -208,4 +208,12 @@ $cfg['allowed_scm'] = array('git' => 'IDF_Scm_Git',
|
||||||
|
# variables not being set correctly. Note the trailing space.
|
||||||
|
# $cfg['idf_exec_cmd_prefix'] = '/usr/bin/env -i ';
|
||||||
|
|
||||||
|
+# Path to svn and svnlook binaries. In some cases, it is sometimes
|
||||||
|
+# necessary to define absolut path to these two binaries, for example:
|
||||||
|
+# $cfg['svn_path'] = 'svn';
|
||||||
|
+# $cfg['svnlook_path'] = 'svnlook_path';
|
||||||
|
+# This is only necessary if svn and svnlook binaries are not set in $PATH
|
||||||
|
+$cfg['svn_path'] = 'svn';
|
||||||
|
+$cfg['svnlook_path'] = 'svnlook';
|
||||||
|
+
|
||||||
|
return $cfg;
|
||||||
|
--
|
||||||
|
1.5.4.3
|
||||||
|
|
@ -69,6 +69,14 @@ class IDF_Tests_TestDiff extends UnitTestCase
|
|||||||
$lline = end($lchunk);
|
$lline = end($lchunk);
|
||||||
$this->assertEqual(array('', '166', '{/if}{/block}'),
|
$this->assertEqual(array('', '166', '{/if}{/block}'),
|
||||||
$lline);
|
$lline);
|
||||||
//print_r($diff->mergeChunks($orig_lines, $def, 10));
|
}
|
||||||
|
|
||||||
|
public function testDiffWithHeaders()
|
||||||
|
{
|
||||||
|
$diff_content = file_get_contents(dirname(__FILE__).'/0001-Some-configuration-variables-have-been-added-in-orde.patch');
|
||||||
|
$diff = new IDF_Diff($diff_content);
|
||||||
|
$diff->parse();
|
||||||
|
$this->assertEqual(2, count($diff->files));
|
||||||
|
$this->assertEqual(12, count($diff->files['src/IDF/conf/idf.php-dist']['chunks'][0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user