Tags named '-'
Heya,
The functionality of git checkout - is very useful, and I am hopeful
that git merge - will eventually land, as it matches my workflow well as well. However, the porcelain is not entirely consistent about forbidding '-' as a ref name:
~/tmp $ git init
Initialized empty Git repository in /home/chmrr/tmp/.git/ ~/tmp (master #) $ git commit --allow-empty -m 'First commit' [master (root-commit) b7402ef] First commit
~/tmp (master) $ git checkout -b other
Switched to a new branch 'other'
~/tmp (other) $ git checkout -
Switched to branch 'master'
~/tmp (master) $ git checkout -b -
fatal: git checkout: we do not like '-' as a branch name. ~/tmp (master) $ git tag -
~/tmp (master) $ git tag -l
-
~/tmp (master) $ git checkout -
Switched to branch 'other'
The likely best fix is to disallow '-' as a tag name, as well, which would be handy because the typo of leaving off the 'l' on '-l', for example, which is not an uncommon mistake that I have seen.
- Alex
Quoted 1 line · Alex Vandiver
The likely best fix is to disallow '-' as a tag name, as well.
Sounds sane. Patches welcome.
[RFC/PATCH] tag: disallow '-' as tag name
Add strbuf_check_tag_ref() as helper to check a refname for a tag.
--- builtin/tag.c | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 deletions(-)
builtin/tag.c +22 -8
@@ -352,11 +352,26 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)return 0 ; } +static int strbuf_check_tag_ref (struct strbuf *sb,const char *name) +{ +if (name[0 ] =='-' ) +return CHECK_REF_FORMAT_ERROR ; + +strbuf_reset (sb); +strbuf_add (sb,"refs/tags/" ,10 ); +strbuf_add (sb, name,strlen (name)); + +if (sb->len >PATH_MAX ) +die (_ ("tag name too long: %.*s..." ),50 , name); + +return check_ref_format (sb->buf); +} +int cmd_tag (int argc,const char **argv,const char *prefix) {struct strbuf buf =STRBUF_INIT ; +struct strbuf ref =STRBUF_INIT ;unsigned char object[20 ], prev[20 ]; -char ref[PATH_MAX ];const char *object_ref, *tag;struct ref_lock *lock;
@@ -452,12 +467,10 @@ int cmd_tag(int argc, const char **argv, const char *prefix)if (get_sha1 (object_ref, object))die (_ ("Failed to resolve '%s' as a valid ref." ), object_ref); -if (snprintf (ref,sizeof (ref),"refs/tags/%s" , tag) >sizeof (ref) -1 ) -die (_ ("tag name too long: %.*s..." ),50 , tag); -if (check_ref_format (ref)) +if (strbuf_check_tag_ref (&ref, tag))die (_ ("'%s' is not a valid tag name." ), tag); -if (!resolve_ref (ref, prev,1 ,NULL )) +if (!resolve_ref (ref.buf, prev,1 ,NULL ))hashclr (prev);else if (!force)die (_ ("tag '%s' already exists" ), tag);
@@ -466,14 +479,15 @@ int cmd_tag(int argc, const char **argv, const char *prefix)create_tag (object, tag, &buf, msg.given || msgfile, sign, prev, object); - lock =lock_any_ref_for_update (ref, prev,0 ); + lock =lock_any_ref_for_update (ref.buf, prev,0 );if (!lock) -die (_ ("%s: cannot lock the ref" ), ref); +die (_ ("%s: cannot lock the ref" ), ref.buf);if (write_ref_sha1 (lock, object,NULL ) <0 ) -die (_ ("%s: cannot update the ref" ), ref); +die (_ ("%s: cannot update the ref" ), ref.buf);if (force &&hashcmp (prev, object))printf (_ ("Updated tag '%s' (was %s)\n" ), tag,find_unique_abbrev (prev,DEFAULT_ABBREV ));strbuf_release (&buf); +strbuf_release (&ref);return 0 ; }
Signature · 1 line
1.7.5.1
Re: [RFC/PATCH] tag: disallow '-' as tag name
Quoted 4 lines · Michael Schubert
Add
strbuf_check_tag_ref()as helper to check a refname for a tag.Signed-off-by Michael Schubert <[email protected]>---
That was quick ;-).
Quoted 8 lines
builtin/tag.c | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 deletions(-)builtin/tag.c +0
-0
builtin/tag.c static int parse_msg_arg(const struct option *opt, const char *arg, int unset) · line 358
Quoted 7 lines
builtin/tag.c +4
-0@@ -352,11 +352,26 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)return 0 ; } +static int strbuf_check_tag_ref (struct strbuf *sb,const char *name) +{ +if (name[0 ] =='-' ) +return CHECK_REF_FORMAT_ERROR ;
So contrary to what the title claims, it forbids a tag that begins with '-', e.g. '-foo', not just a single dash. That is fine by me (we do the same in strbuf-check-branch-ref) but it needs to be explained better.
builtin/tag.c static int parse_msg_arg(const struct option *opt, const char *arg, int unset) · line 362
Quoted 3 lines
builtin/tag.c +3
-0+strbuf_reset (sb); +strbuf_add (sb,"refs/tags/" ,10 ); +strbuf_add (sb, name,strlen (name));
strbuf_addf(sb, "refs/tags/%s", name)?
builtin/tag.c static int parse_msg_arg(const struct option *opt, const char *arg, int unset) · line 365
Quoted 2 lines
builtin/tag.c +2
-0+if (sb->len >PATH_MAX ) +die (_ ("tag name too long: %.*s..." ),50 , name);
I think that should be
if (PATH_MAX <= sb->len)
but I do not see the point of checking against PATH_MAX if you are already using a strbuf...
PATCH v2 1/1 tag: disallow '-' as tag name
Disallow '-' as tag name just as any tag name starting with '-' to be consistent with "git checkout".
Add strbuf_check_tag_ref() as helper to check a refname for a tag.
--- builtin/tag.c | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-)
builtin/tag.c +18 -8
@@ -352,11 +352,22 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)return 0 ; } +static int strbuf_check_tag_ref (struct strbuf *sb,const char *name) +{ +if (name[0 ] =='-' ) +return CHECK_REF_FORMAT_ERROR ; + +strbuf_reset (sb); +strbuf_addf (sb,"refs/tags/%s" , name); + +return check_ref_format (sb->buf); +} +int cmd_tag (int argc,const char **argv,const char *prefix) {struct strbuf buf =STRBUF_INIT ; +struct strbuf ref =STRBUF_INIT ;unsigned char object[20 ], prev[20 ]; -char ref[PATH_MAX ];const char *object_ref, *tag;struct ref_lock *lock;
@@ -452,12 +463,10 @@ int cmd_tag(int argc, const char **argv, const char *prefix)if (get_sha1 (object_ref, object))die (_ ("Failed to resolve '%s' as a valid ref." ), object_ref); -if (snprintf (ref,sizeof (ref),"refs/tags/%s" , tag) >sizeof (ref) -1 ) -die (_ ("tag name too long: %.*s..." ),50 , tag); -if (check_ref_format (ref)) +if (strbuf_check_tag_ref (&ref, tag))die (_ ("'%s' is not a valid tag name." ), tag); -if (!resolve_ref (ref, prev,1 ,NULL )) +if (!resolve_ref (ref.buf, prev,1 ,NULL ))hashclr (prev);else if (!force)die (_ ("tag '%s' already exists" ), tag);
@@ -466,14 +475,15 @@ int cmd_tag(int argc, const char **argv, const char *prefix)create_tag (object, tag, &buf, msg.given || msgfile, sign, prev, object); - lock =lock_any_ref_for_update (ref, prev,0 ); + lock =lock_any_ref_for_update (ref.buf, prev,0 );if (!lock) -die (_ ("%s: cannot lock the ref" ), ref); +die (_ ("%s: cannot lock the ref" ), ref.buf);if (write_ref_sha1 (lock, object,NULL ) <0 ) -die (_ ("%s: cannot update the ref" ), ref); +die (_ ("%s: cannot update the ref" ), ref.buf);if (force &&hashcmp (prev, object))printf (_ ("Updated tag '%s' (was %s)\n" ), tag,find_unique_abbrev (prev,DEFAULT_ABBREV ));strbuf_release (&buf); +strbuf_release (&ref);return 0 ; }
Signature · 1 line
1.7.5.1
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [RFC/PATCH v2] tag: disallow '-' as tag name
Quoted 7 lines · Sverre Rabbelier
Quoted 2 lines
Disallow '-' as tag name just as any tag name starting with '-' to be consistent with "git checkout".
This was hard for me to parse, how about::
Disallow '-' as tag name, as well as tag names starting with '-', to be consistent with "git checkout".
Thanks.
-- >8 --
Subject: [PATCH] tag: disallow '-' as tag name
Disallow '-' as tag name, as well as tag names starting with '-', to be consistent with "git checkout".
Add strbuf_check_tag_ref() as helper to check a refname for a tag.
--- builtin/tag.c | 26 ++++++++++++++++++-------- 1 files changed, 18 insertions(+), 8 deletions(-)
builtin/tag.c +18 -8
@@ -352,11 +352,22 @@ static int parse_msg_arg(const struct option *opt, const char *arg, int unset)return 0 ; } +static int strbuf_check_tag_ref (struct strbuf *sb,const char *name) +{ +if (name[0 ] =='-' ) +return CHECK_REF_FORMAT_ERROR ; + +strbuf_reset (sb); +strbuf_addf (sb,"refs/tags/%s" , name); + +return check_ref_format (sb->buf); +} +int cmd_tag (int argc,const char **argv,const char *prefix) {struct strbuf buf =STRBUF_INIT ; +struct strbuf ref =STRBUF_INIT ;unsigned char object[20 ], prev[20 ]; -char ref[PATH_MAX ];const char *object_ref, *tag;struct ref_lock *lock;
@@ -452,12 +463,10 @@ int cmd_tag(int argc, const char **argv, const char *prefix)if (get_sha1 (object_ref, object))die (_ ("Failed to resolve '%s' as a valid ref." ), object_ref); -if (snprintf (ref,sizeof (ref),"refs/tags/%s" , tag) >sizeof (ref) -1 ) -die (_ ("tag name too long: %.*s..." ),50 , tag); -if (check_ref_format (ref)) +if (strbuf_check_tag_ref (&ref, tag))die (_ ("'%s' is not a valid tag name." ), tag); -if (!resolve_ref (ref, prev,1 ,NULL )) +if (!resolve_ref (ref.buf, prev,1 ,NULL ))hashclr (prev);else if (!force)die (_ ("tag '%s' already exists" ), tag);
@@ -466,14 +475,15 @@ int cmd_tag(int argc, const char **argv, const char *prefix)create_tag (object, tag, &buf, msg.given || msgfile, sign, prev, object); - lock =lock_any_ref_for_update (ref, prev,0 ); + lock =lock_any_ref_for_update (ref.buf, prev,0 );if (!lock) -die (_ ("%s: cannot lock the ref" ), ref); +die (_ ("%s: cannot lock the ref" ), ref.buf);if (write_ref_sha1 (lock, object,NULL ) <0 ) -die (_ ("%s: cannot update the ref" ), ref); +die (_ ("%s: cannot update the ref" ), ref.buf);if (force &&hashcmp (prev, object))printf (_ ("Updated tag '%s' (was %s)\n" ), tag,find_unique_abbrev (prev,DEFAULT_ABBREV ));strbuf_release (&buf); +strbuf_release (&ref);return 0 ; }
Signature · 1 line
1.7.5.1
Heya,
Quoted 3 lines · Alex Vandiver
The functionality of
git checkout -is very useful, and I am hopeful thatgit merge -will eventually land, as it matches my workflow well as well.
Speaking of which, my cursory check of 'man git-checkout' did not give me any information on 'git checkout -'. ISTR it lets you check out the branch you were previously on, but I'm not sure. Is it undocumented, or am I missing it (entirely possible, searching for an option named '-' is somewhat difficult).
Signature · 3 lines
Cheers, Sverre Rabbelier