git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Karthik Nayak <karthik.188@gmail.com>
To: Eric Sunshine <sunshine@sunshineco.com>
Cc: Git List <git@vger.kernel.org>,
	Christian Couder <christian.couder@gmail.com>,
	Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>,
	Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH v4 06/10] ref-filter: add option to match literal pattern
Date: Sun, 26 Jul 2015 23:51:34 +0530	[thread overview]
Message-ID: <CAOLa=ZQQ1F=DibGW=McxORH9CMkOZ8n5fnMOi0_D++Du-zWStw@mail.gmail.com> (raw)
In-Reply-To: <CAPig+cTAYAxg4aWpaPrHe6Hfz3wCEiypoXZxS_Lir4yNOFzSNA@mail.gmail.com>

On Sun, Jul 26, 2015 at 10:45 AM, Eric Sunshine <sunshine@sunshineco.com> wrote:
> On Fri, Jul 24, 2015 at 3:04 PM, Karthik Nayak <karthik.188@gmail.com> wrote:
>> Since 'ref-filter' only has an option to match path names add an
>> option for plain fnmatch pattern-matching.
>>
>> This is to support the pattern matching options which are used in `git
>> tag -l` and `git branch -l` where we can match patterns like `git tag
>> -l foo*` which would match all tags which has a "foo*" pattern.
>>
>> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
>> ---
>> diff --git a/ref-filter.c b/ref-filter.c
>> index 8f2148f..0a64b84 100644
>> --- a/ref-filter.c
>> +++ b/ref-filter.c
>> @@ -951,6 +951,31 @@ static int commit_contains(struct ref_filter *filter, struct commit *commit)
>>
>>  /*
>>   * Return 1 if the refname matches one of the patterns, otherwise 0.
>> + * A pattern can be a literal prefix (e.g. a refname "refs/heads/master"
>> + * matches a pattern "refs/heads/mas") or a wildcard (e.g. the same ref
>> + * matches "refs/heads/mas*", too).
>> + */
>> +static int match_pattern(const char **patterns, const char *refname)
>> +{
>> +       for (; *patterns; patterns++) {
>> +               /*
>> +                * When no '--format' option is given we need to skip the prefix
>> +                * for matching refs of tags and branches.
>> +                */
>> +               if (!starts_with(*patterns, "refs/tags/"))
>> +                       skip_prefix(refname, "refs/tags/", &refname);
>> +               if (!starts_with(*patterns, "refs/heads/"))
>> +                       skip_prefix(refname, "refs/heads/", &refname);
>> +               if (!starts_with(*patterns, "refs/remotes/"))
>> +                       skip_prefix(refname, "refs/remotes/", &refname);
>
> Note the inefficiency here: You're performing an "expensive"
> starts_with() on each pattern for each refname even though the
> patterns will never change. You could instead compute starts_with()
> for each pattern just once, in a preprocessing step, and remember each
> result as a boolean, and then use the computed booleans here in place
> of starts_with(). For a few refnames, this may not make a difference,
> but for a project with a huge number, it could. Whether such an
> optimization is worth the complexity (at this time or ever) is
> something that can be answered by taking measurements.
>
> Also, the repetition in the code is not all that pretty. You could
> instead place "refs/tags/", "refs/heads/", and "refs/remotes/" in a
> table and then loop over them rather than repeating the code for each
> one, though whether that would be an improvement is likely a judgment
> call (so not something I'd insist upon).
>

I just put the "starts_with()" code so as to ensure that its only used when
we don't say "refs/heads/", "refs/remotes/" or "refs/tags/" in the pattern.
But looking at the tag.c and branch.c implementations this should always be
done. Hence I think Ill move it outside the loop and make it mandatory as this
pattern matching is only used by tag and branch and as they by default
remove the
path of the ref. I think it'd make sense to remove it here also.

-- 
Regards,
Karthik Nayak

  reply	other threads:[~2015-07-26 18:22 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-24 19:04 [PATCH v4 0/10] port tag.c to use ref-filter APIs Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 01/10] ref-filter: add option to align atoms to the left Karthik Nayak
2015-07-24 21:54   ` Junio C Hamano
2015-07-24 23:00     ` Junio C Hamano
2015-07-25  4:14       ` Karthik Nayak
2015-07-26  4:08   ` Eric Sunshine
2015-07-26  4:36     ` Karthik Nayak
2015-07-26  5:58       ` Eric Sunshine
2015-07-26  6:03         ` Karthik Nayak
2015-07-27 12:01       ` Matthieu Moy
2015-07-27  0:39     ` Duy Nguyen
2015-07-27  7:39       ` Jacob Keller
2015-07-27 10:18         ` Duy Nguyen
2015-07-28 10:35           ` Duy Nguyen
2015-07-24 19:04 ` [PATCH v4 02/10] ref-filter: make the 'color' use ref_formatting_state Karthik Nayak
2015-07-24 21:46   ` Junio C Hamano
2015-07-25  4:15     ` Karthik Nayak
2015-07-26  4:28       ` Eric Sunshine
2015-07-26  4:12   ` Eric Sunshine
2015-07-26  5:40     ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 03/10] ref-filter: add option to filter only tags Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 04/10] ref-filter: support printing N lines from tag annotation Karthik Nayak
2015-07-26  4:46   ` Eric Sunshine
2015-07-26  5:15     ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 05/10] ref-filter: add support to sort by version Karthik Nayak
2015-07-25 22:40   ` Junio C Hamano
2015-07-26  5:07     ` Karthik Nayak
2015-07-27 15:24       ` Junio C Hamano
2015-07-27 17:03         ` Karthik Nayak
2015-07-24 19:04 ` [PATCH v4 06/10] ref-filter: add option to match literal pattern Karthik Nayak
2015-07-26  5:15   ` Eric Sunshine
2015-07-26 18:21     ` Karthik Nayak [this message]
2015-07-24 19:04 ` [PATCH v4 07/10] tag.c: use 'ref-filter' data structures Karthik Nayak
2015-07-24 19:19 ` [PATCH v4 08/10] tag.c: use 'ref-filter' APIs Karthik Nayak
2015-07-24 19:19   ` [PATCH v4 09/10] tag.c: implement '--format' option Karthik Nayak
2015-07-24 19:19   ` [PATCH v4 10/10] tag.c: implement '--merged' and '--no-merged' options Karthik Nayak

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='CAOLa=ZQQ1F=DibGW=McxORH9CMkOZ8n5fnMOi0_D++Du-zWStw@mail.gmail.com' \
    --to=karthik.188@gmail.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=sunshine@sunshineco.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).