git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Adam Spiers <git@adamspiers.org>
Cc: git list <git@vger.kernel.org>
Subject: Re: [PATCH v3 11/19] dir.c: use a single struct exclude_list per source of excludes
Date: Sun, 06 Jan 2013 12:25:48 -0800	[thread overview]
Message-ID: <7v7gnqnjn7.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <20130106152039.GA2396@pacific.linksys.moosehall> (Adam Spiers's message of "Sun, 6 Jan 2013 15:20:39 +0000")

Adam Spiers <git@adamspiers.org> writes:

> On Fri, Jan 04, 2013 at 01:03:59PM -0800, Junio C Hamano wrote:
>> Adam Spiers <git@adamspiers.org> writes:
>> 
>> > diff --git a/builtin/clean.c b/builtin/clean.c
>> > index 0c7b3d0..bd18b88 100644
>> > --- a/builtin/clean.c
>> > +++ b/builtin/clean.c
>> > @@ -97,9 +97,10 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
>> >  	if (!ignored)
>> >  		setup_standard_excludes(&dir);
>> >  
>> > +	add_exclude_list(&dir, EXC_CMDL);
>> >  	for (i = 0; i < exclude_list.nr; i++)
>> >  		add_exclude(exclude_list.items[i].string, "", 0,
>> > -			    &dir.exclude_list[EXC_CMDL]);
>> > +			    &dir.exclude_list_groups[EXC_CMDL].ary[0]);
>> 
>> This looks somewhat ugly for two reasons.
>> 
>>  * The abstraction add_exclude() offers to its callers is just to
>>    let them add one pattern to the list of patterns for the kind
>>    (here, EXC_CMDL); why should they care about .ary[0] part?
>
> Because the caller has to decide which exclude list the new exclude
> should be added to; that is how it has been for a long time, and I am
> not proposing we change that.

Unless I was mistaken, I never objected to the EXC_CMDL, etc
appearing in the text of the calling site of add_exclude().

The objection was about the .ary[0] bit.  From the point of view of
a caller of the API, it:

    - calls add_exclude_list() to declare "I now start adding new
      patterns that come from a new source of patterns"; then

    - calls add_exclude() repeatedly to add the patterns that come
      from that source.

no?  Why does the latter has to keep repeating "Here is the new
pattern for the EXC_CMDL group; it comes from the latest source I
earlier declared, by the way", instead of just "Here is the new
pattern for the EXC_CMDL group"?  The ary[0] part always using "0"
(not "4" or "ix") is what repeats that "by the way".

>>    Are
>>    there cases any sane caller (not the implementation of the
>>    exclude_list_group machinery e.g. add_excludes_from_... function)
>>    may want to call it with .ary[1]?
>
> Effectively yes, although it is not written like ".ary[1]".  For
> example prep_exclude() calls add_excludes_from_file_to_list() for each
> new .gitignore file

That is part of the "implementation of the machinery".  If the API
for the outside callers are to call add_exclude_list() to declare
that patterns added by subsequent calls to add_exclude() are from
one new source of the patterns (e.g. .gitignore file in a new
directory level), and then call add_exclude() to add each pattern,
then the callers to add_exclude() shouldn't have to care about the
implementation detail that individual sources in exclude_list_group
is implemented as an array in that sructure, and the latest ones
should go to its ->array[0].

The implementation of the machinery may find it more convenient if
they can add one or more "sources" to an exclude_list_group before
starting to add patterns to ->array[0] or ->array[1] or ->array[2],
and a finer grained internal API that lets the caller pass an
instance of "struct exclude_list" regardless of where in an
exclude_list_group's ary[] that instance sits may be necessary to do
so.

But that does not mean other existing callers has to be aware of
such inner detail.  If the implementation of the machinery needs a
helper function that adds an element to any struct exclude_list, not
necessarily the one at the tip of an exclude_list_group, we can
still do that by having the bulk of the logic in the internal, finer
grained helper, say, add_pattern_to_exclude_list(), and keep the
external API simpler by making it a thin wrapper around it, perhaps
like:

   static void add_pattern_to_exclude_list(const char *pattern,
   		    const char *base, int baselen,
                    struct exclude_list *el);

   void add_exclude(const char *pattern,
   		    const char *base, int baselen,
                    struct exclude_list_group *group) {
	add_pattern_to_exclude_list(pattern, base, baselen, &group->ary[0]);
   }    

no?

  reply	other threads:[~2013-01-06 20:26 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-27  2:32 [PATCH v3 00/19] new git check-ignore sub-command Adam Spiers
2012-12-27  2:32 ` [PATCH v3 01/19] api-directory-listing.txt: update to match code Adam Spiers
2012-12-27  2:32 ` [PATCH v3 02/19] Improve documentation and comments regarding directory traversal API Adam Spiers
2013-01-01 20:52   ` Junio C Hamano
2013-01-02 12:54     ` Adam Spiers
2013-01-06 12:02       ` Adam Spiers
2012-12-27  2:32 ` [PATCH v3 03/19] dir.c: rename cryptic 'which' variable to more consistent name Adam Spiers
2012-12-27  2:32 ` [PATCH v3 04/19] dir.c: rename path_excluded() to is_path_excluded() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 05/19] dir.c: rename excluded_from_list() to is_excluded_from_list() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 06/19] dir.c: rename excluded() to is_excluded() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 07/19] dir.c: refactor is_excluded_from_list() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 08/19] dir.c: refactor is_excluded() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 09/19] dir.c: refactor is_path_excluded() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 10/19] dir.c: rename free_excludes() to clear_exclude_list() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 11/19] dir.c: use a single struct exclude_list per source of excludes Adam Spiers
2013-01-04 21:03   ` Junio C Hamano
2013-01-05  7:54     ` Junio C Hamano
2013-01-06 15:27       ` Adam Spiers
2013-01-06 15:35         ` [PATCH] api-allocation-growing.txt: encourage better variable naming Adam Spiers
2013-01-06 20:29           ` Junio C Hamano
2013-01-06 20:52             ` Adam Spiers
2013-01-06 20:58               ` Junio C Hamano
2013-01-06 15:20     ` [PATCH v3 11/19] dir.c: use a single struct exclude_list per source of excludes Adam Spiers
2013-01-06 20:25       ` Junio C Hamano [this message]
2013-01-06 22:53         ` Adam Spiers
2013-01-06 23:17           ` Adam Spiers
2013-01-06 23:19           ` Junio C Hamano
2012-12-27  2:32 ` [PATCH v3 12/19] dir.c: keep track of where patterns came from Adam Spiers
2012-12-27  2:32 ` [PATCH v3 13/19] dir.c: provide clear_directory() for reclaiming dir_struct memory Adam Spiers
2012-12-27  2:32 ` [PATCH v3 14/19] add.c: refactor treat_gitlinks() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 15/19] add.c: remove unused argument from validate_pathspec() Adam Spiers
2012-12-27  2:32 ` [PATCH v3 16/19] pathspec.c: move reusable code from builtin/add.c Adam Spiers
2012-12-28 20:32   ` Junio C Hamano
2012-12-28 20:45     ` Adam Spiers
2012-12-29  0:40       ` Adam Spiers
2012-12-28 20:48   ` Junio C Hamano
2012-12-28 21:15     ` Adam Spiers
2012-12-27  2:32 ` [PATCH v3 17/19] pathspec.c: extract new validate_path() for reuse Adam Spiers
2012-12-28 20:44   ` Junio C Hamano
2012-12-28 21:08     ` Adam Spiers
2012-12-27  2:32 ` [PATCH v3 18/19] setup.c: document get_pathspec() Adam Spiers
2012-12-28 20:36   ` Junio C Hamano
2012-12-28 20:40     ` Adam Spiers
2012-12-29  0:52       ` Adam Spiers
2012-12-29  1:36         ` Junio C Hamano
2012-12-27  2:32 ` [PATCH v3 19/19] Add git-check-ignore sub-command Adam Spiers
2012-12-28 21:21   ` Junio C Hamano
2012-12-29  1:23     ` Adam Spiers
2012-12-29  3:32       ` Adam Spiers
2012-12-27  5:15 ` [PATCH v3 00/19] new git check-ignore sub-command Michael Leal
2012-12-28 18:50 ` Junio C Hamano
2012-12-28 19:39   ` Adam Spiers
2012-12-28 20:15     ` Antoine Pelisse
2012-12-28 21:31       ` Junio C Hamano
2012-12-28 21:23 ` 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=7v7gnqnjn7.fsf@alter.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=git@adamspiers.org \
    --cc=git@vger.kernel.org \
    /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).