On Wed, Jul 23, 2008 at 01:02:20AM +0000, Pierre Habouzit wrote: > Note that it also fix a bug, git checkout -- <path> would be badly > understood as git checkout <branch> if <path> is ambiguous with a branch. > > Testcases included. > > Signed-off-by: Pierre Habouzit <madcoder@xxxxxxxxxx> > --- > > A user on #git happened to have issues that made me realize that > builtin-checkout is badly broken wrt argument parseing. > > This clearly needs to be applied to master, probably to maint too. > > The patch is against next though, but should probably apply to other > branches just fine. > > > builtin-checkout.c | 9 +++++++-- > t/t2010-checkout-ambiguous.sh | 27 +++++++++++++++++++++++++++ > 2 files changed, 34 insertions(+), 2 deletions(-) > create mode 100755 t/t2010-checkout-ambiguous.sh > > diff --git a/builtin-checkout.c b/builtin-checkout.c > index fbd5105..1490e8e 100644 > --- a/builtin-checkout.c > +++ b/builtin-checkout.c > @@ -438,9 +438,14 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) > > opts.track = git_branch_track; > > - argc = parse_options(argc, argv, options, checkout_usage, 0); > - if (argc) { > + argc = parse_options(argc, argv, options, checkout_usage, > + PARSE_OPT_KEEP_DASHDASH); > + > + if (argc && strcmp(argv[0], "--")) { > arg = argv[0]; > + > + if (argc == 1 || strcmp(argv[1], "--")) > + verify_non_filename(NULL, arg); > if (get_sha1(arg, rev)) > ; > else if ((new.commit = lookup_commit_reference_gently(rev, 1))) { > diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh > new file mode 100755 > index 0000000..c1a86a2 > --- /dev/null > +++ b/t/t2010-checkout-ambiguous.sh > @@ -0,0 +1,26 @@ > +#!/bin/sh > + > +test_description='checkout and pathspecs/refspecs ambiguities' > + > +. ./test-lib.sh > + > +test_expect_success 'setup' ' > + echo hello >world && > + git add world && > + git commit -m initial && > + git branch world > +' > + > +test_expect_success 'branch switching' ' > + git checkout world -- > +' > + > +test_expect_success 'checkout world from the index' ' > + git checkout -- world > +' Okay those two tests are stupid in the sense that they don't check git-checkout does what it's supposed to do. One should check the first one outputs 'Switched to branch "world"' and the second should rather be: ' echo "bye bye" > world && git checkout -- world && git diff --quiet --exit-code '
Attachment:
pgpUSntVkakKO.pgp
Description: PGP signature