Fix hunk handling for 'default hunk header values'.

Add new test cases to verify it properly handles "-1 +1, 2" and "-1 +1" for
short files.

R=petermayo@chromium.org
BUG=


Review URL: https://chromiumcodereview.appspot.com/10894036

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@153906 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/patch.py b/patch.py
index 90886e9..b8325da 100644
--- a/patch.py
+++ b/patch.py
@@ -135,6 +135,11 @@
     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 @@
         # "-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 @@
             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)