More care reporting diff patch iteration errors
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
diff --git a/src/diff_output.c b/src/diff_output.c
index 64ff6b5..bac8622 100644
--- a/src/diff_output.c
+++ b/src/diff_output.c
@@ -1611,6 +1611,12 @@ int git_diff_patch_line_stats(
return 0;
}
+static int diff_error_outofrange(const char *thing)
+{
+ giterr_set(GITERR_INVALID, "Diff patch %s index out of range", thing);
+ return GIT_ENOTFOUND;
+}
+
int git_diff_patch_get_hunk(
const git_diff_range **range,
const char **header,
@@ -1628,7 +1634,8 @@ int git_diff_patch_get_hunk(
if (header) *header = NULL;
if (header_len) *header_len = 0;
if (lines_in_hunk) *lines_in_hunk = 0;
- return GIT_ENOTFOUND;
+
+ return diff_error_outofrange("hunk");
}
hunk = &patch->hunks[hunk_idx];
@@ -1648,7 +1655,7 @@ int git_diff_patch_num_lines_in_hunk(
assert(patch);
if (hunk_idx >= patch->hunks_size)
- return GIT_ENOTFOUND;
+ return diff_error_outofrange("hunk");
else
return (int)patch->hunks[hunk_idx].line_count;
}
@@ -1665,15 +1672,20 @@ int git_diff_patch_get_line_in_hunk(
{
diff_patch_hunk *hunk;
diff_patch_line *line;
+ const char *thing;
assert(patch);
- if (hunk_idx >= patch->hunks_size)
+ if (hunk_idx >= patch->hunks_size) {
+ thing = "hunk";
goto notfound;
+ }
hunk = &patch->hunks[hunk_idx];
- if (line_of_hunk >= hunk->line_count)
+ if (line_of_hunk >= hunk->line_count) {
+ thing = "link";
goto notfound;
+ }
line = &patch->lines[hunk->line_start + line_of_hunk];
@@ -1692,7 +1704,7 @@ notfound:
if (old_lineno) *old_lineno = -1;
if (new_lineno) *new_lineno = -1;
- return GIT_ENOTFOUND;
+ return diff_error_outofrange(thing);
}
static int print_to_buffer_cb(