Git development
 help / color / mirror / Atom feed
From: Tom Grennan <tmgrennan@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: pclouds@gmail.com, git@vger.kernel.org, jasampler@gmail.com
Subject: Re: [RFC/PATCH] tag: make list exclude !<pattern>
Date: Sat, 11 Feb 2012 11:08:56 -0800	[thread overview]
Message-ID: <20120211190856.GB4903@tgrennan-laptop> (raw)
In-Reply-To: <7vaa4qnk4u.fsf@alter.siamese.dyndns.org>

On Fri, Feb 10, 2012 at 07:06:57PM -0800, Junio C Hamano wrote:
>Tom Grennan <tmgrennan@gmail.com> writes:
>
>>>If we pursue this, it may be best to first add match_patterns() to ./refs.[ch]
>>>then incrementally modify these builtin commands to use it.
>>
>> The following series implements !<pattern> with: git-tag, git-branch, and
>> git-for-each-ref.
>>
>> This still requires Documentation and unit test updates but I think these are
>> close to functionally complete.
>>
>>>>About the '!' for exclusion, maybe it's better to move from fnmatch()
>>>>as matching machinery to pathspec. Then when git learns negative
>>>>pathspec [1], we have this feature for free.
>>>>
>>>>[1] http://thread.gmane.org/gmane.comp.version-control.git/189645/focus=190072
>>
>> After looking at this some more, I don't understand the value of replacing
>> libc:fnmatch().  Or are you just referring to '--exclude' instead of
>> [!]<pattern> argument parsing?
>
>I have not formed a firm opinion on Nguyen's idea to reuse pathspec
>matching infrastructure for this purpose, so I wouldn't comment on that
>part. It certainly looks attractive, as it allows users to learn one and
>only one extended matching syntax, but at the same time, it has a risk to
>mislead people to think that the namespace for refs is similar to that of
>the filesystem paths, which I see as a mild downside.
>
>In any case, I do not like the structure of this series. If it followed
>our usual pattern, it would consist of patches in this order:
>
> - Patch 1 would extract match_pattern() from builtin/tag.c and introduce
>   the new helper function refname_match_patterns() to refs.c.  It updates
>   the call sites of match_pattern() in builtin/tag.c, match_patterns() in
>   builtin/branch.c, and the implementation of grab_single_ref() in
>   builtin/for-each-ref.c with a call to the new helper function.
>
>   This step can and probably should be done as three sub-steps.  1a would
>   move builtin/tag.c::match_pattern() to refs.::refname_match_patterns(),
>   1b would use the new helper in builtin/branch.c and 1c would do the
>   same for builtin/for-each-ref.c.
>
>   It is important that this patch does so without introducing any new
>   functionality to the new function over the old one. When done this way,
>   there is no risk of introducing new bugs at 1a because it is purely a
>   code movement and renaming; 1b could introduce a bug that changes
>   semantics for bulitin/branch.c if its match_patterns() does things
>   differently from match_pattern() lifted from builtin/tag.c, and if it
>   is found out to be buggy, we can discard 1b without discarding 1a. Same
>   for 1c, which I highly suspect will introduce regression without
>   looking at the code (for-each-ref is prefix-match only), that can
>   safely be discarded.
>
>   This is to make it easier to ensure that the update does not introduce
>   new bugs.
>
> - Patch 2 would then add the new functionality to the new helper. It
>   would also adjust the documentation of the three end user facing
>   commands to describe the fallout coming from this change, and adds new
>   tests to make sure future changes will not break this new
>   functionality.
>
>That is, first refactor and clean-up without adding anything new, and then
>build new stuff on solidified ground.

Nuts! I have the cart before the horse. I'll try to rearrange the series as
suggested by tomorrow. Thanks.

>Do we allow a refname whose pathname component begins with '!', by the
>way?  If we do, how does a user look for a tag whose name is "!xyzzy"?
>"Naming your tag !xyzzy used to be allowed but it is now forbidden after
>this patch" is not an acceptable answer---it is called a regression.  If
>the negation operator were "^" or something that we explicitly forbid from
>a refname, we wouldn't have such a problem.

Cool, as I recall, v7 or earlier /bin/sh also used "^" to preface
exclusion patterns. Another option is the bash extglob syntax of
!(pattern) although I'd prefer "^" b/c one wouldn't have to quote it
with bash:
  $ git branch --list ^pu

-- 
TomG

  parent reply	other threads:[~2012-02-11 19:09 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-09 19:43 [RFC/PATCH] tag: make list exclude !<pattern> Tom Grennan
2012-02-09 19:43 ` Tom Grennan
2012-02-10  0:00   ` Tom Grennan
2012-02-10  6:34 ` Nguyen Thai Ngoc Duy
2012-02-10 18:55   ` Tom Grennan
2012-02-11  2:16     ` Tom Grennan
2012-02-11  3:06       ` Junio C Hamano
2012-02-11  7:50         ` Junio C Hamano
2012-02-11 10:13           ` Jakub Narebski
2012-02-11 14:06             ` Nguyen Thai Ngoc Duy
2012-02-11 18:31             ` Junio C Hamano
2012-02-11 19:47           ` Tom Grennan
2012-02-11  7:50         ` Michael Haggerty
2012-02-11  8:13           ` Junio C Hamano
2012-02-13  5:29             ` Michael Haggerty
2012-02-13  6:37               ` Junio C Hamano
2012-02-13  9:37                 ` Michael Haggerty
2012-02-13 10:23                   ` Junio C Hamano
2012-02-13 14:34                     ` Michael Haggerty
2012-02-13 20:29                       ` Junio C Hamano
2012-02-11 19:08         ` Tom Grennan [this message]
2012-02-22  1:28           ` [PATCHv3 0/5] " Tom Grennan
2012-02-22  1:28           ` [PATCHv3 1/5] refs: add match_pattern() Tom Grennan
2012-02-22  6:33             ` Junio C Hamano
2012-02-22 23:47               ` Tom Grennan
2012-02-23  0:17                 ` Junio C Hamano
2012-02-23  0:59                   ` Tom Grennan
2012-02-22  1:28           ` [PATCHv3 2/5] tag --points-at option wrapper Tom Grennan
2012-02-22  1:28           ` [PATCHv3 3/5] tag --exclude option Tom Grennan
2012-02-22  6:33             ` Junio C Hamano
2012-02-23  0:22               ` Tom Grennan
2012-02-23  1:00                 ` Junio C Hamano
2012-03-01  1:45                 ` [PATCH 0/5] modernize test style Tom Grennan
2012-03-03  2:15                   ` [PATCHv2 " Tom Grennan
2012-03-03  8:04                     ` Junio C Hamano
2012-03-03 17:42                       ` Tom Grennan
2012-03-03  2:15                   ` [PATCHv2 1/5] t7004 (tag): modernize style Tom Grennan
2012-03-03 21:31                     ` Johannes Sixt
2012-03-03  2:15                   ` [PATCHv2 2/5] t5512 (ls-remote): " Tom Grennan
2012-03-03  8:05                     ` Junio C Hamano
2012-03-03 17:33                       ` Tom Grennan
2012-03-03  2:15                   ` [PATCHv2 3/5] t3200 (branch): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2 4/5] t0040 (parse-options): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2 5/5] t6300 (for-each-ref): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2-w 101/105] t7004 (tag): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2-w 102/105] t5512 (ls-remote): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2-w 103/105] t3200 (branch): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2-w 104/105] t0040 (parse-options): " Tom Grennan
2012-03-03  2:15                   ` [PATCHv2-w 105/105] t6300 (for-each-ref): " Tom Grennan
2012-03-01  1:45                 ` [PATCH 1/5] " Tom Grennan
2012-03-01  6:53                   ` Johannes Sixt
2012-03-01 15:58                     ` Tom Grennan
2012-03-01  1:45                 ` [PATCH 2/5] t5512 (ls-remote): " Tom Grennan
2012-03-01  8:36                   ` Thomas Rast
2012-03-01  1:45                 ` [PATCH 3/5] t3200 (branch): " Tom Grennan
2012-03-01  1:45                 ` [PATCH 4/5] t0040 (parse-options): " Tom Grennan
2012-03-01  1:45                 ` [PATCH 5/5] t7004 (tag): " Tom Grennan
2012-03-01  1:45                 ` [PATCH-w 101/105] t6300 (for-each-ref): " Tom Grennan
2012-03-01  2:13                   ` Junio C Hamano
2012-03-01  3:20                     ` Tom Grennan
2012-03-01  3:26                       ` Junio C Hamano
2012-03-01  5:10                         ` Tom Grennan
2012-03-01  5:57                           ` Tom Grennan
2012-03-01  8:42                           ` Thomas Rast
2012-03-01 15:48                             ` Tom Grennan
2012-03-01  1:45                 ` [PATCH-w 102/105] t5512 (ls-remote): " Tom Grennan
2012-03-01  1:45                 ` [PATCH-w 103/105] t3200 (branch): " Tom Grennan
2012-03-01  1:45                 ` [PATCH-w 104/105] t0040 (parse-options): " Tom Grennan
2012-03-01  1:45                 ` [PATCH-w 105/105] t7004 (tag): " Tom Grennan
2012-02-22  1:28           ` [PATCHv3 4/5] branch --exclude option Tom Grennan
2012-02-22  1:28           ` [PATCHv3 5/5] for-each-ref " Tom Grennan
2012-02-11  2:16     ` [PATCHv2 1/4] refs: add common refname_match_patterns() Tom Grennan
2012-02-11  7:12       ` Michael Haggerty
2012-02-11 19:17         ` Tom Grennan
2012-02-13  5:00           ` Michael Haggerty
2012-02-13 17:27             ` Tom Grennan
2012-02-11  8:06       ` Junio C Hamano
2012-02-11 19:37         ` Tom Grennan
2012-02-11 23:43           ` Junio C Hamano
2012-02-13 16:29             ` Tom Grennan
2012-02-11  2:16     ` [PATCHv2 2/4] tag: use refs.c:refname_match_patterns() Tom Grennan
2012-02-11  2:16     ` [PATCHv2 3/4] branch: " Tom Grennan
2012-02-11  2:16     ` [PATCHv2 4/4] for-each-ref: " Tom Grennan

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=20120211190856.GB4903@tgrennan-laptop \
    --to=tmgrennan@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jasampler@gmail.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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox