From: Ramkumar Ramachandra <artagnon@gmail.com>
To: Git List <git@vger.kernel.org>
Cc: Junio C Hamano <gitster@pobox.com>,
Felipe Contreras <felipe.contreras@gmail.com>,
Jeff King <peff@peff.net>, Duy Nguyen <pclouds@gmail.com>
Subject: [PATCH 5/5] refs.c: make @ a pseudo-ref alias to HEAD
Date: Wed, 1 May 2013 21:50:35 +0530 [thread overview]
Message-ID: <1367425235-14998-6-git-send-email-artagnon@gmail.com> (raw)
In-Reply-To: <1367425235-14998-1-git-send-email-artagnon@gmail.com>
First, make sure that check_refname_format() rejects the a refname
beginning with a '@'. Add a test to t1400 (update-ref) demonstrating
that update-ref forbids the user from updating a ref named "@".
Now, resolve_ref_unsafe() is built to resolve any refs that have a
corresponding file inside $GITDIR. Our "@" ref is a special
pseudo-ref and does not have a filesystem counterpart. So,
hard-interpret "@" as "HEAD" and resolve .git/HEAD as usual. This
means that we can drop the 'git symbolic-ref @ HEAD' line in t1508
(at-combinations), and everything will continue working as usual.
If the user does manage to create a '.git/@' unsafely (via
symbolic-ref or otherwise), it will be ignored.
In practice, this means that you will now be able to do:
$ git show @~1
$ git log @^2
Advertise these features in the tests and documentation.
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
Documentation/git-check-ref-format.txt | 2 ++
Documentation/revisions.txt | 8 ++++++--
refs.c | 12 ++++++++++--
t/t1400-update-ref.sh | 3 +++
t/t1508-at-combinations.sh | 7 ++++---
5 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt
index ec1739a..3de9adc 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.txt
@@ -52,6 +52,8 @@ Git imposes the following rules on how references are named:
. They cannot end with a dot `.`.
+. They cannot be the single character `@`.
+
. They cannot contain a sequence `@{`.
. They cannot contain a `\`.
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index d477b3f..9b2e653 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -27,6 +27,10 @@ blobs contained in a commit.
When ambiguous, a '<refname>' is disambiguated by taking the
first match in the following rules:
+ . '@' is a special pseudo-ref that refers to HEAD. An '@' followed
+ by '\{' has no relationship to this and means something entirely
+ different (see below).
+
. If '$GIT_DIR/<refname>' exists, that is what you mean (this is usually
useful only for 'HEAD', 'FETCH_HEAD', 'ORIG_HEAD', 'MERGE_HEAD'
and 'CHERRY_PICK_HEAD');
@@ -93,7 +97,7 @@ some output processing may assume ref names in UTF-8.
refers to the branch that the branch specified by branchname is set to build on
top of. A missing branchname defaults to the current one.
-'<rev>{caret}', e.g. 'HEAD{caret}, v1.5.1{caret}0'::
+'<rev>{caret}', e.g. '@{caret}2', 'HEAD{caret}', 'v1.5.1{caret}0'::
A suffix '{caret}' to a revision parameter means the first parent of
that commit object. '{caret}<n>' means the <n>th parent (i.e.
'<rev>{caret}'
@@ -101,7 +105,7 @@ some output processing may assume ref names in UTF-8.
'<rev>{caret}0' means the commit itself and is used when '<rev>' is the
object name of a tag object that refers to a commit object.
-'<rev>{tilde}<n>', e.g. 'master{tilde}3'::
+'<rev>{tilde}<n>', e.g. '@{tilde}1', 'master{tilde}3'::
A suffix '{tilde}<n>' to a revision parameter means the commit
object that is the <n>th generation ancestor of the named
commit object, following only the first parents. I.e. '<rev>{tilde}3' is
diff --git a/refs.c b/refs.c
index de2d8eb..6a75f77 100644
--- a/refs.c
+++ b/refs.c
@@ -72,6 +72,9 @@ int check_refname_format(const char *refname, int flags)
{
int component_len, component_count = 0;
+ if (!strcmp(refname, "@"))
+ return -1;
+
while (1) {
/* We are at the start of a path component. */
component_len = check_refname_component(refname, flags);
@@ -1093,8 +1096,13 @@ const char *resolve_ref_unsafe(const char *refname, unsigned char *sha1, int rea
if (flag)
*flag = 0;
- if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
- return NULL;
+ if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) < 0) {
+ /* Handle the pseudo-ref @ */
+ if (!strcmp(refname, "@"))
+ refname = "HEAD";
+ else
+ return NULL;
+ }
for (;;) {
char path[PATH_MAX];
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index e415ee0..ee93979 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -127,6 +127,9 @@ test_expect_success '(not) change HEAD with wrong SHA1' "
test_expect_success "(not) changed .git/$m" "
! test $B"' = $(cat .git/'"$m"')
'
+test_expect_success 'disallow creating a ref with name @' '
+ test_must_fail git update-ref @ HEAD
+'
rm -f .git/$m
: a repository with working tree always has reflog these days...
diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh
index 73c457d..8f8e32d 100755
--- a/t/t1508-at-combinations.sh
+++ b/t/t1508-at-combinations.sh
@@ -54,12 +54,13 @@ nonsense "@{0}@{0}"
nonsense "@{1}@{u}"
nonsense "HEAD@{-1}"
-# Make sure that the @-parser isn't buggy; check things with
-# symbolic-ref @ pointing to HEAD.
-git symbolic-ref @ HEAD
+# Check everything with the pseudo-ref @
check "@@{1}" new-one
check "@@{now}" new-two
check "@@{u}" upstream-two
nonsense "@@{-1}"
+check "@~1" new-one
+check "@^0" new-two
+
test_done
--
1.8.3.rc0.24.g6456091
next prev parent reply other threads:[~2013-05-01 16:20 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-01 16:20 [PATCH 0/5] A natural solution to the @ -> HEAD problem Ramkumar Ramachandra
2013-05-01 16:20 ` [PATCH 1/5] t1508 (at-combinations): more tests; document failures Ramkumar Ramachandra
2013-05-01 18:53 ` Junio C Hamano
2013-05-01 21:04 ` Ramkumar Ramachandra
2013-05-01 21:16 ` Jeff King
2013-05-01 22:01 ` Ramkumar Ramachandra
2013-05-01 22:54 ` Junio C Hamano
2013-05-02 2:22 ` Felipe Contreras
2013-05-02 9:07 ` Ramkumar Ramachandra
2013-05-02 9:45 ` Felipe Contreras
2013-05-02 11:03 ` Ramkumar Ramachandra
2013-05-02 11:36 ` Ramkumar Ramachandra
2013-05-02 16:45 ` Felipe Contreras
2013-05-02 16:56 ` Ramkumar Ramachandra
2013-05-02 17:01 ` Felipe Contreras
2013-05-02 17:02 ` Ramkumar Ramachandra
2013-05-02 17:08 ` Felipe Contreras
2013-05-02 17:09 ` Ramkumar Ramachandra
2013-05-04 8:10 ` David Aguilar
2013-05-04 8:16 ` David Aguilar
2013-05-01 16:20 ` [PATCH 2/5] sha1_name.c: don't waste cycles in the @-parsing loop Ramkumar Ramachandra
2013-05-01 17:57 ` Felipe Contreras
2013-05-01 18:48 ` Ramkumar Ramachandra
2013-05-02 0:04 ` Junio C Hamano
2013-05-01 16:20 ` [PATCH 3/5] sha1_name.c: simplify @-parsing in get_sha1_basic() Ramkumar Ramachandra
2013-05-01 18:09 ` Felipe Contreras
2013-05-01 18:36 ` Ramkumar Ramachandra
2013-05-01 18:54 ` Jonathan Nieder
2013-05-01 19:55 ` Ramkumar Ramachandra
2013-05-01 19:23 ` Felipe Contreras
2013-05-01 19:40 ` Ramkumar Ramachandra
2013-05-01 22:18 ` Felipe Contreras
2013-05-01 22:26 ` Ramkumar Ramachandra
2013-05-01 22:39 ` Felipe Contreras
2013-05-01 22:06 ` Ramkumar Ramachandra
2013-05-01 16:20 ` [PATCH 4/5] remote.c: teach branch_get() to treat symrefs other than HEAD Ramkumar Ramachandra
2013-05-01 18:16 ` Felipe Contreras
2013-05-01 18:44 ` Ramkumar Ramachandra
2013-05-01 19:28 ` Felipe Contreras
2013-05-01 19:50 ` Ramkumar Ramachandra
2013-05-01 20:48 ` Felipe Contreras
2013-05-01 20:57 ` Ramkumar Ramachandra
2013-05-01 22:23 ` Felipe Contreras
2013-05-01 16:20 ` Ramkumar Ramachandra [this message]
2013-05-01 18:20 ` [PATCH 5/5] refs.c: make @ a pseudo-ref alias to HEAD Felipe Contreras
2013-05-01 19:00 ` Ramkumar Ramachandra
2013-05-01 19:31 ` Felipe Contreras
2013-05-01 19:51 ` Ramkumar Ramachandra
2013-05-01 21:49 ` [PATCH 0/5] A natural solution to the @ -> HEAD problem Ramkumar Ramachandra
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=1367425235-14998-6-git-send-email-artagnon@gmail.com \
--to=artagnon@gmail.com \
--cc=felipe.contreras@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/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).