summaryrefslogtreecommitdiff
path: root/src/diff_output.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-01-11 11:20:44 -0800
committerRussell Belfer <rb@github.com>2013-01-11 11:20:44 -0800
commit805c476c83d100696b9ebe578f0ee2399d55b3c8 (patch)
tree0c675452d35f476e96d0cb6426de7c68ed45f1cd /src/diff_output.c
parentd0b14cea0e1ff09af83a801c1a9cf1a431d46d0c (diff)
downloadlibgit2-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.c38
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++;