Skip to content

Commit 95c9eb8

Browse files
committed
Merge branch 'jk/diff-no-index-pager' into maint
"git diff --no-index" did not work with pagers correctly. * jk/diff-no-index-pager: do not run pager with diff --no-index --quiet fix pager.diff with diff --no-index
2 parents 9ca7249 + af63b54 commit 95c9eb8

File tree

3 files changed

+22
-15
lines changed

3 files changed

+22
-15
lines changed

builtin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
4141
void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c);
4242

4343
extern int check_pager_config(const char *cmd);
44+
struct diff_options;
45+
extern void setup_diff_pager(struct diff_options *);
4446

4547
extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, char **buf, unsigned long *buf_size);
4648

builtin/diff.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,13 +304,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
304304

305305
DIFF_OPT_SET(&rev.diffopt, RECURSIVE);
306306

307-
/*
308-
* If the user asked for our exit code then don't start a
309-
* pager or we would end up reporting its exit code instead.
310-
*/
311-
if (!DIFF_OPT_TST(&rev.diffopt, EXIT_WITH_STATUS) &&
312-
check_pager_config("diff") != 0)
313-
setup_pager();
307+
setup_diff_pager(&rev.diffopt);
314308

315309
/*
316310
* Do we have --cached and not have a pending object, then
@@ -421,3 +415,19 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
421415
refresh_index_quietly();
422416
return result;
423417
}
418+
419+
void setup_diff_pager(struct diff_options *opt)
420+
{
421+
/*
422+
* If the user asked for our exit code, then either they want --quiet
423+
* or --exit-code. We should definitely not bother with a pager in the
424+
* former case, as we will generate no output. Since we still properly
425+
* report our exit code even when a pager is run, we _could_ run a
426+
* pager with --exit-code. But since we have not done so historically,
427+
* and because it is easy to find people oneline advising "git diff
428+
* --exit-code" in hooks and other scripts, we do not do so.
429+
*/
430+
if (!DIFF_OPT_TST(opt, EXIT_WITH_STATUS) &&
431+
check_pager_config("diff") != 0)
432+
setup_pager();
433+
}

diff-no-index.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,6 @@ void diff_no_index(struct rev_info *revs,
224224
}
225225
}
226226

227-
/*
228-
* If the user asked for our exit code then don't start a
229-
* pager or we would end up reporting its exit code instead.
230-
*/
231-
if (!DIFF_OPT_TST(&revs->diffopt, EXIT_WITH_STATUS))
232-
setup_pager();
233-
234227
if (prefix) {
235228
int len = strlen(prefix);
236229
const char *paths[3];
@@ -255,13 +248,15 @@ void diff_no_index(struct rev_info *revs,
255248
if (!revs->diffopt.output_format)
256249
revs->diffopt.output_format = DIFF_FORMAT_PATCH;
257250

258-
DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
259251
DIFF_OPT_SET(&revs->diffopt, NO_INDEX);
260252

261253
revs->max_count = -2;
262254
if (diff_setup_done(&revs->diffopt) < 0)
263255
die("diff_setup_done failed");
264256

257+
setup_diff_pager(&revs->diffopt);
258+
DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
259+
265260
if (queue_diff(&revs->diffopt, revs->diffopt.pathspec.raw[0],
266261
revs->diffopt.pathspec.raw[1]))
267262
exit(1);

0 commit comments

Comments
 (0)