[PATCH v4 2/4] add-patch: modify patch_update_file() signature
- From
Abraham Samuel Adekunle <abrahamadekunle50@gmail.com>
- Date
- Feb 13, 2026, 22:10 UTC
- Message-ID
- <906f25e184d744f9d23681600a0d9e440b7f07df.1771015581.git.abrahamadekunle50@gmail.com>
- In-Reply-To
- <cover.1771015581.git.abrahamadekunle50@gmail.com>
The function `patch_update_file()` takes the `add_p_state` struct pointer and the current `struct file_diff` pointer and returns an int.
When using the `--no-auto-advance` flag, we want to be able to request the next or previous file from the caller.
Modify the function signature to instead take the index of the current `file_diff` and the `add_p_state` struct pointer so that we can compute the `file_diff` from the index while also having access to the file index. This will help us request the next or previous file from the caller.
Signed-off-by: Abraham Samuel Adekunle <abrahamadekunle50@gmail.com> --- add-patch.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/add-patch.c b/add-patch.c index df8f2e6d74..673ea659ff 100644 --- a/add-patch.c +++ b/add-patch.c @@ -1441,20 +1441,21 @@ static bool get_first_undecided(const struct file_diff *file_diff, size_t *idx) return false; } -static int patch_update_file(struct add_p_state *s, - struct file_diff *file_diff) +static ssize_t patch_update_file(struct add_p_state *s, size_t idx) { size_t hunk_index = 0; ssize_t i, undecided_previous, undecided_next, rendered_hunk_index = -1; struct hunk *hunk; char ch; struct child_process cp = CHILD_PROCESS_INIT; - int colored = !!s->colored.len, quit = 0, use_pager = 0; + int colored = !!s->colored.len, use_pager = 0; enum prompt_mode_type prompt_mode_type; + struct file_diff *file_diff = s->file_diff + idx; + ssize_t patch_update_resp = (ssize_t)idx; /* Empty added files have no hunks */ if (!file_diff->hunk_nr && !file_diff->added) - return 0; + return patch_update_resp + 1; strbuf_reset(&s->buf); render_diff_header(s, file_diff, colored, &s->buf); @@ -1499,9 +1500,10 @@ static int patch_update_file(struct add_p_state *s, /* Everything decided? */ if (undecided_previous < 0 && undecided_next < 0 && - hunk->use != UNDECIDED_HUNK) - break; - + hunk->use != UNDECIDED_HUNK) { + patch_update_resp++; + break; + } strbuf_reset(&s->buf); if (file_diff->hunk_nr) { if (rendered_hunk_index != hunk_index) { @@ -1577,7 +1579,7 @@ static int patch_update_file(struct add_p_state *s, fputs(s->s.reset_color_interactive, stdout); fflush(stdout); if (read_single_character(s) == EOF) { - quit = 1; + patch_update_resp = -1; break; } @@ -1623,7 +1625,7 @@ static int patch_update_file(struct add_p_state *s, hunk->use = SKIP_HUNK; } } else if (ch == 'q') { - quit = 1; + patch_update_resp = -1; break; } else if (s->answer.buf[0] == 'K') { if (permitted & ALLOW_GOTO_PREVIOUS_HUNK) @@ -1810,7 +1812,7 @@ static int patch_update_file(struct add_p_state *s, } putchar('\n'); - return quit; + return patch_update_resp; } int run_add_p(struct repository *r, enum add_p_mode mode, @@ -1821,6 +1823,7 @@ int run_add_p(struct repository *r, enum add_p_mode mode, { r }, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT }; size_t i, binary_count = 0; + ssize_t patch_update_resp; init_add_i_state(&s.s, r, o); @@ -1859,11 +1862,17 @@ int run_add_p(struct repository *r, enum add_p_mode mode, return -1; } - for (i = 0; i < s.file_diff_nr; i++) - if (s.file_diff[i].binary && !s.file_diff[i].hunk_nr) + for (i = 0; i < s.file_diff_nr;) { + if (s.file_diff[i].binary && !s.file_diff[i].hunk_nr) { binary_count++; - else if (patch_update_file(&s, s.file_diff + i)) + i++; + continue; + } + patch_update_resp = patch_update_file(&s, i); + if (patch_update_resp < 0) break; + i = (size_t)patch_update_resp; + } if (s.file_diff_nr == 0) err(&s, _("No changes."));
-- 2.39.5 (Apple Git-154)