Skip to content

Commit d461aea

Browse files
y5c4l3ttaylorr
authored andcommitted
diff: setup pager only before diff contents truly ready
git-diff setups pager at an early stage in cmd_diff; running diff with invalid options like git diff --invalid will unexpectedly starts a pager, which causes behavior inconsistency. The pager setup routine should be moved right before the real diff contents, in case there is any argv error. Signed-off-by: y5c4l3 <[email protected]> Signed-off-by: Taylor Blau <[email protected]>
1 parent 34b6ce9 commit d461aea

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

builtin/diff.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ static void builtin_diff_b_f(struct rev_info *revs,
105105
1, 0,
106106
blob[0]->path ? blob[0]->path : path,
107107
path);
108+
setup_diff_pager(&revs->diffopt);
108109
diffcore_std(&revs->diffopt);
109110
diff_flush(&revs->diffopt);
110111
}
@@ -129,6 +130,7 @@ static void builtin_diff_blobs(struct rev_info *revs,
129130
&blob[0]->item->oid, &blob[1]->item->oid,
130131
1, 1,
131132
blob_path(blob[0]), blob_path(blob[1]));
133+
setup_diff_pager(&revs->diffopt);
132134
diffcore_std(&revs->diffopt);
133135
diff_flush(&revs->diffopt);
134136
}
@@ -164,6 +166,7 @@ static void builtin_diff_index(struct rev_info *revs,
164166
} else if (repo_read_index(the_repository) < 0) {
165167
die_errno("repo_read_cache");
166168
}
169+
setup_diff_pager(&revs->diffopt);
167170
run_diff_index(revs, option);
168171
}
169172

@@ -201,6 +204,7 @@ static void builtin_diff_tree(struct rev_info *revs,
201204
oid[swap] = &ent0->item->oid;
202205
oid[1 - swap] = &ent1->item->oid;
203206
}
207+
setup_diff_pager(&revs->diffopt);
204208
diff_tree_oid(oid[0], oid[1], "", &revs->diffopt);
205209
log_tree_diff_flush(revs);
206210
}
@@ -227,6 +231,7 @@ static void builtin_diff_combined(struct rev_info *revs,
227231
if (i != first_non_parent)
228232
oid_array_append(&parents, &ent[i].item->oid);
229233
}
234+
setup_diff_pager(&revs->diffopt);
230235
diff_tree_combined(&ent[first_non_parent].item->oid, &parents, revs);
231236
oid_array_clear(&parents);
232237
}
@@ -283,6 +288,7 @@ static void builtin_diff_files(struct rev_info *revs, int argc, const char **arg
283288
0) < 0) {
284289
die_errno("repo_read_index_preload");
285290
}
291+
setup_diff_pager(&revs->diffopt);
286292
run_diff_files(revs, options);
287293
}
288294

@@ -523,8 +529,6 @@ int cmd_diff(int argc,
523529
rev.diffopt.flags.recursive = 1;
524530
rev.diffopt.rotate_to_strict = 1;
525531

526-
setup_diff_pager(&rev.diffopt);
527-
528532
/*
529533
* Do we have --cached and not have a pending object, then
530534
* default to HEAD by hand. Eek.

0 commit comments

Comments
 (0)