diff options
author | Russell Belfer <rb@github.com> | 2013-01-11 11:20:44 -0800 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2013-01-11 11:20:44 -0800 |
commit | 805c476c83d100696b9ebe578f0ee2399d55b3c8 (patch) | |
tree | 0c675452d35f476e96d0cb6426de7c68ed45f1cd /src/diff_output.c | |
parent | d0b14cea0e1ff09af83a801c1a9cf1a431d46d0c (diff) | |
download | libgit2-805c476c83d100696b9ebe578f0ee2399d55b3c8.tar.gz |
Fix diff patch line number calculation
This was just wrong. Added a test that verifying patch line
numbers even for hunks further into a file and then fixed the
algorithm. I needed to add a little extra state into the patch
so that I could track old and new file numbers independently,
but it should be okay.
Diffstat (limited to 'src/diff_output.c')
-rw-r--r-- | src/diff_output.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/src/diff_output.c b/src/diff_output.c index f98665dfb..d75a7bb94 100644 --- a/src/diff_output.c +++ b/src/diff_output.c @@ -821,6 +821,9 @@ static int diff_patch_hunk_cb( hunk->line_start = patch->lines_size; hunk->line_count = 0; + patch->oldno = range->old_start; + patch->newno = range->new_start; + return 0; } @@ -879,24 +882,23 @@ static int diff_patch_line_cb( ++line->lines; } - if (!last) { - line->oldno = hunk->range.old_start; - line->newno = hunk->range.new_start; - } else { - switch (last->origin) { - case GIT_DIFF_LINE_ADDITION: - line->oldno = last->oldno; - line->newno = last->newno + last->lines; - break; - case GIT_DIFF_LINE_DELETION: - line->oldno = last->oldno + last->lines; - line->newno = last->newno; - break; - default: - line->oldno = last->oldno + last->lines; - line->newno = last->newno + last->lines; - break; - } + switch (line_origin) { + case GIT_DIFF_LINE_ADDITION: + line->oldno = -1; + line->newno = patch->newno; + patch->newno += line->lines; + break; + case GIT_DIFF_LINE_DELETION: + line->oldno = patch->oldno; + line->newno = -1; + patch->oldno += line->lines; + break; + default: + line->oldno = patch->oldno; + line->newno = patch->newno; + patch->oldno += line->lines; + patch->newno += line->lines; + break; } hunk->line_count++; |