This is a preparation step for introducing new commands that do parts
of what checkout does. There will be two new commands, one is about
switching branches, detaching HEAD... one about checking out
paths. These share the a subset of command line options. The rest of
command line options are separate.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/checkout.c | 80 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 56 insertions(+), 24 deletions(-)

diff --git a/builtin/checkout.c b/builtin/checkout.c
index a50c51f287..d9dbd2d40d 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1226,14 +1226,32 @@ static int checkout_branch(struct checkout_opts *opts,
        return switch_branches(opts, new_branch_info);
 }
 
-int cmd_checkout(int argc, const char **argv, const char *prefix)
+static struct option *add_common_options(struct checkout_opts *opts,
+                                        struct option *prevopts)
 {
-       struct checkout_opts real_opts;
-       struct checkout_opts *opts = &real_opts;
-       struct branch_info new_branch_info;
-       int dwim_remotes_matched = 0;
        struct option options[] = {
                OPT__QUIET(&opts->quiet, N_("suppress progress reporting")),
+               OPT_BOOL(0, "ignore-skip-worktree-bits", 
&opts->ignore_skipworktree,
+                        N_("do not limit pathspecs to sparse entries only")),
+               { OPTION_CALLBACK, 0, "recurse-submodules", NULL,
+                           "checkout", "control recursive updating of 
submodules",
+                           PARSE_OPT_OPTARG, 
option_parse_recurse_submodules_worktree_updater },
+               OPT_BOOL(0, "progress", &opts->show_progress, N_("force 
progress reporting")),
+               OPT__FORCE(&opts->force, N_("force checkout (throw away local 
modifications)"),
+                          PARSE_OPT_NOCOMPLETE),
+               OPT_STRING(0, "conflict", &opts->conflict_style, N_("style"),
+                          N_("conflict style (merge or diff3)")),
+               OPT_END()
+       };
+       struct option *newopts = parse_options_concat(prevopts, options);
+       free(prevopts);
+       return newopts;
+}
+
+static struct option *add_switch_branch_options(struct checkout_opts *opts,
+                                               struct option *prevopts)
+{
+       struct option options[] = {
                OPT_STRING('b', NULL, &opts->new_branch, N_("branch"),
                           N_("create and checkout a new branch")),
                OPT_STRING('B', NULL, &opts->new_branch_force, N_("branch"),
@@ -1243,33 +1261,43 @@ int cmd_checkout(int argc, const char **argv, const 
char *prefix)
                OPT_SET_INT('t', "track",  &opts->track, N_("set upstream info 
for new branch"),
                        BRANCH_TRACK_EXPLICIT),
                OPT_STRING(0, "orphan", &opts->new_orphan_branch, 
N_("new-branch"), N_("new unparented branch")),
+               OPT_BOOL('m', "merge", &opts->merge, N_("perform a 3-way merge 
with the new branch")),
+               OPT_HIDDEN_BOOL(0, "guess", &opts->dwim_new_local_branch,
+                               N_("second guess 'git checkout 
<no-such-branch>'")),
+               OPT_BOOL(0, "ignore-other-worktrees", 
&opts->ignore_other_worktrees,
+                        N_("do not check if another worktree is holding the 
given ref")),
+               OPT_END()
+       };
+       struct option *newopts = parse_options_concat(prevopts, options);
+       free(prevopts);
+       return newopts;
+}
+
+static struct option *add_checkout_path_options(struct checkout_opts *opts,
+                                               struct option *prevopts)
+{
+       struct option options[] = {
                OPT_SET_INT_F('2', "ours", &opts->writeout_stage,
                              N_("checkout our version for unmerged files"),
                              2, PARSE_OPT_NONEG),
                OPT_SET_INT_F('3', "theirs", &opts->writeout_stage,
                              N_("checkout their version for unmerged files"),
                              3, PARSE_OPT_NONEG),
-               OPT__FORCE(&opts->force, N_("force checkout (throw away local 
modifications)"),
-                          PARSE_OPT_NOCOMPLETE),
-               OPT_BOOL('m', "merge", &opts->merge, N_("perform a 3-way merge 
with the new branch")),
-               OPT_BOOL_F(0, "overwrite-ignore", &opts->overwrite_ignore,
-                          N_("update ignored files (default)"),
-                          PARSE_OPT_NOCOMPLETE),
-               OPT_STRING(0, "conflict", &opts->conflict_style, N_("style"),
-                          N_("conflict style (merge or diff3)")),
                OPT_BOOL('p', "patch", &opts->patch_mode, N_("select hunks 
interactively")),
-               OPT_BOOL(0, "ignore-skip-worktree-bits", 
&opts->ignore_skipworktree,
-                        N_("do not limit pathspecs to sparse entries only")),
-               OPT_HIDDEN_BOOL(0, "guess", &opts->dwim_new_local_branch,
-                               N_("second guess 'git checkout 
<no-such-branch>'")),
-               OPT_BOOL(0, "ignore-other-worktrees", 
&opts->ignore_other_worktrees,
-                        N_("do not check if another worktree is holding the 
given ref")),
-               { OPTION_CALLBACK, 0, "recurse-submodules", NULL,
-                           "checkout", "control recursive updating of 
submodules",
-                           PARSE_OPT_OPTARG, 
option_parse_recurse_submodules_worktree_updater },
-               OPT_BOOL(0, "progress", &opts->show_progress, N_("force 
progress reporting")),
-               OPT_END(),
+               OPT_END()
        };
+       struct option *newopts = parse_options_concat(prevopts, options);
+       free(prevopts);
+       return newopts;
+}
+
+int cmd_checkout(int argc, const char **argv, const char *prefix)
+{
+       struct checkout_opts real_opts;
+       struct checkout_opts *opts = &real_opts;
+       struct branch_info new_branch_info;
+       int dwim_remotes_matched = 0;
+       struct option *options = NULL;
 
        memset(opts, 0, sizeof(*opts));
        memset(&new_branch_info, 0, sizeof(new_branch_info));
@@ -1282,6 +1310,10 @@ int cmd_checkout(int argc, const char **argv, const char 
*prefix)
 
        opts->track = BRANCH_TRACK_UNSPECIFIED;
 
+       options = add_common_options(opts, options);
+       options = add_switch_branch_options(opts, options);
+       options = add_checkout_path_options(opts, options);
+
        argc = parse_options(argc, argv, prefix, options, checkout_usage,
                             PARSE_OPT_KEEP_DASHDASH);
 
-- 
2.19.1.1327.g328c130451.dirty

Reply via email to