summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-03-16 11:11:42 -0400
committerJunio C Hamano <gitster@pobox.com>2015-03-16 12:05:38 -0700
commitd40f108d42fd1d4d2064416629eb987dafb2b113 (patch)
tree955223b1eea94fc481a6da91e4c30b879a2f207c
parent52cae643c5d49b7fa18a7a4c60c284f9ae2e2c71 (diff)
downloadgit-jc/a-lone-dash-stands-for-previous-branch.tar.gz
"-" and "@{-1}" on various programsjc/a-lone-dash-stands-for-previous-branch
JFF stands for just for fun. This is not meant to give out a model answer and is known to be incomplete, but I was wondering if it would be a better direction to allow "-" as a stand-in for "@{-1}" everywhere we allow a branch name, losing workarounds at the surface level we have for checkout, merge and revert. The first three paths are to remove the surface workarounds that become unnecessary. The one in sha1_name.c is the central change. The change in revision.c is to allow a single "-" to be recognized as a potential revision name (without this change, what begins with "-" is either an option or an unknown option). So you could do things like "git reset - $path" but also things like "git log -" after switching out of a branch. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-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)