range-diff: optionally include merge commits' diffs in the analysis
The `git log` command already offers support for including diffs for merges, via the `--diff-merges=<format>` option. Let's add corresponding support for `git range-diff`, too. This makes it more convenient to spot differences between commit ranges that contain merges. This is especially true in scenarios with non-trivial merges, i.e. merges introducing changes other than, or in addition to, what merge ORT would have produced. Merging a topic branch that changes a function signature into a branch that added a caller of that function, for example, would require the merge commit itself to adjust that caller to the modified signature. In my code reviews, I found the `--diff-merges=remerge` option particularly useful. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
eb8374c652
commit
f8043236c6
15
range-diff.c
15
range-diff.c
@ -38,7 +38,8 @@ struct patch_util {
|
||||
* as struct object_id (will need to be free()d).
|
||||
*/
|
||||
static int read_patches(const char *range, struct string_list *list,
|
||||
const struct strvec *other_arg)
|
||||
const struct strvec *other_arg,
|
||||
unsigned int include_merges)
|
||||
{
|
||||
struct child_process cp = CHILD_PROCESS_INIT;
|
||||
struct strbuf buf = STRBUF_INIT, contents = STRBUF_INIT;
|
||||
@ -49,7 +50,7 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
size_t size;
|
||||
int ret = -1;
|
||||
|
||||
strvec_pushl(&cp.args, "log", "--no-color", "-p", "--no-merges",
|
||||
strvec_pushl(&cp.args, "log", "--no-color", "-p",
|
||||
"--reverse", "--date-order", "--decorate=no",
|
||||
"--no-prefix", "--submodule=short",
|
||||
/*
|
||||
@ -64,6 +65,8 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
"--pretty=medium",
|
||||
"--show-notes-by-default",
|
||||
NULL);
|
||||
if (!include_merges)
|
||||
strvec_push(&cp.args, "--no-merges");
|
||||
strvec_push(&cp.args, range);
|
||||
if (other_arg)
|
||||
strvec_pushv(&cp.args, other_arg->v);
|
||||
@ -96,11 +99,14 @@ static int read_patches(const char *range, struct string_list *list,
|
||||
}
|
||||
|
||||
if (skip_prefix(line, "commit ", &p)) {
|
||||
char *q;
|
||||
if (util) {
|
||||
string_list_append(list, buf.buf)->util = util;
|
||||
strbuf_reset(&buf);
|
||||
}
|
||||
CALLOC_ARRAY(util, 1);
|
||||
if (include_merges && (q = strstr(p, " (from ")))
|
||||
*q = '\0';
|
||||
if (repo_get_oid(the_repository, p, &util->oid)) {
|
||||
error(_("could not parse commit '%s'"), p);
|
||||
FREE_AND_NULL(util);
|
||||
@ -571,13 +577,14 @@ int show_range_diff(const char *range1, const char *range2,
|
||||
|
||||
struct string_list branch1 = STRING_LIST_INIT_DUP;
|
||||
struct string_list branch2 = STRING_LIST_INIT_DUP;
|
||||
unsigned int include_merges = range_diff_opts->include_merges;
|
||||
|
||||
if (range_diff_opts->left_only && range_diff_opts->right_only)
|
||||
res = error(_("options '%s' and '%s' cannot be used together"), "--left-only", "--right-only");
|
||||
|
||||
if (!res && read_patches(range1, &branch1, range_diff_opts->other_arg))
|
||||
if (!res && read_patches(range1, &branch1, range_diff_opts->other_arg, include_merges))
|
||||
res = error(_("could not parse log for '%s'"), range1);
|
||||
if (!res && read_patches(range2, &branch2, range_diff_opts->other_arg))
|
||||
if (!res && read_patches(range2, &branch2, range_diff_opts->other_arg, include_merges))
|
||||
res = error(_("could not parse log for '%s'"), range2);
|
||||
|
||||
if (!res) {
|
||||
|
Reference in New Issue
Block a user