diff options
author | Clemens Buchacher <drizzd@aon.at> | 2012-04-14 23:04:48 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-04-16 00:33:31 +0400 |
commit | 6d5b93f29f5362b9b84954d87684705227984f9e (patch) | |
tree | 14a0838e5657c9e29630b057d99ec4f460553743 | |
parent | e8dde3e5f9ddb7cf95a6ff3cea6cf07c3a2db80d (diff) |
cherry-pick: do not expect file arguments
If a commit-ish passed to cherry-pick or revert happens to have a file
of the same name, git complains that the argument is ambiguous and
advises to use '--'. To make things worse, the '--' argument is removed
by parse_options, und so passing '--' has no effect.
Instead, always interpret cherry-pick/revert arguments as revisions.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin/revert.c | 5 | ||||
-rw-r--r-- | revision.c | 24 | ||||
-rw-r--r-- | revision.h | 1 |
3 files changed, 19 insertions, 11 deletions
diff --git a/builtin/revert.c b/builtin/revert.c index e6840f23dc..92f3fa5f57 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -181,12 +181,15 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts) if (opts->subcommand != REPLAY_NONE) { opts->revs = NULL; } else { + struct setup_revision_opt s_r_opt; opts->revs = xmalloc(sizeof(*opts->revs)); init_revisions(opts->revs, NULL); opts->revs->no_walk = 1; if (argc < 2) usage_with_options(usage_str, options); - argc = setup_revisions(argc, argv, opts->revs, NULL); + memset(&s_r_opt, 0, sizeof(s_r_opt)); + s_r_opt.assume_dashdash = 1; + argc = setup_revisions(argc, argv, opts->revs, &s_r_opt); } if (argc > 1) diff --git a/revision.c b/revision.c index b3554ed11b..9a0d9c7de2 100644 --- a/revision.c +++ b/revision.c @@ -1715,17 +1715,21 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s submodule = opt->submodule; /* First, search for "--" */ - seen_dashdash = 0; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; - if (strcmp(arg, "--")) - continue; - argv[i] = NULL; - argc = i; - if (argv[i + 1]) - append_prune_data(&prune_data, argv + i + 1); + if (opt && opt->assume_dashdash) { seen_dashdash = 1; - break; + } else { + seen_dashdash = 0; + for (i = 1; i < argc; i++) { + const char *arg = argv[i]; + if (strcmp(arg, "--")) + continue; + argv[i] = NULL; + argc = i; + if (argv[i + 1]) + append_prune_data(&prune_data, argv + i + 1); + seen_dashdash = 1; + break; + } } /* Second, deal with arguments and options */ diff --git a/revision.h b/revision.h index b8e9223954..1a0838473f 100644 --- a/revision.h +++ b/revision.h @@ -183,6 +183,7 @@ struct setup_revision_opt { const char *def; void (*tweak)(struct rev_info *, struct setup_revision_opt *); const char *submodule; + int assume_dashdash; }; extern void init_revisions(struct rev_info *revs, const char *prefix); |