@@ -557,6 +557,11 @@ static int bisect_auto_next(struct bisect_terms *terms, const char *prefix)
return 0;
}
+static inline char *dequote_arg(const char *arg)
+{
+ return arg[0] != '\'' ? xstrdup(arg) : sq_dequote(xstrdup(arg));
+}
+
static int bisect_start(struct bisect_terms *terms, int no_checkout,
const char **argv, int argc)
{
@@ -577,15 +582,22 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
* Check for one bad and then some good revisions
*/
for (i = 0; i < argc; i++) {
- if (!strcmp(argv[i], "--")) {
+ char *arg = dequote_arg(argv[i]);
+
+ if (!strcmp(arg, "--")) {
has_double_dash = 1;
+ free(arg);
break;
}
+ free(arg);
}
for (i = 0; i < argc; i++) {
- const char *arg = argv[i];
- if (!strcmp(argv[i], "--")) {
+ char *dequoted = dequote_arg(argv[i]);
+ const char *arg = dequoted;
+
+ if (!strcmp(arg, "--")) {
+ free(dequoted);
break;
} else if (!strcmp(arg, "--no-checkout")) {
no_checkout = 1;
@@ -593,7 +605,7 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
!strcmp(arg, "--term-old")) {
must_write_terms = 1;
free((void *) terms->term_good);
- terms->term_good = xstrdup(argv[++i]);
+ terms->term_good = dequote_arg(argv[++i]);
} else if (skip_prefix(arg, "--term-good=", &arg) ||
skip_prefix(arg, "--term-old=", &arg)) {
must_write_terms = 1;
@@ -603,24 +615,31 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
!strcmp(arg, "--term-new")) {
must_write_terms = 1;
free((void *) terms->term_bad);
- terms->term_bad = xstrdup(argv[++i]);
+ terms->term_bad = dequote_arg(argv[++i]);
} else if (skip_prefix(arg, "--term-bad=", &arg) ||
skip_prefix(arg, "--term-new=", &arg)) {
must_write_terms = 1;
free((void *) terms->term_bad);
terms->term_bad = xstrdup(arg);
} else if (starts_with(arg, "--") &&
- !one_of(arg, "--term-good", "--term-bad", NULL)) {
- return error(_("unrecognized option: '%s'"), arg);
+ !one_of(arg, "--term-good", "--term-bad", NULL)) {
+ error(_("unrecognized option: '%s'"), arg);
+ free(dequoted);
+ return -1;
} else {
char *commit_id = xstrfmt("%s^{commit}", arg);
- if (get_oid(commit_id, &oid) && has_double_dash)
- die(_("'%s' does not appear to be a valid "
- "revision"), arg);
+ if (get_oid(commit_id, &oid) && has_double_dash) {
+ error(_("'%s' does not appear to be a valid "
+ "revision"), arg);
+ free(commit_id);
+ free(dequoted);
+ return -1;
+ }
string_list_append(&revs, oid_to_hex(&oid));
free(commit_id);
}
+ free(dequoted);
}
pathspec_pos = i;