format-patch: teach --no-base

If `format.useAutoBase = true`, there was no way to override this from
the command-line. Teach the `--no-base` option in format-patch to
override `format.useAutoBase`.

Helped-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Denton Liu 2019-12-04 13:25:06 -08:00 committed by Junio C Hamano
parent 700e006c5d
commit 945dc55dda
3 changed files with 14 additions and 4 deletions

View file

@ -333,11 +333,12 @@ you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`.
Output an all-zero hash in each patch's From header instead Output an all-zero hash in each patch's From header instead
of the hash of the commit. of the hash of the commit.
--base=<commit>:: --[no-]base[=<commit>]::
Record the base tree information to identify the state the Record the base tree information to identify the state the
patch series applies to. See the BASE TREE INFORMATION section patch series applies to. See the BASE TREE INFORMATION section
below for details. If <commit> is "auto", a base commit is below for details. If <commit> is "auto", a base commit is
automatically chosen. automatically chosen. The `--no-base` option overrides a
`format.useAutoBase` configuration.
--root:: --root::
Treat the revision argument as a <revision range>, even if it Treat the revision argument as a <revision range>, even if it

View file

@ -1406,7 +1406,7 @@ static struct commit *get_base_commit(const char *base_commit,
base = lookup_commit_reference_by_name(base_commit); base = lookup_commit_reference_by_name(base_commit);
if (!base) if (!base)
die(_("unknown commit %s"), base_commit); die(_("unknown commit %s"), base_commit);
} else if ((base_commit && !strcmp(base_commit, "auto")) || base_auto) { } else if ((base_commit && !strcmp(base_commit, "auto"))) {
struct branch *curr_branch = branch_get(NULL); struct branch *curr_branch = branch_get(NULL);
const char *upstream = branch_get_upstream(curr_branch, NULL); const char *upstream = branch_get_upstream(curr_branch, NULL);
if (upstream) { if (upstream) {
@ -1710,6 +1710,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
s_r_opt.def = "HEAD"; s_r_opt.def = "HEAD";
s_r_opt.revarg_opt = REVARG_COMMITTISH; s_r_opt.revarg_opt = REVARG_COMMITTISH;
if (base_auto)
base_commit = "auto";
if (default_attach) { if (default_attach) {
rev.mime_boundary = default_attach; rev.mime_boundary = default_attach;
rev.no_inline = 1; rev.no_inline = 1;
@ -1973,7 +1976,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
} }
memset(&bases, 0, sizeof(bases)); memset(&bases, 0, sizeof(bases));
if (base_commit || base_auto) { if (base_commit) {
struct commit *base = get_base_commit(base_commit, list, nr); struct commit *base = get_base_commit(base_commit, list, nr);
reset_revision_walk(); reset_revision_walk();
clear_object_flags(UNINTERESTING); clear_object_flags(UNINTERESTING);

View file

@ -1958,6 +1958,12 @@ test_expect_success 'format-patch --base overrides format.useAutoBase' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'format-patch --no-base overrides format.useAutoBase' '
test_config format.useAutoBase true &&
git format-patch --stdout --no-base -1 >patch &&
! grep "^base-commit:" patch
'
test_expect_success 'format-patch --base with --attach' ' test_expect_success 'format-patch --base with --attach' '
git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch && git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch &&
sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \ sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \