From: Phillip Wood <phillip.wood123@gmail.com>
To: git@vger.kernel.org
Cc: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Elijah Newren" <newren@gmail.com>,
"Johannes Schindelin" <Johannes.Schindelin@gmx.de>
Subject: [PATCH v2 0/5] rebase: cleanup merge strategy option handling
Date: Wed, 5 Apr 2023 16:21:43 +0100 [thread overview]
Message-ID: <cover.1680708043.git.phillip.wood@dunelm.org.uk> (raw)
In-Reply-To: <cover.1678893298.git.phillip.wood@dunelm.org.uk>
From: Phillip Wood <phillip.wood@dunelm.org.uk>
Cleanup the handling of --strategy-option now that we no longer need to
support "--preserve-merges" and properly quote the argument when saving
it to disc.
Thanks to Elijah for his comments on V1.
Changes since V1:
I've rebased these patches onto 'master' to avoid conflicts with
'sg/parse-options-h-initializers' in the new patch 2 (this series
depends on 'ab/fix-strategy-opts-parsing' but that has now been merged
to master).
Patch 1 - Unchanged.
Patch 2 - New patch to store the merge strategy options in an "struct
strvec". This patch also introduces a new macro OPT_STRVEC()
to collect options into an "struct strvec".
Patch 3 - Small simplification due to the changes in patch 2.
Patch 4 - Moved the code to quote a list so it can split by
split_cmdline() into a new function quote_cmdline() as
suggested by Elijah.
Patch 5 - Reworded the commit message as suggested by Elijah.
Base-Commit: 140b9478dad5d19543c1cb4fd293ccec228f1240
Published-As: https://github.com/phillipwood/git/releases/tag/sequencer-merge-strategy-options%2Fv2
View-Changes-At: https://github.com/phillipwood/git/compare/140b9478d...3515c31b4
Fetch-It-Via: git fetch https://github.com/phillipwood/git sequencer-merge-strategy-options/v2
Phillip Wood (5):
rebase: stop reading and writing unnecessary strategy state
sequencer: use struct strvec to store merge strategy options
rebase -m: cleanup --strategy-option handling
rebase -m: fix serialization of strategy options
rebase: remove a couple of redundant strategy tests
alias.c | 18 +++++++
alias.h | 3 ++
builtin/rebase.c | 54 ++++-----------------
builtin/revert.c | 20 ++------
parse-options-cb.c | 16 +++++++
parse-options.h | 10 ++++
sequencer.c | 57 ++++++++++------------
sequencer.h | 12 +++--
t/t3402-rebase-merge.sh | 21 --------
t/t3418-rebase-continue.sh | 88 +++++++++++++---------------------
t/t3436-rebase-more-options.sh | 18 -------
11 files changed, 126 insertions(+), 191 deletions(-)
Range-diff against v1:
1: 029d0bf2b6 = 1: 2353c753f5 rebase: stop reading and writing unnecessary strategy state
-: ---------- > 2: dd7b82cdd5 sequencer: use struct strvec to store merge strategy options
2: a01b182644 ! 3: ccef0e6f4b rebase -m: cleanup --strategy-option handling
@@ builtin/rebase.c: struct rebase_options {
.config_autosquash = -1, \
.update_refs = -1, \
.config_update_refs = -1, \
-+ .strategy_opts = STRING_LIST_INIT_NODUP \
++ .strategy_opts = STRING_LIST_INIT_NODUP,\
}
static struct replay_opts get_replay_opts(const struct rebase_options *opts)
@@ builtin/rebase.c: static struct replay_opts get_replay_opts(const struct rebase_
- if (opts->strategy_opts)
- parse_strategy_opts(&replay, opts->strategy_opts);
-+ if (opts->strategy_opts.nr) {
-+ ALLOC_ARRAY(replay.xopts, opts->strategy_opts.nr);
-+ replay.xopts_nr = opts->strategy_opts.nr;
-+ replay.xopts_alloc = opts->strategy_opts.nr;
-+ for (size_t i = 0; i < opts->strategy_opts.nr; i++)
-+ replay.xopts[i] =
-+ xstrdup(opts->strategy_opts.items[i].string);
-+ }
++ for (size_t i = 0; i < opts->strategy_opts.nr; i++)
++ strvec_push(&replay.xopts, opts->strategy_opts.items[i].string);
if (opts->squash_onto) {
oidcpy(&replay.squash_onto, opts->squash_onto);
3: 9af68cb065 ! 4: 9a90212ef2 rebase -m: fix serialization of strategy options
@@ Commit message
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
+ ## alias.c ##
+@@
+ #include "alloc.h"
+ #include "config.h"
+ #include "gettext.h"
++#include "strbuf.h"
+ #include "string-list.h"
+
+ struct config_alias_data {
+@@ alias.c: void list_aliases(struct string_list *list)
+ read_early_config(config_alias_cb, &data);
+ }
+
++void quote_cmdline(struct strbuf *buf, const char **argv)
++{
++ for (const char **argp = argv; *argp; argp++) {
++ if (argp != argv)
++ strbuf_addch(buf, ' ');
++ strbuf_addch(buf, '"');
++ for (const char *p = *argp; *p; p++) {
++ const char c = *p;
++
++ if (c == '"' || c =='\\')
++ strbuf_addch(buf, '\\');
++ strbuf_addch(buf, c);
++ }
++ strbuf_addch(buf, '"');
++ }
++}
++
+ #define SPLIT_CMDLINE_BAD_ENDING 1
+ #define SPLIT_CMDLINE_UNCLOSED_QUOTE 2
+ #define SPLIT_CMDLINE_ARGC_OVERFLOW 3
+
+ ## alias.h ##
+@@
+ #ifndef ALIAS_H
+ #define ALIAS_H
+
++struct strbuf;
+ struct string_list;
+
+ char *alias_lookup(const char *alias);
++/* Quote argv so buf can be parsed by split_cmdline() */
++void quote_cmdline(struct strbuf *buf, const char **argv);
+ int split_cmdline(char *cmdline, const char ***argv);
+ /* Takes a negative value returned by split_cmdline */
+ const char *split_cmdline_strerror(int cmdline_errno);
+
## sequencer.c ##
@@ sequencer.c: static void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
- count = split_cmdline(strategy_opts_string,
- (const char ***)&opts->xopts);
+
+ count = split_cmdline(strategy_opts_string, &argv);
if (count < 0)
- die(_("could not split '%s': %s"), strategy_opts_string,
+ BUG("could not split '%s': %s", strategy_opts_string,
split_cmdline_strerror(count));
- opts->xopts_nr = count;
- for (i = 0; i < opts->xopts_nr; i++) {
+ for (i = 0; i < count; i++) {
+ const char *arg = argv[i];
@@ sequencer.c: static int read_populate_opts(struct replay_opts *opts)
static void write_strategy_opts(struct replay_opts *opts)
{
- int i;
struct strbuf buf = STRBUF_INIT;
-- for (i = 0; i < opts->xopts_nr; ++i)
-- strbuf_addf(&buf, " --%s", opts->xopts[i]);
+- for (i = 0; i < opts->xopts.nr; ++i)
+- strbuf_addf(&buf, " --%s", opts->xopts.v[i]);
-
+ /*
+ * Quote strategy options so that they can be read correctly
+ * by split_cmdline().
+ */
-+ for (size_t i = 0; i < opts->xopts_nr; i++) {
-+ char *arg = opts->xopts[i];
-+
-+ if (i)
-+ strbuf_addch(&buf, ' ');
-+ strbuf_addch(&buf, '"');
-+ for (size_t j = 0; arg[j]; j++) {
-+ const char c = arg[j];
-+
-+ if (c == '"' || c =='\\')
-+ strbuf_addch(&buf, '\\');
-+ strbuf_addch(&buf, c);
-+ }
-+ strbuf_addch(&buf, '"');
-+ }
++ quote_cmdline(&buf, opts->xopts.v);
write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
strbuf_release(&buf);
}
4: 3e02eeff78 ! 5: 3515c31b40 rebase: remove a couple of redundant strategy tests
@@ Metadata
## Commit message ##
rebase: remove a couple of redundant strategy tests
- The test removed in t3402 has been redundant ever since 80ff47957b
- (rebase: remember strategy and strategy options, 2011-02-06) which added
- a new test the first part of which (as noted in the commit message)
- duplicated the existing test. The test removed in t3418 has been
- redundant since the merge backend was removed in 68aa495b59 (rebase:
- implement --merge via the interactive machinery, 2018-12-11) as it now
- tests the same code paths as the preceding test.
-
+ Remove a test in t3402 that has been redundant ever since 80ff47957b
+ (rebase: remember strategy and strategy options, 2011-02-06). That
+ commit added a new test, the first part of which (as noted in the old
+ commit message) duplicated an existing test.
+
+ Also remove a test t3418 that has been redundant since the merge backend
+ was removed in 68aa495b59 (rebase: implement --merge via the interactive
+ machinery, 2018-12-11), since it now tests the same code paths as the
+ preceding test.
+
+ Helped-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
## t/t3402-rebase-merge.sh ##
--
2.40.0.670.g64ef305212.dirty
next prev parent reply other threads:[~2023-04-05 15:22 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-15 15:14 [PATCH 0/4] rebase: cleanup merge strategy option handling Phillip Wood
2023-03-15 15:14 ` [PATCH 1/4] rebase: stop reading and writing unnecessary strategy state Phillip Wood
2023-03-15 15:14 ` [PATCH 2/4] rebase -m: cleanup --strategy-option handling Phillip Wood
2023-03-15 15:14 ` [PATCH 3/4] rebase -m: fix serialization of strategy options Phillip Wood
2023-04-01 19:27 ` Elijah Newren
2023-04-04 13:02 ` Phillip Wood
2023-03-15 15:14 ` [PATCH 4/4] rebase: remove a couple of redundant strategy tests Phillip Wood
2023-04-01 19:31 ` Elijah Newren
2023-04-04 13:04 ` Phillip Wood
2023-03-15 16:03 ` [PATCH 0/4] rebase: cleanup merge strategy option handling Junio C Hamano
2023-03-15 16:50 ` Felipe Contreras
2023-04-01 19:32 ` Elijah Newren
2023-04-05 15:21 ` Phillip Wood [this message]
2023-04-05 15:21 ` [PATCH v2 1/5] rebase: stop reading and writing unnecessary strategy state Phillip Wood
2023-04-05 15:21 ` [PATCH v2 2/5] sequencer: use struct strvec to store merge strategy options Phillip Wood
2023-04-07 5:44 ` Elijah Newren
2023-04-05 15:21 ` [PATCH v2 3/5] rebase -m: cleanup --strategy-option handling Phillip Wood
2023-04-05 15:21 ` [PATCH v2 4/5] rebase -m: fix serialization of strategy options Phillip Wood
2023-04-07 5:47 ` Elijah Newren
2023-04-05 15:21 ` [PATCH v2 5/5] rebase: remove a couple of redundant strategy tests Phillip Wood
2023-04-07 5:49 ` [PATCH v2 0/5] rebase: cleanup merge strategy option handling Elijah Newren
2023-04-07 13:57 ` Phillip Wood
2023-04-07 17:53 ` Junio C Hamano
2023-04-07 13:55 ` [PATCH v3 " Phillip Wood
2023-04-07 13:55 ` [PATCH v3 1/5] rebase: stop reading and writing unnecessary strategy state Phillip Wood
2023-04-07 13:55 ` [PATCH v3 2/5] sequencer: use struct strvec to store merge strategy options Phillip Wood
2023-04-07 13:55 ` [PATCH v3 3/5] rebase -m: cleanup --strategy-option handling Phillip Wood
2023-04-07 13:55 ` [PATCH v3 4/5] rebase -m: fix serialization of strategy options Phillip Wood
2023-04-07 13:55 ` [PATCH v3 5/5] rebase: remove a couple of redundant strategy tests Phillip Wood
2023-04-10 9:08 ` [PATCH v4 0/5] rebase: cleanup merge strategy option handling Phillip Wood
2023-04-10 9:08 ` [PATCH v4 1/5] rebase: stop reading and writing unnecessary strategy state Phillip Wood
2023-04-10 9:08 ` [PATCH v4 2/5] sequencer: use struct strvec to store merge strategy options Phillip Wood
2023-04-10 9:08 ` [PATCH v4 3/5] rebase -m: cleanup --strategy-option handling Phillip Wood
2023-04-10 9:08 ` [PATCH v4 4/5] rebase -m: fix serialization of strategy options Phillip Wood
2023-04-10 9:08 ` [PATCH v4 5/5] rebase: remove a couple of redundant strategy tests Phillip Wood
2023-04-10 16:46 ` [PATCH v4 0/5] rebase: cleanup merge strategy option handling Elijah Newren
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.1680708043.git.phillip.wood@dunelm.org.uk \
--to=phillip.wood123@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=newren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
/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).