From: Christian Couder <christian.couder@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Patrick Steinhardt <ps@pks.im>, Elijah Newren <newren@gmail.com>,
Jeff King <peff@peff.net>,
"brian m . carlson" <sandals@crustytoothpaste.net>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>,
Justin Tobler <jltobler@gmail.com>,
Christian Couder <christian.couder@gmail.com>
Subject: [PATCH v2 10/12] fast-import: use callbacks to parse some options
Date: Tue, 4 Aug 2026 12:03:53 +0200 [thread overview]
Message-ID: <20260804100355.1299498-11-christian.couder@gmail.com> (raw)
In-Reply-To: <20260804100355.1299498-1-christian.couder@gmail.com>
A previous commit started using the parse-option API to generate proper
`git fast-import -h` and `git fast-import --help-all` output.
Let's prepare for when we can use that API to also parse the options by
using OPT_CALLBACK for some options that require special processing of
their arguments.
A following commit will actually parse the options using these
callbacks.
Signed-off-by: Christian Couder <christian.couder@gmail.com>
---
builtin/fast-import.c | 208 ++++++++++++++++++++++++++++++++++--------
1 file changed, 168 insertions(+), 40 deletions(-)
diff --git a/builtin/fast-import.c b/builtin/fast-import.c
index bf72adf62b..f3c46fb567 100644
--- a/builtin/fast-import.c
+++ b/builtin/fast-import.c
@@ -3978,6 +3978,126 @@ static void parse_argv(struct fast_import_state *state)
build_mark_map(&sub_marks_from, &sub_marks_to);
}
+static int option_parse_date_format(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_date_format(arg);
+ return 0;
+}
+
+static int option_parse_export_pack_edges(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_export_pack_edges(opt->value, arg);
+ return 0;
+}
+
+static int option_parse_max_pack_size(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_max_pack_size(arg);
+ return 0;
+}
+
+static int option_parse_big_file_threshold(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_big_file_threshold(arg);
+ return 0;
+}
+
+static int option_parse_signed_commits(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_signed_commits(arg);
+ return 0;
+}
+
+static int option_parse_signed_tags(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_signed_tags(arg);
+ return 0;
+}
+
+static int option_parse_rewrite_submodules_from(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_rewrite_submodules(opt->value, arg, &sub_marks_from);
+ return 0;
+}
+
+static int option_parse_rewrite_submodules_to(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_rewrite_submodules(opt->value, arg, &sub_marks_to);
+ return 0;
+}
+
+static int option_parse_cat_blob_fd(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_cat_blob_fd(opt->value, arg);
+ return 0;
+}
+
+static int option_parse_import_marks(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_import_marks(opt->value, arg, 0, 0);
+ return 0;
+}
+
+static int option_parse_import_marks_if_exists(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_import_marks(opt->value, arg, 0, 1);
+ return 0;
+}
+
+static int option_parse_export_marks(const struct option *opt,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_export_marks(opt->value, arg);
+ return 0;
+}
+
+static int option_parse_depth(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_depth(arg);
+ return 0;
+}
+
+static int option_parse_active_branches(const struct option *opt UNUSED,
+ const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_active_branches(arg);
+ return 0;
+}
+
+static int option_parse_quiet(const struct option *opt UNUSED,
+ const char *arg UNUSED, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ option_quiet();
+ return 0;
+}
+
int cmd_fast_import(int argc,
const char **argv,
const char *prefix,
@@ -3985,10 +4105,6 @@ int cmd_fast_import(int argc,
{
struct fast_import_state state;
- unsigned long pack_size_limit, big_file_threshold;
- char *edges, *signed_commits, *signed_tags, *date_format;
- char *import_marks_if_exists, *submodules_from, *submodules_to;
-
/*
* NEEDSWORK: For now this is used only to render
* `-h`/`--help-all` usage messages. The actual parsing is
@@ -3996,58 +4112,70 @@ int cmd_fast_import(int argc,
*/
struct option fast_import_options[] = {
OPT_GROUP(N_("Common")),
- OPT_STRING_F(0, "date-format", &date_format, N_("fmt"),
- N_("format of the commit/tag dates"), PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "date-format", NULL, N_("fmt"),
+ N_("format of the commit/tag dates"),
+ PARSE_OPT_NONEG, option_parse_date_format),
OPT_BOOL_F(0, "stats", &show_stats,
N_("display some basic statistics (objects, packfiles and memory)"),
PARSE_OPT_NONEG),
- OPT_BOOL_F(0, "quiet", &quiet,
- N_("disable the output shown by --stats"), PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "quiet", NULL, NULL,
+ N_("disable the output shown by --stats"),
+ PARSE_OPT_NOARG | PARSE_OPT_NONEG,
+ option_parse_quiet),
OPT_BOOL_F(0, "force", &force_update,
N_("force updating modified existing branches"), PARSE_OPT_NONEG),
OPT_BOOL_F(0, "done", &require_explicit_termination,
N_("require a terminating 'done' command"), PARSE_OPT_NONEG),
- OPT_UNSIGNED(0, "max-pack-size", &pack_size_limit,
- N_("maximum size of each output pack file")),
- OPT_UNSIGNED(0, "big-file-threshold", &big_file_threshold,
- N_("maximum size of a blob that will be deltified")),
- OPT_UNSIGNED(0, "depth", &max_depth,
- N_("maximum delta depth")),
- OPT_UNSIGNED(0, "active-branches", &max_active_branches,
- N_("maximum number of branches to maintain active")),
+ OPT_CALLBACK_F(0, "max-pack-size", NULL, N_("n"),
+ N_("maximum size of each output pack file"),
+ PARSE_OPT_NONEG, option_parse_max_pack_size),
+ OPT_CALLBACK_F(0, "big-file-threshold", NULL, N_("n"),
+ N_("maximum size of a blob that will be deltified"),
+ PARSE_OPT_NONEG, option_parse_big_file_threshold),
+ OPT_CALLBACK_F(0, "depth", NULL, N_("n"),
+ N_("maximum delta depth"),
+ PARSE_OPT_NONEG, option_parse_depth),
+ OPT_CALLBACK_F(0, "active-branches", NULL, N_("n"),
+ N_("maximum number of branches to maintain active"),
+ PARSE_OPT_NONEG, option_parse_active_branches),
OPT_GROUP(N_("Marks")),
- OPT_STRING_F(0, "import-marks", &import_marks_file, N_("file"),
- N_("import marks from <file>"), PARSE_OPT_NONEG),
- OPT_STRING_F(0, "import-marks-if-exists", &import_marks_if_exists, N_("file"),
- N_("import marks from <file> if it exists"), PARSE_OPT_NONEG),
- OPT_STRING_F(0, "export-marks", &export_marks_file, N_("file"),
- N_("dump marks to <file>"), PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "import-marks", &state, N_("file"),
+ N_("import marks from <file>"),
+ PARSE_OPT_NONEG, option_parse_import_marks),
+ OPT_CALLBACK_F(0, "import-marks-if-exists", &state, N_("file"),
+ N_("import marks from <file> if it exists"),
+ PARSE_OPT_NONEG, option_parse_import_marks_if_exists),
+ OPT_CALLBACK_F(0, "export-marks", &state, N_("file"),
+ N_("dump marks to <file>"),
+ PARSE_OPT_NONEG, option_parse_export_marks),
OPT_BOOL(0, "relative-marks", &relative_marks_paths,
N_("are --(import|export)-marks= paths relative to '.git/info/fast-import'?")),
OPT_GROUP(N_("Submodule rewrite")),
- OPT_STRING_F(0, "rewrite-submodules-from", &submodules_from, N_("name:filename"),
- N_("rewrite object IDs for submodule <name> from <filename>"),
- PARSE_OPT_NONEG),
- OPT_STRING_F(0, "rewrite-submodules-to", &submodules_to, N_("name:filename"),
- N_("rewrite object IDs for submodule <name> to <filename>"),
- PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "rewrite-submodules-from", &state, N_("name:filename"),
+ N_("rewrite object IDs for submodule <name> from <filename>"),
+ PARSE_OPT_NONEG, option_parse_rewrite_submodules_from),
+ OPT_CALLBACK_F(0, "rewrite-submodules-to", &state, N_("name:filename"),
+ N_("rewrite object IDs for submodule <name> to <filename>"),
+ PARSE_OPT_NONEG, option_parse_rewrite_submodules_to),
OPT_GROUP(N_("Signing")),
- OPT_STRING_F(0, "signed-commits", &signed_commits, N_("mode"),
- N_("how to handle signed commits"),
- PARSE_OPT_NONEG),
- OPT_STRING_F(0, "signed-tags", &signed_tags, N_("mode"),
- N_("how to handle signed tags"),
- PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "signed-commits", NULL, N_("mode"),
+ N_("how to handle signed commits"),
+ PARSE_OPT_NONEG, option_parse_signed_commits),
+ OPT_CALLBACK_F(0, "signed-tags", NULL, N_("mode"),
+ N_("how to handle signed tags"),
+ PARSE_OPT_NONEG, option_parse_signed_tags),
OPT_HIDDEN_GROUP(N_("Advanced")),
OPT_BOOL_F(0, "allow-unsafe-features", &state.allow_unsafe_features,
N_("allow unsafe mark commands from the stream"),
PARSE_OPT_HIDDEN | PARSE_OPT_NONEG),
- OPT_STRING_F(0, "export-pack-edges", &edges, N_("file"),
- N_("dump edge commits to <file>"),
- PARSE_OPT_HIDDEN | PARSE_OPT_NONEG),
- OPT_INTEGER_F(0, "cat-blob-fd", &cat_blob_fd,
- N_("write some responses to <fd> instead of stdout"),
- PARSE_OPT_HIDDEN | PARSE_OPT_NONEG),
+ OPT_CALLBACK_F(0, "export-pack-edges", &state, N_("file"),
+ N_("dump edge commits to <file>"),
+ PARSE_OPT_HIDDEN | PARSE_OPT_NONEG,
+ option_parse_export_pack_edges),
+ OPT_CALLBACK_F(0, "cat-blob-fd", &state, N_("fd"),
+ N_("write some responses to <fd> instead of stdout"),
+ PARSE_OPT_HIDDEN | PARSE_OPT_NONEG,
+ option_parse_cat_blob_fd),
OPT_END()
};
--
2.55.0.492.g44bba30fd7.dirty
next prev parent reply other threads:[~2026-08-04 10:04 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 16:55 [PATCH 0/7] fast-import: standardize usage string and SYNOPSIS Christian Couder
2026-07-16 16:55 ` [PATCH 1/7] parse-options: introduce OPT_HIDDEN_GROUP Christian Couder
2026-07-16 21:14 ` Junio C Hamano
2026-07-16 22:14 ` .mailmap etiquette (was "Re: [PATCH 1/7] parse-options: introduce OPT_HIDDEN_GROUP") D. Ben Knoble
2026-07-16 22:31 ` Junio C Hamano
2026-08-03 17:19 ` [PATCH 1/7] parse-options: introduce OPT_HIDDEN_GROUP Christian Couder
2026-07-16 16:55 ` [PATCH 2/7] api-parse-options.adoc: document per-option flags Christian Couder
2026-07-16 16:55 ` [PATCH 3/7] api-parse-options.adoc: document hidden and OPT_*_F option macros Christian Couder
2026-07-16 16:55 ` [PATCH 4/7] fast-import: localize 'i' into the 'for' loops using it Christian Couder
2026-07-16 16:55 ` [PATCH 5/7] fast-import: introduce 'struct fast_import_state' Christian Couder
2026-07-16 16:55 ` [PATCH 6/7] fast-import: move command state globals into " Christian Couder
2026-07-16 16:55 ` [PATCH 7/7] fast-import: use struct option for usage string Christian Couder
2026-07-16 21:35 ` Junio C Hamano
2026-08-03 17:23 ` Christian Couder
2026-08-04 10:03 ` [PATCH v2 00/12] fast-import: standardize usage string and SYNOPSIS Christian Couder
2026-08-04 10:03 ` [PATCH v2 01/12] parse-options: introduce OPT_HIDDEN_GROUP Christian Couder
2026-08-04 10:03 ` [PATCH v2 02/12] api-parse-options.adoc: document per-option flags Christian Couder
2026-08-08 7:25 ` Elijah Newren
2026-08-04 10:03 ` [PATCH v2 03/12] api-parse-options.adoc: document hidden and OPT_*_F option macros Christian Couder
2026-08-04 10:03 ` [PATCH v2 04/12] fast-import: localize 'i' into the 'for' loops using it Christian Couder
2026-08-04 10:03 ` [PATCH v2 05/12] fast-import: use int for some bool flags Christian Couder
2026-08-04 10:03 ` [PATCH v2 06/12] fast-import: factor out option_*() functions Christian Couder
2026-08-04 10:03 ` [PATCH v2 07/12] fast-import: introduce 'struct fast_import_state' Christian Couder
2026-08-08 7:25 ` Elijah Newren
2026-08-04 10:03 ` [PATCH v2 08/12] fast-import: move command state globals into " Christian Couder
2026-08-04 10:03 ` [PATCH v2 09/12] fast-import: use struct option for usage string Christian Couder
2026-08-04 10:03 ` Christian Couder [this message]
2026-08-04 10:03 ` [PATCH v2 11/12] fast-import: use parse_options() for command line options Christian Couder
2026-08-08 7:25 ` Elijah Newren
2026-08-04 10:03 ` [PATCH v2 12/12] fast-import: remove useless from_stream argument Christian Couder
2026-08-08 7:26 ` [PATCH v2 00/12] fast-import: standardize usage string and SYNOPSIS 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260804100355.1299498-11-christian.couder@gmail.com \
--to=christian.couder@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=newren@gmail.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=sandals@crustytoothpaste.net \
/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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox