git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Stefan Beller <sbeller@google.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Duy Nguyen <pclouds@gmail.com>,
	"git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: [PATCH] attr: expose validity check for attribute names
Date: Wed, 18 May 2016 14:42:07 -0700	[thread overview]
Message-ID: <CAGZ79kYkeF-YTYqsLSsESWLcXmX5Dx-NdCnzmeBiRRnotZ49dA@mail.gmail.com> (raw)
In-Reply-To: <xmqqh9dvqdoy.fsf_-_@gitster.mtv.corp.google.com>

On Wed, May 18, 2016 at 2:05 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Export attr_name_valid() function, and a helper function that
> returns the message to be given when a given <name, len> pair
> is not a good name for an attribute.
>
> We could later update the message to exactly spell out what the
> rules for a good attribute name are, etc.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  * And then finally the error message one.  I didn't change
>    the message itself to spell out the rules here, though.
>
>  attr.c | 39 +++++++++++++++++++++++++--------------
>  attr.h |  3 +++
>  2 files changed, 28 insertions(+), 14 deletions(-)
>
> diff --git a/attr.c b/attr.c
> index 7f20e21..8f54871 100644
> --- a/attr.c
> +++ b/attr.c
> @@ -59,23 +59,38 @@ static unsigned hash_name(const char *name, int namelen)
>         return val;
>  }
>
> -static int invalid_attr_name(const char *name, int namelen)
> +int attr_name_valid(const char *name, size_t namelen)

Mental note:
The patch series with the pathspec attrs on top of this series makes this
non-static and exposes the invalid_attr_name for wider use, so I'll resolve
the merge conflict accordingly.

>  {
>         /*
>          * Attribute name cannot begin with '-' and must consist of
>          * characters from [-A-Za-z0-9_.].
>          */
>         if (namelen <= 0 || *name == '-')
> -               return -1;
> +               return 0;
>         while (namelen--) {
>                 char ch = *name++;
>                 if (! (ch == '-' || ch == '.' || ch == '_' ||
>                        ('0' <= ch && ch <= '9') ||
>                        ('a' <= ch && ch <= 'z') ||
>                        ('A' <= ch && ch <= 'Z')) )
> -                       return -1;
> +                       return 0;
>         }
> -       return 0;
> +       return -1;
> +}
> +
> +void invalid_attr_name_message(struct strbuf *err, const char *name, int len)
> +{
> +       strbuf_addf(err, _("%.*s is not a valid attribute name"),
> +                   len, name);
> +}
> +
> +static void report_invalid_attr(const char *name, size_t len,
> +                               const char *src, int lineno)
> +{
> +       struct strbuf err = STRBUF_INIT;
> +       invalid_attr_name_message(&err, name, len);
> +       fprintf(stderr, "%s: %s:%d\n", err.buf, src, lineno);
> +       strbuf_release(&err);
>  }
>
>  struct git_attr *git_attr_counted(const char *name, size_t len)
> @@ -90,7 +105,7 @@ struct git_attr *git_attr_counted(const char *name, size_t len)
>                         return a;
>         }
>
> -       if (invalid_attr_name(name, len))
> +       if (!attr_name_valid(name, len))
>                 return NULL;
>
>         FLEX_ALLOC_MEM(a, name, name, len);
> @@ -176,17 +191,15 @@ static const char *parse_attr(const char *src, int lineno, const char *cp,
>                         cp++;
>                         len--;
>                 }
> -               if (invalid_attr_name(cp, len)) {
> -                       fprintf(stderr,
> -                               "%.*s is not a valid attribute name: %s:%d\n",
> -                               len, cp, src, lineno);
> +               if (!attr_name_valid(cp, len)) {
> +                       report_invalid_attr(cp, len, src, lineno);
>                         return NULL;
>                 }
>         } else {
>                 /*
>                  * As this function is always called twice, once with
>                  * e == NULL in the first pass and then e != NULL in
> -                * the second pass, no need for invalid_attr_name()
> +                * the second pass, no need for attr_name_valid()
>                  * check here.
>                  */
>                 if (*cp == '-' || *cp == '!') {
> @@ -229,10 +242,8 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
>                 name += strlen(ATTRIBUTE_MACRO_PREFIX);
>                 name += strspn(name, blank);
>                 namelen = strcspn(name, blank);
> -               if (invalid_attr_name(name, namelen)) {
> -                       fprintf(stderr,
> -                               "%.*s is not a valid attribute name: %s:%d\n",
> -                               namelen, name, src, lineno);
> +               if (!attr_name_valid(name, namelen)) {
> +                       report_invalid_attr(name, namelen, src, lineno);
>                         return NULL;
>                 }
>         }
> diff --git a/attr.h b/attr.h
> index 78d6d5a..fc72030 100644
> --- a/attr.h
> +++ b/attr.h
> @@ -13,6 +13,9 @@ extern struct git_attr *git_attr(const char *);
>  /* The same, but with counted string */
>  extern struct git_attr *git_attr_counted(const char *, size_t);
>
> +extern int attr_name_valid(const char *name, size_t namelen);

ok, I agree with this one.

> +extern void invalid_attr_name_message(struct strbuf *, const char *, int);

This makes sense, too, so the caller can just collect the error message and
attach its own flair to it, i.e. another message to explain the context about
wrong attributes.

Thanks,
Stefan

> +
>  /* Internal use */
>  extern const char git_attr__true[];
>  extern const char git_attr__false[];
> --
> 2.8.2-759-geb611ab
>

  reply	other threads:[~2016-05-18 21:42 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-18 19:02 [PATCHv7 0/5] pathspec magic extension to search for attributes Stefan Beller
2016-05-18 19:02 ` [PATCHv7 1/5] string list: improve comment Stefan Beller
2016-05-18 19:02 ` [PATCHv7 2/5] Documentation: fix a typo Stefan Beller
2016-05-18 19:02 ` [PATCHv7 3/5] pathspec: move long magic parsing out of prefix_pathspec Stefan Beller
2016-05-18 19:02 ` [PATCHv7 4/5] pathspec: move prefix check out of the inner loop Stefan Beller
2016-05-18 19:02 ` [PATCHv7 5/5] pathspec: allow querying for attributes Stefan Beller
2016-05-18 19:42   ` Stefan Beller
2016-05-18 19:47   ` Junio C Hamano
2016-05-18 20:00     ` Junio C Hamano
2016-05-18 20:21     ` Junio C Hamano
2016-05-18 21:01       ` [PATCH] attr: add counted string version of git_check_attr() Junio C Hamano
2016-05-18 21:03       ` [PATCH] attr: add counted string version of git_attr() Junio C Hamano
2016-05-18 21:36         ` Stefan Beller
2016-05-18 21:05       ` [PATCH] attr: expose validity check for attribute names Junio C Hamano
2016-05-18 21:42         ` Stefan Beller [this message]
2016-05-18 22:31     ` [PATCHv7 5/5] pathspec: allow querying for attributes Stefan Beller
2016-05-18 22:59       ` 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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAGZ79kYkeF-YTYqsLSsESWLcXmX5Dx-NdCnzmeBiRRnotZ49dA@mail.gmail.com \
    --to=sbeller@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=pclouds@gmail.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).