All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Stefan Beller <sbeller@google.com>
Cc: "Sérgio Peixoto" <sergio.peixoto@gmail.com>,
	"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>,
	"Brandon Williams" <bwilliams.eng@gmail.com>,
	git <git@vger.kernel.org>
Subject: Re: [PATCH] attr: do not mark queried macros as unset
Date: Tue, 22 Jan 2019 02:19:22 -0500	[thread overview]
Message-ID: <20190122071921.GC28555@sigill.intra.peff.net> (raw)
In-Reply-To: <CAGZ79kaPXQUY=FN3qusc2PNs=o1EiNarcBejOQKiozMSPvEOYw@mail.gmail.com>

On Fri, Jan 18, 2019 at 02:19:55PM -0800, Stefan Beller wrote:

> > I dunno. This is why I submitted the initial patch as the simplest fix. ;)
> >
> 
> The first patch is
> Reviewed-by: Stefan Beller <sbeller@google.com>

Thanks!

> Diffing across both patches, this seems to be the relevant part:
> [...]
> 
> ---8<---
> @@ -1111,14 +1116,13 @@ static void collect_some_attrs(const struct
> index_state *istate,
> 
>         prepare_attr_stack(istate, path, dirlen, &check->stack);
>         all_attrs_init(&g_attr_hashmap, check);
> -       determine_macros(check->all_attrs, check->stack);
> 
>         if (check->nr) {
>                 rem = 0;
>                 for (i = 0; i < check->nr; i++) {
>                         int n = check->items[i].attr->attr_nr;
>                         struct all_attrs_item *item = &check->all_attrs[n];
> -                       if (item->macro) {
> +                       if (!item->attr->in_stack) {
>                                 item->value = ATTR__UNSET;
>                                 rem++;
>                         }
> @@ -1127,6 +1131,8 @@ static void collect_some_attrs(const struct
> index_state *istate,
>                         return;
>         }
> 
> +       determine_macros(check->all_attrs, check->stack);
> +
>         rem = check->all_attrs_nr;
>         fill(path, pathlen, basename_offset, check->stack,
> check->all_attrs, rem);
>  }
> ---8<---
> 
> which I think is correct.

Yes, that's the interesting part. I think I've convinced myself, too,
that it doesn't do the _wrong_ thing ever. But I think it misses the
point of the original, which is that you want common ones like "diff"
not to trigger in_stack if nobody has actually used them. And doing that
really does mean marking in_stack not just when a macro mentions it
(because clearly "binary" is going to mention it for every repo), but
waiting to see if anybody mentions that macro.

Which means we must call determine_macros(), and then propagate the
macro's in_stack to its expansion (if it's indeed called at all).

I don't think that would be _too_ hard to do. But I also wonder if
there's much point. We are trying to avoid fill(), but I think that
determine_macros() is of roughly the same complexity (look at all
matches of all stacks). I guess it does avoid path_matches(), which is a
bit more expensive. And in theory it could be cached for a particular
stack top, so the work is amortized across many path lookups (though I
think that gets even more tricky).

-Peff

  reply	other threads:[~2019-01-22  7:19 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-17 15:47 Change on check-attr behavior Sérgio Peixoto
2019-01-17 16:07 ` Jeff King
2019-01-18  9:41   ` Sérgio Peixoto
2019-01-18 16:58     ` Jeff King
2019-01-18 21:34       ` [PATCH] attr: do not mark queried macros as unset Jeff King
2019-01-18 21:46         ` Jeff King
2019-01-18 22:19           ` Stefan Beller
2019-01-22  7:19             ` Jeff King [this message]
2019-01-22  9:50               ` Duy Nguyen
2019-01-22 22:00           ` Junio C Hamano
2019-01-21 10:05         ` Duy Nguyen
2019-01-22  7:21           ` Jeff King
2019-01-22  9:34         ` Duy Nguyen
2019-01-22 21:48         ` Junio C Hamano
2019-01-23  5:40           ` Jeff King

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=20190122071921.GC28555@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=bwilliams.eng@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=pclouds@gmail.com \
    --cc=sbeller@google.com \
    --cc=sergio.peixoto@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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.