summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/checkout.c3
-rw-r--r--builtin/merge.c3
-rw-r--r--builtin/revert.c2
-rw-r--r--revision.c2
-rw-r--r--sha1_name.c57
5 files changed, 37 insertions, 30 deletions
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 3e141fc149..f86bad7fdb 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -951,9 +951,6 @@ static int parse_branchname_arg(int argc, const char **argv,
else if (dash_dash_pos >= 2)
die(_("only one reference expected, %d given."), dash_dash_pos);
- if (!strcmp(arg, "-"))
- arg = "@{-1}";
-
if (get_sha1_mb(arg, rev)) {
/*
* Either case (3) or (4), with <something> not being
diff --git a/builtin/merge.c b/builtin/merge.c
index 3b0f8f96d4..03b260f1dc 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1164,8 +1164,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
argc = setup_with_upstream(&argv);
else
die(_("No commit specified and merge.defaultToUpstream not set."));
- } else if (argc == 1 && !strcmp(argv[0], "-"))
- argv[0] = "@{-1}";
+ }
}
if (!argc)
usage_with_options(builtin_merge_usage,
diff --git a/builtin/revert.c b/builtin/revert.c
index 56a2c36669..dc98b4e8ac 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -170,8 +170,6 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
opts->revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
if (argc < 2)
usage_with_options(usage_str, options);
- if (!strcmp(argv[1], "-"))
- argv[1] = "@{-1}";
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);
diff --git a/revision.c b/revision.c
index 66520c671e..570945a10e 100644
--- a/revision.c
+++ b/revision.c
@@ -2198,7 +2198,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
read_from_stdin = 0;
for (left = i = 1; i < argc; i++) {
const char *arg = argv[i];
- if (*arg == '-') {
+ if (arg[0] == '-' && arg[1] && !starts_with(arg + 1, "..")) {
int opts;
opts = handle_revision_pseudo_opt(submodule,
diff --git a/sha1_name.c b/sha1_name.c
index 95f9f8fa1a..7a621ba81b 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -483,6 +483,8 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
break;
}
}
+ } else if (len == 1 && str[0] == '-') {
+ nth_prior = 1;
}
/* Accept only unambiguous ref paths. */
@@ -491,13 +493,16 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
if (nth_prior) {
struct strbuf buf = STRBUF_INIT;
- int detached;
+ int status;
if (interpret_nth_prior_checkout(str, len, &buf) > 0) {
- detached = (buf.len == 40 && !get_sha1_hex(buf.buf, sha1));
+ if (get_sha1(buf.buf, sha1))
+ /* bad---the previous branch no longer exists? */
+ status = -1;
+ else
+ status = 0; /* detached */
strbuf_release(&buf);
- if (detached)
- return 0;
+ return status;
}
}
@@ -931,35 +936,43 @@ static int interpret_nth_prior_checkout(const char *name, int namelen,
struct strbuf *buf)
{
long nth;
- int retval;
+ int consumed;
struct grab_nth_branch_switch_cbdata cb;
- const char *brace;
- char *num_end;
- if (namelen < 4)
- return -1;
- if (name[0] != '@' || name[1] != '{' || name[2] != '-')
- return -1;
- brace = memchr(name, '}', namelen);
- if (!brace)
- return -1;
- nth = strtol(name + 3, &num_end, 10);
- if (num_end != brace)
- return -1;
- if (nth <= 0)
- return -1;
+ if (namelen == 1 && name[0] == '-') {
+ nth = 1;
+ consumed = 1;
+ } else {
+ const char *brace;
+ char *num_end;
+
+ if (namelen < 4)
+ return -1;
+ if (name[0] != '@' || name[1] != '{' || name[2] != '-')
+ return -1;
+ brace = memchr(name, '}', namelen);
+ if (!brace)
+ return -1;
+ nth = strtol(name + 3, &num_end, 10);
+ if (num_end != brace)
+ return -1;
+ if (nth <= 0)
+ return -1;
+ consumed = brace - name + 1;
+ }
+
cb.remaining = nth;
strbuf_init(&cb.buf, 20);
- retval = 0;
if (0 < for_each_reflog_ent_reverse("HEAD", grab_nth_branch_switch, &cb)) {
strbuf_reset(buf);
strbuf_addbuf(buf, &cb.buf);
- retval = brace - name + 1;
+ } else {
+ consumed = 0;
}
strbuf_release(&cb.buf);
- return retval;
+ return consumed;
}
int get_sha1_mb(const char *name, unsigned char *sha1)