format-patch: extend --range-diff to accept revision range

When submitting a revised a patch series, the --range-diff option embeds
a range-diff in the cover letter showing changes since the previous
version of the patch series. The argument to --range-diff is a simple
revision naming the tip of the previous series, which works fine if the
previous and current versions of the patch series share a common base.

However, it fails if the revision ranges of the old and new versions of
the series are disjoint. To address this shortcoming, extend
--range-diff to also accept an explicit revision range for the previous
series. For example:

    git format-patch --cover-letter --range-diff=v1~3..v1 -3 v2

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Sunshine 2018-07-22 05:57:14 -04:00 committed by Junio C Hamano
parent 31e2617a5f
commit 2e6fd71a52
3 changed files with 19 additions and 7 deletions

View file

@ -243,10 +243,12 @@ feeding the result to `git send-email`.
As a reviewer aid, insert a range-diff (see linkgit:git-range-diff[1]) As a reviewer aid, insert a range-diff (see linkgit:git-range-diff[1])
into the cover letter showing the differences between the previous into the cover letter showing the differences between the previous
version of the patch series and the series currently being formatted. version of the patch series and the series currently being formatted.
`previous` is a single revision naming the tip of the previous `previous` can be a single revision naming the tip of the previous
series which shares a common base with the series being formatted (for series if it shares a common base with the series being formatted (for
example `git format-patch --cover-letter --range-diff=feature/v1 -3 example `git format-patch --cover-letter --range-diff=feature/v1 -3
feature/v2`). feature/v2`), or a revision range if the two versions of the series are
disjoint (for example `git format-patch --cover-letter
--range-diff=feature/v1~3..feature/v1 -3 feature/v2`).
--notes[=<ref>]:: --notes[=<ref>]::
Append the notes (see linkgit:git-notes[1]) for the commit Append the notes (see linkgit:git-notes[1]) for the commit

View file

@ -1448,12 +1448,21 @@ static const char *diff_title(struct strbuf *sb, int reroll_count,
static void infer_range_diff_ranges(struct strbuf *r1, static void infer_range_diff_ranges(struct strbuf *r1,
struct strbuf *r2, struct strbuf *r2,
const char *prev, const char *prev,
struct commit *origin,
struct commit *head) struct commit *head)
{ {
const char *head_oid = oid_to_hex(&head->object.oid); const char *head_oid = oid_to_hex(&head->object.oid);
strbuf_addf(r1, "%s..%s", head_oid, prev); if (!strstr(prev, "..")) {
strbuf_addf(r2, "%s..%s", prev, head_oid); strbuf_addf(r1, "%s..%s", head_oid, prev);
strbuf_addf(r2, "%s..%s", prev, head_oid);
} else if (!origin) {
die(_("failed to infer range-diff ranges"));
} else {
strbuf_addstr(r1, prev);
strbuf_addf(r2, "%s..%s",
oid_to_hex(&origin->object.oid), head_oid);
}
} }
int cmd_format_patch(int argc, const char **argv, const char *prefix) int cmd_format_patch(int argc, const char **argv, const char *prefix)
@ -1802,7 +1811,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (!cover_letter) if (!cover_letter)
die(_("--range-diff requires --cover-letter")); die(_("--range-diff requires --cover-letter"));
infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev, list[0]); infer_range_diff_ranges(&rdiff1, &rdiff2, rdiff_prev,
origin, list[0]);
rev.rdiff1 = rdiff1.buf; rev.rdiff1 = rdiff1.buf;
rev.rdiff2 = rdiff2.buf; rev.rdiff2 = rdiff2.buf;
rev.creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT; rev.creation_factor = RANGE_DIFF_CREATION_FACTOR_DEFAULT;

View file

@ -142,7 +142,7 @@ test_expect_success 'changed message' '
test_cmp expected actual test_cmp expected actual
' '
for prev in topic for prev in topic master..topic
do do
test_expect_success "format-patch --range-diff=$prev" ' test_expect_success "format-patch --range-diff=$prev" '
git format-patch --stdout --cover-letter --range-diff=$prev \ git format-patch --stdout --cover-letter --range-diff=$prev \