git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Denton Liu <liu.denton@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: "Christian Biesinger" <cbiesinger@google.com>,
	"Eric Sunshine" <sunshine@sunshineco.com>,
	"Junio C Hamano" <gitster@pobox.com>,
	"René Scharfe" <l.s.r@web.de>
Subject: [PATCH v4 0/5] rebase: fix breakage with `format.useAutoBase`
Date: Wed, 4 Dec 2019 13:24:44 -0800	[thread overview]
Message-ID: <cover.1575494617.git.liu.denton@gmail.com> (raw)
In-Reply-To: <cover.1575445582.git.liu.denton@gmail.com>

Apparently, this use case has been broken for a long time... Since
bb52995f3e (format-patch: introduce format.useAutoBase configuration,
2016-04-26). I'm surprised it's only been reported now.

This patchset fixes the breakage by teaching
`git format-patch --no-base` and making rebase use it.

This patch is based on the latest master since it's such an old bug that
only got noticed recently, I'm not sure if it's worth fixing in 'maint'.
The series does not apply cleanly on top of 'maint' because it relies on
c1a6f21cd4 (Doc: add more detail for git-format-patch, 2019-08-27) but
the conflicts are relatively minor.

Changes since v3:

* Correct error in log messages more precise by saying that rebases fail
  in general (even if an upstream is set)

* Change ugly use of OPT_CALLBACK into a more elegant form

Changes since v2:

* Remove spurious indentation change

* Rebase onto the latest master

Changes since v1:

* Update some log messages

Denton Liu (5):
  t3400: demonstrate failure with format.useAutoBase
  format-patch: fix indentation
  t4014: use test_config()
  format-patch: teach --no-base
  rebase: fix format.useAutoBase breakage

 Documentation/git-format-patch.txt |  5 +++--
 builtin/log.c                      |  9 ++++++---
 builtin/rebase.c                   |  3 ++-
 t/t3400-rebase.sh                  |  6 ++++++
 t/t4014-format-patch.sh            | 14 +++++++++-----
 5 files changed, 26 insertions(+), 11 deletions(-)

Range-diff against v3:
1:  78b928bf49 ! 1:  386148a550 t3400: demonstrate failure with format.useAutoBase
    @@ Commit message
     
         Ever since bb52995f3e (format-patch: introduce format.useAutoBase
         configuration, 2016-04-26), `git rebase` has been broken when
    -    `format.useAutoBase = true`. It fails when rebasing a branch that
    -    doesn't have an upstream set:
    +    `format.useAutoBase = true`. It fails when rebasing a branch:
     
                 fatal: failed to get upstream, if you want to record base commit automatically,
                 please use git branch --set-upstream-to to track a remote branch.
2:  5435a04427 = 2:  0464bd61c2 format-patch: fix indentation
3:  455f2df08d = 3:  a55eacbad7 t4014: use test_config()
4:  7c7b94c0c4 ! 4:  eb35de8f49 format-patch: teach --no-base
    @@ Commit message
         format-patch: teach --no-base
     
         If `format.useAutoBase = true`, there was no way to override this from
    -    the command-line. Teach format-patch the `--no-base` option which
    -    overrides `format.useAutoBase`.
    +    the command-line. Teach the `--no-base` option in format-patch to
    +    override `format.useAutoBase`.
    +
    +    Helped-by: René Scharfe <l.s.r@web.de>
     
      ## Documentation/git-format-patch.txt ##
     @@ Documentation/git-format-patch.txt: you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`.
    @@ Documentation/git-format-patch.txt: you can use `--suffix=-patch` to get `0001-d
      	Treat the revision argument as a <revision range>, even if it
     
      ## builtin/log.c ##
    -@@ builtin/log.c: static int from_callback(const struct option *opt, const char *arg, int unset)
    - 	return 0;
    - }
    - 
    -+static int base_callback(const struct option *opt, const char *arg, int unset)
    -+{
    -+	char **base_commit = opt->value;
    -+
    -+	free(*base_commit);
    -+
    -+	if (unset) {
    -+		base_auto = 0;
    -+		*base_commit = NULL;
    -+	} else if (arg) {
    -+		*base_commit = xstrdup(arg);
    -+	} else {
    -+		BUG("arg is NULL");
    -+	}
    -+	return 0;
    -+}
    -+
    - struct base_tree_info {
    - 	struct object_id base_commit;
    - 	int nr_patch_id, alloc_patch_id;
    +@@ builtin/log.c: static struct commit *get_base_commit(const char *base_commit,
    + 		base = lookup_commit_reference_by_name(base_commit);
    + 		if (!base)
    + 			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);
    + 		const char *upstream = branch_get_upstream(curr_branch, NULL);
    + 		if (upstream) {
     @@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *prefix)
    - 			    PARSE_OPT_OPTARG, thread_callback },
    - 		OPT_STRING(0, "signature", &signature, N_("signature"),
    - 			    N_("add a signature")),
    --		OPT_STRING(0, "base", &base_commit, N_("base-commit"),
    --			   N_("add prerequisite tree info to the patch series")),
    -+		{ OPTION_CALLBACK, 0, "base", &base_commit, N_("base-commit"),
    -+			   N_("add prerequisite tree info to the patch series"),
    -+			   0, base_callback },
    - 		OPT_FILENAME(0, "signature-file", &signature_file,
    --				N_("add a signature from a file")),
    -+			N_("add a signature from a file")),
    - 		OPT__QUIET(&quiet, N_("don't print the patch filenames")),
    - 		OPT_BOOL(0, "progress", &show_progress,
    - 			 N_("show progress while generating patches")),
    + 	s_r_opt.def = "HEAD";
    + 	s_r_opt.revarg_opt = REVARG_COMMITTISH;
    + 
    ++	if (base_auto)
    ++		base_commit = "auto";
    ++
    + 	if (default_attach) {
    + 		rev.mime_boundary = default_attach;
    + 		rev.no_inline = 1;
    +@@ builtin/log.c: int cmd_format_patch(int argc, const char **argv, const char *prefix)
    + 	}
    + 
    + 	memset(&bases, 0, sizeof(bases));
    +-	if (base_commit || base_auto) {
    ++	if (base_commit) {
    + 		struct commit *base = get_base_commit(base_commit, list, nr);
    + 		reset_revision_walk();
    + 		clear_object_flags(UNINTERESTING);
     
      ## t/t4014-format-patch.sh ##
     @@ t/t4014-format-patch.sh: test_expect_success 'format-patch --base overrides format.useAutoBase' '
5:  2b4166e371 ! 5:  210905f163 rebase: fix format.useAutoBase breakage
    @@ Commit message
         rebase: fix format.useAutoBase breakage
     
         With `format.useAutoBase = true`, running rebase resulted in an
    -    error when an upstream wasn't set:
    +    error:
     
                 fatal: failed to get upstream, if you want to record base commit automatically,
                 please use git branch --set-upstream-to to track a remote branch.
-- 
2.24.0.578.g4820254054


  parent reply	other threads:[~2019-12-04 21:24 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-26 20:50 Bug with "git rebase" when format.useAutoBase is set Christian Biesinger
2019-11-27  2:09 ` [PATCH 0/5] rebase: fix breakage with `format.useAutoBase` Denton Liu
2019-11-27  2:09   ` [PATCH 1/5] t3400: demonstrate failure with format.useAutoBase Denton Liu
2019-11-27  2:26     ` Eric Sunshine
2019-11-30 17:25       ` Junio C Hamano
2019-11-27  2:09   ` [PATCH 2/5] format-patch: fix indentation Denton Liu
2019-11-27  2:09   ` [PATCH 3/5] t4014: use `test_config` Denton Liu
2019-11-27  2:09   ` [PATCH 4/5] format-patch: teach --no-base Denton Liu
2019-11-27  2:09   ` [PATCH 5/5] rebase: fix `format.useAutoBase` breakage Denton Liu
2019-11-27  2:42     ` Eric Sunshine
2019-11-27 17:14   ` [PATCH 0/5] rebase: fix breakage with `format.useAutoBase` Christian Biesinger
2019-11-27 18:13   ` [PATCH v2 " Denton Liu
2019-11-27 18:13     ` [PATCH v2 1/5] t3400: demonstrate failure with format.useAutoBase Denton Liu
2019-11-27 18:13     ` [PATCH v2 2/5] format-patch: fix indentation Denton Liu
2019-11-27 18:13     ` [PATCH v2 3/5] t4014: use test_config() Denton Liu
2019-11-27 18:13     ` [PATCH v2 4/5] format-patch: teach --no-base Denton Liu
2019-11-27 19:56       ` Denton Liu
2019-11-27 18:13     ` [PATCH v2 5/5] rebase: fix format.useAutoBase breakage Denton Liu
2019-12-04 16:21       ` Christian Biesinger
2019-12-04  7:47     ` [PATCH v3 0/5] rebase: fix breakage with `format.useAutoBase` Denton Liu
2019-12-04  7:47       ` [PATCH v3 1/5] t3400: demonstrate failure with format.useAutoBase Denton Liu
2019-12-04  7:47       ` [PATCH v3 2/5] format-patch: fix indentation Denton Liu
2019-12-04  7:47       ` [PATCH v3 3/5] t4014: use test_config() Denton Liu
2019-12-04  7:47       ` [PATCH v3 4/5] format-patch: teach --no-base Denton Liu
2019-12-04 10:36         ` René Scharfe
2019-12-04 17:26           ` Junio C Hamano
2019-12-04  7:48       ` [PATCH v3 5/5] rebase: fix format.useAutoBase breakage Denton Liu
2019-12-04 21:24       ` Denton Liu [this message]
2019-12-04 21:24         ` [PATCH v4 1/5] t3400: demonstrate failure with format.useAutoBase Denton Liu
2019-12-04 21:24         ` [PATCH v4 2/5] format-patch: fix indentation Denton Liu
2019-12-04 21:25         ` [PATCH v4 3/5] t4014: use test_config() Denton Liu
2019-12-04 21:25         ` [PATCH v4 4/5] format-patch: teach --no-base Denton Liu
2019-12-04 21:25         ` [PATCH v4 5/5] rebase: fix format.useAutoBase breakage Denton Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.1575494617.git.liu.denton@gmail.com \
    --to=liu.denton@gmail.com \
    --cc=cbiesinger@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=l.s.r@web.de \
    --cc=sunshine@sunshineco.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).