On Tue, Mar 26, 2024 at 12:13:46PM -0700, Junio C Hamano wrote: > > On Tue, Mar 26, 2024 at 08:31:41AM -0700, Junio C Hamano wrote: > > > >> 'r'edisplay may work well (and I wonder "r | less" or > >> piping the hunk display to anything in general would be a useful > >> future enhancement). > > > > It would be more like tweaking fputs() of a strbuf that > was filled by render_hunk() to instead spawn a pager and feed the > same strbuf to it, or something. IOW, we already have the payload > to show. We just want a pager involved in its showing so that users > with a huge hunk that does not fit on a page can use "less" on it. I do not plan to address this in this series, but while the topic is warm; Perhaps?: --- >8 --- diff --git a/add-patch.c b/add-patch.c index 778f168298..cb74fe84f5 100644 --- a/add-patch.c +++ b/add-patch.c @@ -5,6 +5,7 @@ #include "environment.h" #include "gettext.h" #include "object-name.h" +#include "pager.h" #include "read-cache-ll.h" #include "repository.h" #include "strbuf.h" @@ -1450,7 +1451,7 @@ static int patch_update_file(struct add_p_state *s, if (file_diff->hunk_nr) { if (rendered_hunk_index != hunk_index) { render_hunk(s, hunk, 0, colored, &s->buf); - fputs(s->buf.buf, stdout); + fputs_to_pager(s->buf.buf); rendered_hunk_index = hunk_index; } diff --git a/pager.c b/pager.c index b8822a9381..f00fc87a67 100644 --- a/pager.c +++ b/pager.c @@ -264,3 +264,30 @@ int check_pager_config(const char *cmd) pager_program = data.value; return data.want; } + +void fputs_to_pager(const char* s) +{ + struct child_process process; + FILE* pager_stdin; + const char *pager = git_pager(isatty(1)); + + if (!pager) { + fputs(s, stdout); + return; + } + + child_process_init(&process); + + prepare_pager_args(&pager_process, pager); + pager_process.in = -1; + strvec_push(&pager_process.env, "GIT_PAGER_IN_USE"); + if (start_command(&pager_process)) + return; + + pager_stdin = fdopen(pager_process.in, "w"); + fputs(s, pager_stdin); + fflush(pager_stdin); + + close(pager_process.in); + finish_command(&pager_process); +} diff --git a/pager.h b/pager.h index b77433026d..dcccfa632b 100644 --- a/pager.h +++ b/pager.h @@ -11,6 +11,7 @@ void term_clear_line(void); int decimal_width(uintmax_t); int check_pager_config(const char *cmd); void prepare_pager_args(struct child_process *, const char *pager); +void fputs_to_pager(const char* s); extern int pager_use_color;