From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 7/7 (v2)] checkout -: make "-" to mean "previous branch" everywhere
Date: Sat, 21 Mar 2009 17:58:20 -0700 [thread overview]
Message-ID: <7vskl69xw3.fsf_-_@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <1237673619-12608-8-git-send-email-gitster@pobox.com> (Junio C. Hamano's message of "Sat, 21 Mar 2009 15:13:39 -0700")
This is iffy, in that it teaches the very low level machinery to interpret
it as "the tip of the previous branch" when "-" is fed to it, and has a
high risk of unintended side effects.
This makes "git log ..-" to work as expected, which is marginally useful
because the revision parameter parser misinterprets the other direction
"git log -..". It also makes "git check-ref-format --branch -" to work,
which is not very useful because Porcelains can always ask for @{-1}.
It also makes a refname whose last component is "-" forbidden.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
builtin-checkout.c | 8 +++++---
refs.c | 3 +++
sha1_name.c | 21 +++++++++++++--------
3 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/builtin-checkout.c b/builtin-checkout.c
index 66df0c0..6b3b450 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -666,9 +666,11 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
arg = argv[0];
has_dash_dash = (argc > 1) && !strcmp(argv[1], "--");
- if (!strcmp(arg, "-"))
- arg = "@{-1}";
-
+ {
+ struct strbuf sb = STRBUF_INIT;
+ strbuf_branchname(&sb, arg);
+ arg = strbuf_detach(&sb, NULL);
+ }
if (get_sha1(arg, rev)) {
if (has_dash_dash) /* case (1) */
die("invalid reference: %s", arg);
diff --git a/refs.c b/refs.c
index e355489..7e27537 100644
--- a/refs.c
+++ b/refs.c
@@ -735,6 +735,9 @@ int check_ref_format(const char *ref)
if (!ch) {
if (ref <= cp - 2 && cp[-2] == '.')
return CHECK_REF_FORMAT_ERROR;
+ if (ref <= cp - 2 && cp[-2] == '-' &&
+ (cp - 3 < ref || cp[-3] == '/'))
+ return CHECK_REF_FORMAT_ERROR;
if (level < 2)
return CHECK_REF_FORMAT_ONELEVEL;
return ret;
diff --git a/sha1_name.c b/sha1_name.c
index 904bcd9..3972f4c 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -758,14 +758,19 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
const char *brace;
char *num_end;
- if (name[0] != '@' || name[1] != '{' || name[2] != '-')
- return -1;
- brace = strchr(name, '}');
- if (!brace)
- return -1;
- nth = strtol(name+3, &num_end, 10);
- if (num_end != brace)
- return -1;
+ if (name[0] == '-' && !name[1]) {
+ nth = 1;
+ brace = name; /* "end of branch name expression" */
+ } else {
+ if (name[0] != '@' || name[1] != '{' || name[2] != '-')
+ return -1;
+ brace = strchr(name, '}');
+ if (!brace)
+ return -1;
+ nth = strtol(name+3, &num_end, 10);
+ if (num_end != brace)
+ return -1;
+ }
if (nth <= 0)
return -1;
cb.alloc = nth;
--
1.6.2.1.299.gda643a
next prev parent reply other threads:[~2009-03-22 0:59 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-21 22:13 [PATCH 0/7] Clean up interpret_nth_last_branch feature Junio C Hamano
2009-03-21 22:13 ` [PATCH 1/7] check_ref_format(): tighten refname rules Junio C Hamano
2009-03-21 22:13 ` [PATCH 2/7] Rename interpret/substitute nth_last_branch functions Junio C Hamano
2009-03-21 22:13 ` [PATCH 3/7] check-ref-format --branch: give Porcelain a way to grok branch shorthand Junio C Hamano
2009-03-21 22:13 ` [PATCH 4/7] strbuf_branchname(): a wrapper for branch name shorthands Junio C Hamano
2009-03-21 22:13 ` [PATCH 5/7] Fix "branch -m @{-1} newname" Junio C Hamano
2009-03-21 22:13 ` [PATCH 6/7] strbuf_check_branch_ref(): a helper to check a refname for a branch Junio C Hamano
2009-03-21 22:13 ` [PATCH 7/7] checkout -: make "-" to mean "previous branch" everywhere Junio C Hamano
2009-03-22 0:58 ` Junio C Hamano [this message]
2009-03-22 10:18 ` [PATCH 3/7] check-ref-format --branch: give Porcelain a way to grok branch shorthand Bert Wesarg
2009-03-22 21:58 ` Junio C Hamano
2009-03-21 23:15 ` [PATCH 1/7] check_ref_format(): tighten refname rules Junio C Hamano
2009-03-22 14:41 ` Johannes Schindelin
2009-03-22 23:19 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vskl69xw3.fsf_-_@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).