git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/5] attr.c: pass struct git_attr_check down the callchain

From
Stefan Beller <sbeller@google.com>
Date
Jun 8, 2016, 23:54 UTC
Message-ID
<CAGZ79kZ0uSvTgc9YnVKg01PtRcG4vuhUE+TZoPadT8Xqeqi=Tg@mail.gmail.com>
In-Reply-To
<20160608225818.726-3-gitster@pobox.com>
On Wed, Jun 8, 2016 at 3:58 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 66 quoted lines
> The callchain that starts from git_check_attrs() down to
> collect_some_attrs() used to take an array of git_attr_check_elem
> as their parameters.  Pass the enclosing git_attr_check instance
> instead, so that they will have access to new fields we will add to
> the data structure.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  attr.c | 36 ++++++++++++++++++++++++------------
>  1 file changed, 24 insertions(+), 12 deletions(-)
>
> diff --git a/attr.c b/attr.c
> index 26228ce..4e2172a 100644
> --- a/attr.c
> +++ b/attr.c
> @@ -746,14 +746,25 @@ static int macroexpand_one(int nr, int rem)
>   * check_all_attr. If num is non-zero, only attributes in check[] are
>   * collected. Otherwise all attributes are collected.
>   */
> -static void collect_some_attrs(const char *path, int pathlen, int num,
> -                              struct git_attr_check_elem *check)
> +static void collect_some_attrs(const char *path, int pathlen,
> +                              struct git_attr_check *check)
>
>  {
>         struct attr_stack *stk;
>         int i, rem, dirlen;
>         const char *cp, *last_slash = NULL;
>         int basename_offset;
> +       int num;
> +       struct git_attr_check_elem *celem;
> +
> +       if (!check) {
> +               /* Yuck - ugly git_all_attrs() hack! */
> +               celem = NULL;
> +               num = 0;
> +       } else {
> +               celem = check->check;
> +               num = check->check_nr;
> +       }
>
>         for (cp = path; cp < path + pathlen; cp++) {
>                 if (*cp == '/' && cp[1])
> @@ -773,9 +784,9 @@ static void collect_some_attrs(const char *path, int pathlen, int num,
>         if (num && !cannot_trust_maybe_real) {
>                 rem = 0;
>                 for (i = 0; i < num; i++) {
> -                       if (!check[i].attr->maybe_real) {
> +                       if (!celem[i].attr->maybe_real) {
>                                 struct git_attr_check_elem *c;
> -                               c = check_all_attr + check[i].attr->attr_nr;
> +                               c = check_all_attr + celem[i].attr->attr_nr;
>                                 c->value = ATTR__UNSET;
>                                 rem++;
>                         }
> @@ -789,18 +800,19 @@ static void collect_some_attrs(const char *path, int pathlen, int num,
>                 rem = fill(path, pathlen, basename_offset, stk, rem);
>  }
>
> -static int git_check_attrs(const char *path, int pathlen, int num,
> -                          struct git_attr_check_elem *check)
> +static int git_check_attrs(const char *path, int pathlen,
> +                          struct git_attr_check *check)
>  {
>         int i;
> +       struct git_attr_check_elem *celem = check->check;

We don't need this outside the for loop; maybe we want to move this in there including indexing?

Or rather dropping the arrays and use pointers in there if we're concerned about performance? (That would be a slightly larger refactoring, roughly):

    struct git_attr_check_elem *cur = check->check;
    struct git_attr_check_elem *end = cur + check->check_nr;
    while (cur < end) {
        value = check_all_attr[cur->attr->attr_nr].value;
        cur->value = (value == ATTR__UNKNOWN) ? ATTR__UNSET : value;
        cur++;
    }
Looks correct as it is, though.

Thanks, Stefan

Previous: Junio C HamanoNext: Junio C Hamano
Message 6 of 13 in “A bit more "attributes"”
  1. 0/5 A bit more "attributes"Junio C Hamano, Jun 8, 2016
  2. 1/5 attr.c: add push_stack() helperJunio C Hamano, Jun 8, 2016
  3. Stefan BellerJun 8, 2016
  4. Junio C HamanoJun 9, 2016
  5. 2/5 attr.c: pass struct git_attr_check down the callchainJunio C Hamano, Jun 8, 2016
  6. Stefan BellerJun 8, 2016
  7. 3/5 fixup! d5ad6c13Junio C Hamano, Jun 8, 2016
  8. Stefan BellerJun 9, 2016
  9. Junio C HamanoJun 9, 2016
  10. 4/5 attr.c: correct ugly hack for git_all_attrs()Junio C Hamano, Jun 8, 2016
  11. 5/5 attr.c: always pass check[] to collect_some_attrs()Junio C Hamano, Jun 8, 2016
  12. Stefan BellerJun 9, 2016
  13. Junio C HamanoJun 9, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.