summaryrefslogtreecommitdiff
path: root/builtin/checkout.c
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2019-03-29 10:39:09 (GMT)
committerJunio C Hamano <gitster@pobox.com>2019-04-02 04:56:59 (GMT)
commit5c06e26903fd69cf7a71bf2cf8281a84868525b0 (patch)
tree76433aafa9e378c4f4f2d5a1f35c562be85175c5 /builtin/checkout.c
parent492ededc263e48d1a261dd694642ca53be4939e4 (diff)
downloadgit-5c06e26903fd69cf7a71bf2cf8281a84868525b0.zip
git-5c06e26903fd69cf7a71bf2cf8281a84868525b0.tar.gz
git-5c06e26903fd69cf7a71bf2cf8281a84868525b0.tar.bz2
switch: stop accepting pathspec
This command is about switching branch (or creating a new one) and should not accept pathspec. This helps simplify ambiguation handling. The other two ("git checkout" and "git restore") of course do accept pathspec as before. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/checkout.c')
-rw-r--r--builtin/checkout.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/builtin/checkout.c b/builtin/checkout.c
index d63116b..0584dc4 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -54,6 +54,7 @@ struct checkout_opts {
int overlay_mode;
int no_dwim_new_local_branch;
int discard_changes;
+ int accept_pathspec;
/*
* If new checkout options are added, skip_merge_working_tree
@@ -1176,10 +1177,16 @@ static int parse_branchname_arg(int argc, const char **argv,
if (!argc)
return 0;
+ if (!opts->accept_pathspec) {
+ if (argc > 1)
+ die(_("only one reference expected"));
+ has_dash_dash = 1; /* helps disambiguate */
+ }
+
arg = argv[0];
dash_dash_pos = -1;
for (i = 0; i < argc; i++) {
- if (!strcmp(argv[i], "--")) {
+ if (opts->accept_pathspec && !strcmp(argv[i], "--")) {
dash_dash_pos = i;
break;
}
@@ -1213,11 +1220,12 @@ static int parse_branchname_arg(int argc, const char **argv,
recover_with_dwim = 0;
/*
- * Accept "git checkout foo" and "git checkout foo --"
- * as candidates for dwim.
+ * Accept "git checkout foo", "git checkout foo --"
+ * and "git switch foo" as candidates for dwim.
*/
if (!(argc == 1 && !has_dash_dash) &&
- !(argc == 2 && has_dash_dash))
+ !(argc == 2 && has_dash_dash) &&
+ opts->accept_pathspec)
recover_with_dwim = 0;
if (recover_with_dwim) {
@@ -1262,7 +1270,7 @@ static int parse_branchname_arg(int argc, const char **argv,
*/
if (argc)
verify_non_filename(opts->prefix, arg);
- } else {
+ } else if (opts->accept_pathspec) {
argcount++;
argv++;
argc--;
@@ -1585,6 +1593,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
memset(&opts, 0, sizeof(opts));
opts.no_dwim_new_local_branch = 0;
+ opts.accept_pathspec = 1;
options = parse_options_dup(checkout_options);
options = add_common_options(&opts, options);
@@ -1614,6 +1623,7 @@ int cmd_switch(int argc, const char **argv, const char *prefix)
memset(&opts, 0, sizeof(opts));
opts.no_dwim_new_local_branch = 0;
+ opts.accept_pathspec = 0;
options = parse_options_dup(switch_options);
options = add_common_options(&opts, options);