From: Alexandr Miloslavskiy <alexandr.miloslavskiy@xxxxxxxxxxx> `dash_dash_pos` was only calculated under `opts->accept_pathspec`. This is unexpected to readers and made it harder to reason about the code. Fix this by restoring the expected meaning. Simplify the code by dropping `argcount` and useless `argc` / `argv` manipulations. This should not change behavior in any way. Signed-off-by: Alexandr Miloslavskiy <alexandr.miloslavskiy@xxxxxxxxxxx> --- builtin/checkout.c | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index b847695d2b..f35fe2cc26 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -1152,7 +1152,6 @@ static int parse_branchname_arg(int argc, const char **argv, struct object_id *rev) { const char **new_branch = &opts->new_branch; - int argcount = 0; const char *arg; int dash_dash_pos; int has_dash_dash = 0; @@ -1211,17 +1210,21 @@ static int parse_branchname_arg(int argc, const char **argv, arg = argv[0]; dash_dash_pos = -1; for (i = 0; i < argc; i++) { - if (opts->accept_pathspec && !strcmp(argv[i], "--")) { + if (!strcmp(argv[i], "--")) { dash_dash_pos = i; break; } } - if (dash_dash_pos == 0) - return 1; /* case (2) */ - else if (dash_dash_pos == 1) - has_dash_dash = 1; /* case (3) or (1) */ - else if (dash_dash_pos >= 2) - die(_("only one reference expected, %d given."), dash_dash_pos); + + if (opts->accept_pathspec) { + if (dash_dash_pos == 0) + return 1; /* case (2) */ + else if (dash_dash_pos == 1) + has_dash_dash = 1; /* case (3) or (1) */ + else if (dash_dash_pos >= 2) + die(_("only one reference expected, %d given."), dash_dash_pos); + } + opts->count_checkout_paths = !opts->quiet && !has_dash_dash; if (!strcmp(arg, "-")) @@ -1268,15 +1271,10 @@ static int parse_branchname_arg(int argc, const char **argv, if (!recover_with_dwim) { if (has_dash_dash) die(_("invalid reference: %s"), arg); - return argcount; + return 0; } } - /* we can't end up being in (2) anymore, eat the argument */ - argcount++; - argv++; - argc--; - setup_new_branch_info_and_source_tree(new_branch_info, opts, rev, arg); if (!opts->source_tree) /* case (1): want a tree */ @@ -1289,15 +1287,11 @@ static int parse_branchname_arg(int argc, const char **argv, * even if there happen to be a file called 'branch'; * it would be extremely annoying. */ - if (argc) + if (argc > 1) verify_non_filename(opts->prefix, arg); - } else if (opts->accept_pathspec) { - argcount++; - argv++; - argc--; } - return argcount; + return (dash_dash_pos == 1) ? 2 : 1; } static int switch_unborn_to_new_branch(const struct checkout_opts *opts) -- gitgitgadget