| Index: patch.py
|
| diff --git a/patch.py b/patch.py
|
| index 90886e9a0fc23ae142e1f524ecee7f18f83d39fe..b8325da482a841742658e7ec5ab8e985be3ed79f 100644
|
| --- a/patch.py
|
| +++ b/patch.py
|
| @@ -135,6 +135,11 @@ class Hunk(object):
|
| self.variation = self.lines_dst - self.lines_src
|
| self.text = []
|
|
|
| + def __repr__(self):
|
| + return '%s<(%d, %d) to (%d, %d)>' % (
|
| + self.__class__.__name__,
|
| + self.start_src, self.lines_src, self.start_dst, self.lines_dst)
|
| +
|
|
|
| class FilePatchDiff(FilePatchBase):
|
| """Patch for a single file."""
|
| @@ -235,18 +240,26 @@ class FilePatchDiff(FilePatchBase):
|
| # "-1,N +0,0" where N is the number of lines deleted. That's from diff
|
| # and svn diff. git diff doesn't exhibit this behavior.
|
| # svn diff for a single line file rewrite "@@ -1 +1 @@". Fun.
|
| + # "@@ -1 +1,N @@" is also valid where N is the length of the new file.
|
| if not match:
|
| self._fail('Hunk header is unparsable')
|
| - if ',' in match.group(1):
|
| + count = match.group(1).count(',')
|
| + if not count:
|
| + start_src = int(match.group(1))
|
| + lines_src = 1
|
| + elif count == 1:
|
| start_src, lines_src = map(int, match.group(1).split(',', 1))
|
| else:
|
| - start_src = int(match.group(1))
|
| - lines_src = 0
|
| - if ',' in match.group(2):
|
| + self._fail('Hunk header is malformed')
|
| +
|
| + count = match.group(2).count(',')
|
| + if not count:
|
| + start_dst = int(match.group(2))
|
| + lines_dst = 1
|
| + elif count == 1:
|
| start_dst, lines_dst = map(int, match.group(2).split(',', 1))
|
| else:
|
| - start_dst = int(match.group(2))
|
| - lines_dst = 0
|
| + self._fail('Hunk header is malformed')
|
| new_hunk = Hunk(start_src, lines_src, start_dst, lines_dst)
|
| if hunks:
|
| if new_hunk.start_src <= hunks[-1].start_src:
|
| @@ -273,8 +286,8 @@ class FilePatchDiff(FilePatchBase):
|
| len([1 for i in hunk.text if i.startswith('-')]))
|
| if variation != hunk.variation:
|
| self._fail(
|
| - 'Hunk header is incorrect: %d vs %d' % (
|
| - variation, hunk.variation))
|
| + 'Hunk header is incorrect: %d vs %d; %r' % (
|
| + variation, hunk.variation, hunk))
|
| if not hunk.start_src:
|
| self._fail(
|
| 'Hunk header start line is incorrect: %d' % hunk.start_src)
|
|
|