<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -23,7 +23,7 @@ namespace SharpDiff.Tests.Numstat
         [Test]
         public void ParsesAdditionsAndSubtractionValues()
         {
-            var result = Parse&lt;FileStats&gt;(&quot;3\t8\tanotherFile.txt&quot;, x =&gt; x.FileStats);
+            var result = Parse&lt;FileStats&gt;(&quot;3\t8\tanotherFile.txt\r\n&quot;, x =&gt; x.FileStats);
 
             Assert.That(result.Additions, Is.EqualTo(3));
             Assert.That(result.Subtractions, Is.EqualTo(8));
@@ -40,14 +40,35 @@ namespace SharpDiff.Tests.Numstat
         [Test]
         public void ParsesFullFileLine()
         {
-            var result = Parse&lt;FileStats&gt;(&quot;3\t8\tanotherFile.txt&quot;, x =&gt; x.FileStats);
+            var result = Parse&lt;FileStats&gt;(&quot;3\t8\tanotherFile.txt\r\n&quot;, x =&gt; x.FileStats);
 
             Assert.That(result.Filename, Is.EqualTo(&quot;anotherFile.txt&quot;));
         }
 
+        [Test]
+        public void CanParseMultipleLines()
+        {
+            var result = ParseList&lt;FileStats&gt;(
+                &quot;3\t8\tfile.txt\r\n&quot; +
+                &quot;5\t1\tanotherFile.txt\r\n&quot;, x =&gt; x.FullFile);
+
+            Assert.That(result.Count, Is.EqualTo(2));
+            Assert.That(result[0].Filename, Is.EqualTo(&quot;file.txt&quot;));
+            Assert.That(result[0].Additions, Is.EqualTo(3));
+            Assert.That(result[0].Subtractions, Is.EqualTo(8));
+            Assert.That(result[1].Filename, Is.EqualTo(&quot;anotherFile.txt&quot;));
+            Assert.That(result[1].Additions, Is.EqualTo(5));
+            Assert.That(result[1].Subtractions, Is.EqualTo(1));
+        }
+
         protected T Parse&lt;T&gt;(string text, Func&lt;GitNumstatParser, Rule&lt;char&gt;&gt; ruleFetcher)
         {
             return Grammars.ParseWith(text, ruleFetcher).As&lt;T&gt;();
         }
+
+        protected IList&lt;T&gt; ParseList&lt;T&gt;(string text, Func&lt;GitNumstatParser, Rule&lt;char&gt;&gt; ruleFetcher)
+        {
+            return new List&lt;T&gt;(Grammars.ParseWith(text, ruleFetcher).ToIEnumerable&lt;T&gt;());
+        }
     }
 }</diff>
      <filename>SharpDiff.Tests/Numstat/FileStatsTests.cs</filename>
    </modified>
    <modified>
      <diff>@@ -5,6 +5,37 @@ namespace SharpDiff.Parsers
 {
     public class GitNumstatParser : Parser
     {
+        public virtual bool FullFile(OMetaStream&lt;char&gt; inputStream, out OMetaList&lt;HostExpression&gt; result, out OMetaStream &lt;char&gt; modifiedStream)
+        {
+            OMetaList&lt;HostExpression&gt; files = null;
+            modifiedStream = inputStream;
+            if(!MetaRules.Apply(
+                delegate(OMetaStream&lt;char&gt; inputStream2, out OMetaList&lt;HostExpression&gt; result2, out OMetaStream &lt;char&gt; modifiedStream2)
+                {
+                    modifiedStream2 = inputStream2;
+                    if(!MetaRules.Many1(
+                        delegate(OMetaStream&lt;char&gt; inputStream3, out OMetaList&lt;HostExpression&gt; result3, out OMetaStream &lt;char&gt; modifiedStream3)
+                        {
+                            modifiedStream3 = inputStream3;
+                            if(!MetaRules.Apply(FileStats, modifiedStream3, out result3, out modifiedStream3))
+                            {
+                                return MetaRules.Fail(out result3, out modifiedStream3);
+                            }
+                            return MetaRules.Success();
+                        }
+                    , modifiedStream2, out result2, out modifiedStream2))
+                    {
+                        return MetaRules.Fail(out result2, out modifiedStream2);
+                    }
+                    files = result2;
+                    result2 = ( files ).AsHostExpressionList();
+                    return MetaRules.Success();
+                }, modifiedStream, out result, out modifiedStream))
+            {
+                return MetaRules.Fail(out result, out modifiedStream);
+            }
+            return MetaRules.Success();
+        }
         public virtual bool FileStats(OMetaStream&lt;char&gt; inputStream, out OMetaList&lt;HostExpression&gt; result, out OMetaStream &lt;char&gt; modifiedStream)
         {
             OMetaList&lt;HostExpression&gt; lines = null;
@@ -28,6 +59,10 @@ namespace SharpDiff.Parsers
                         return MetaRules.Fail(out result2, out modifiedStream2);
                     }
                     name = result2;
+                    if(!MetaRules.Apply(NewLine, modifiedStream2, out result2, out modifiedStream2))
+                    {
+                        return MetaRules.Fail(out result2, out modifiedStream2);
+                    }
                     result2 = ( new FileStats(lines[0].As&lt;int&gt;(), lines[1].As&lt;int&gt;(), name.As&lt;string&gt;()) ).AsHostExpressionList();
                     return MetaRules.Success();
                 }, modifiedStream, out result, out modifiedStream))
@@ -118,5 +153,27 @@ namespace SharpDiff.Parsers
             }
             return MetaRules.Success();
         }
+        public virtual bool NewLine(OMetaStream&lt;char&gt; inputStream, out OMetaList&lt;HostExpression&gt; result, out OMetaStream &lt;char&gt; modifiedStream)
+        {
+            modifiedStream = inputStream;
+            if(!MetaRules.Apply(
+                delegate(OMetaStream&lt;char&gt; inputStream2, out OMetaList&lt;HostExpression&gt; result2, out OMetaStream &lt;char&gt; modifiedStream2)
+                {
+                    modifiedStream2 = inputStream2;
+                    if(!MetaRules.ApplyWithArgs(Exactly, modifiedStream2, out result2, out modifiedStream2, (&quot;\r&quot;).AsHostExpressionList()))
+                    {
+                        return MetaRules.Fail(out result2, out modifiedStream2);
+                    }
+                    if(!MetaRules.ApplyWithArgs(Exactly, modifiedStream2, out result2, out modifiedStream2, (&quot;\n&quot;).AsHostExpressionList()))
+                    {
+                        return MetaRules.Fail(out result2, out modifiedStream2);
+                    }
+                    return MetaRules.Success();
+                }, modifiedStream, out result, out modifiedStream))
+            {
+                return MetaRules.Fail(out result, out modifiedStream);
+            }
+            return MetaRules.Success();
+        }
     }
 }</diff>
      <filename>SharpDiff/Parsers/GitNumstatParser.cs</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,9 @@ using SharpDiff.FileStructure.Numstat;
 using OMetaSharp;
 
 ometa SharpDiff.Parsers.GitNumstatParser : Parser {
-	FileStats = LineStats:lines '\t' Filename:name -&gt; { new FileStats(lines[0].As&lt;int&gt;(), lines[1].As&lt;int&gt;(), name.As&lt;string&gt;()) },
+	FullFile = FileStats+:files -&gt; { files },
+	FileStats = LineStats:lines '\t' Filename:name NewLine -&gt; { new FileStats(lines[0].As&lt;int&gt;(), lines[1].As&lt;int&gt;(), name.As&lt;string&gt;()) },
 	LineStats = Number:adds '\t' Number:subs -&gt; { adds, subs },
-	Filename = LetterOrDigit+:name '.' LetterOrDigit+:ext -&gt; { name.As&lt;string&gt;() + &quot;.&quot; + ext.As&lt;string&gt;() }
+	Filename = LetterOrDigit+:name '.' LetterOrDigit+:ext -&gt; { name.As&lt;string&gt;() + &quot;.&quot; + ext.As&lt;string&gt;() },
+	NewLine = '\r' '\n'
 }
\ No newline at end of file</diff>
      <filename>SharpDiff/Parsers/GitNumstatParser.ometacs</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>1aad918e4eb43b9714cc0438290dcdef6d31f218</id>
    </parent>
  </parents>
  <author>
    <name>James Gregory</name>
    <email>james@jagregory.com</email>
  </author>
  <url>http://github.com/jagregory/sharpdiff/commit/bb72d7d0f592f6dd86d75c438819d123949f2529</url>
  <id>bb72d7d0f592f6dd86d75c438819d123949f2529</id>
  <committed-date>2008-10-21T15:20:29-07:00</committed-date>
  <authored-date>2008-10-21T15:20:29-07:00</authored-date>
  <message>Added multiline numstat parsing</message>
  <tree>9fece5982ba9777cd10994aef0007ed3c1698e27</tree>
  <committer>
    <name>James Gregory</name>
    <email>james@jagregory.com</email>
  </committer>
</commit>
