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

Re: [PATCH 12/12] Add git-check-ignore sub-command

From
Adam Spiers <git@adamspiers.org>
Date
Dec 17, 2012, 00:10 UTC
Message-ID
<20121217001013.GB3673@gmail.com>
In-Reply-To
<7vmwzmtmyd.fsf@alter.siamese.dyndns.org>
On Tue, Oct 16, 2012 at 09:12:58AM -0700, Junio C Hamano wrote:
Show 49 quoted lines
> Adam Spiers <git@adamspiers.org> writes:
> > On Mon, Oct 15, 2012 at 3:31 PM, Junio C Hamano <gitster@pobox.com> wrote:
> >> Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:
> >>> +For each pathname given via the command-line or from a file via
> >>> +`--stdin`, this command will list the first exclude pattern found (if
> >>> +any) which explicitly excludes or includes that pathname.  Note that
> >>> +within any given exclude file, later patterns take precedence over
> >>> +earlier ones, so any matching pattern which this command outputs may
> >>> +not be the one you would immediately expect.
> >>
> >> "The first exclude pattern" is very misleading, isn't it?
> >
> > I don't think so, because of the second sentence.
> >
> >> For example, with these in $GIT_DIR/info/exclude, I would get:
> >>
> >>         $ cat -n .git/info/exclude
> >>           1 *~
> >>           2 Makefile~
> >>         $ git check-ignore -v Makefile~
> >>         .git/info/exclude:2:Makefile~   Makefile~
> >>
> >> which is the correct result (the last one in a single source decides
> >> the fate of the path), but it hardly is "first one found" and the
> >> matching pattern in the output would not be something unexpected for
> >> the users, either.
> >>
> >> The reason it is "the first one found" is because the implementation
> >> arranges the loop in such a way that it can stop early when it finds
> >> a match---it simply checks matches from the end of the source.
> >>
> >> But that is not visible to end-users,
> >
> > Correct; that's precisely why I wrote the second sentence which
> > explicitly explains this.
> >
> >> and they will find the above description just wrong, no?
> >
> > It's not wrong AFAICS, but suggestions for rewording this more clearly
> > are of course welcome.  Maybe s/immediately/intuitively/ ?
> 
> I think this is sufficient:
> 
> 	For each pathname given via the command-line or from a file
> 	via `--stdin`, show the pattern from .gitignore (or other
> 	input files to the exclude mechanism) that decides if the
> 	pathname is excluded.
> 
> and without "Note that" at all.

I don't think this is quite sufficient. Firstly, it does not cover negated patterns (my original text contained "or includes").

Secondly, I think there is still potential for this rewording to result in confused users. If the "backwards-ness" of the internal algorithm is kept hidden from them, then in your example above, most users would be more likely to intuitively expect check-ignore to return the first line of .git/info/exclude ("*~"). When they saw it returning the second, they might draw the conclusion that the first line failed to match (e.g. by mistakenly thinking that the file format requires regular expressions rather than globs), rather than that git starts at the end of the file.

This is precisely why I chose not to hide this aspect of the implementation when initially writing this documentation. Unfortunately my wording managed to confuse several of you, so clearly it was not adequate. Therefore I propose an extension of your version:

	For each pathname given via the command-line or from a file
	via `--stdin`, show the pattern from .gitignore (or other
	input files to the exclude mechanism) that decides if the
	pathname is excluded or included.  Later patterns within a
	file take precedence over earlier ones.
Previous: Junio C HamanoNext: Johannes Sixt
Message 52 of 55 in “nd/attr-match-more-optim, nd/wildmatch and as/check-ignore”
  1. Nguyễn Thái Ngọc DuyOct 15, 2012
  2. 1/6 exclude: stricten a length check in EXC_FLAG_ENDSWITH caseNguyễn Thái Ngọc Duy, Oct 15, 2012
  3. 2/6 exclude: split basename matching code into a separate functionNguyễn Thái Ngọc Duy, Oct 15, 2012
  4. 3/6 exclude: fix a bug in prefix compare optimizationNguyễn Thái Ngọc Duy, Oct 15, 2012
  5. 4/6 exclude: split pathname matching code into a separate functionNguyễn Thái Ngọc Duy, Oct 15, 2012
  6. 5/6 gitignore: make pattern parsing code a separate functionNguyễn Thái Ngọc Duy, Oct 15, 2012
  7. 6/6 attr: more matching optimizations from .gitignoreNguyễn Thái Ngọc Duy, Oct 15, 2012
  8. 01/13 ctype: make sane_ctype[] const arrayNguyễn Thái Ngọc Duy, Oct 15, 2012
  9. 02/13 ctype: support iscntrl, ispunct, isxdigit and isprintNguyễn Thái Ngọc Duy, Oct 15, 2012
  10. 03/13 Import wildmatch from rsyncNguyễn Thái Ngọc Duy, Oct 15, 2012
  11. 04/13 wildmatch: remove unnecessary functionsNguyễn Thái Ngọc Duy, Oct 15, 2012
  12. 05/13 wildmatch: follow Git's coding conventionNguyễn Thái Ngọc Duy, Oct 15, 2012
  13. 06/13 Integrate wildmatch to gitNguyễn Thái Ngọc Duy, Oct 15, 2012
  14. 07/13 t3070: disable unreliable fnmatch testsNguyễn Thái Ngọc Duy, Oct 15, 2012
  15. 08/13 wildmatch: make wildmatch's return value compatible with fnmatchNguyễn Thái Ngọc Duy, Oct 15, 2012
  16. 09/13 wildmatch: remove static variable force_lower_caseNguyễn Thái Ngọc Duy, Oct 15, 2012
  17. 10/13 wildmatch: fix case-insensitive matchingNguyễn Thái Ngọc Duy, Oct 15, 2012
  18. 11/13 wildmatch: adjust "**" behaviorNguyễn Thái Ngọc Duy, Oct 15, 2012
  19. 12/13 wildmatch: make /**/ match zero or more directoriesNguyễn Thái Ngọc Duy, Oct 15, 2012
  20. 13/13 Support "**" wildcard in .gitignore and .gitattributesNguyễn Thái Ngọc Duy, Oct 15, 2012
  21. 14/13 wildmatch: fix tests that fail on Windows due to path manglingJohannes Sixt, Nov 4, 2012
  22. Nguyen Thai Ngoc DuyNov 6, 2012
  23. Johannes SixtNov 7, 2012
  24. 14/13 test-wildmatch: fix tests that fail on Windows due to path manglingNguyễn Thái Ngọc Duy, Nov 11, 2012
  25. 15/13 compat/fnmatch: fix off-by-one character class's length checkNguyễn Thái Ngọc Duy, Nov 11, 2012
  26. Johannes SixtNov 13, 2012
  27. Johannes SixtNov 20, 2012
  28. Junio C HamanoNov 11, 2012
  29. 14/13 test-wildmatch: avoid Windows path manglingNguyễn Thái Ngọc Duy, Nov 13, 2012
  30. Johannes SixtNov 13, 2012
  31. 14/13 test-wildmatch: avoid Windows path manglingJohannes Sixt, Nov 20, 2012
  32. Junio C HamanoNov 20, 2012
  33. 14/13 test-wildmatch: avoid Windows path manglingJohannes Sixt, Nov 21, 2012
  34. 01/12 dir.c: rename cryptic 'which' variable to more consistent nameNguyễn Thái Ngọc Duy, Oct 15, 2012
  35. 02/12 dir.c: rename path_excluded() to is_path_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  36. 03/12 dir.c: rename excluded_from_list() to is_excluded_from_list()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  37. 04/12 dir.c: rename excluded() to is_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  38. 05/12 dir.c: refactor is_excluded_from_list()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  39. 06/12 dir.c: refactor is_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  40. 07/12 dir.c: refactor is_path_excluded()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  41. 08/12 dir.c: keep track of where patterns came fromNguyễn Thái Ngọc Duy, Oct 15, 2012
  42. 09/12 dir.c: refactor treat_gitlinks()Nguyễn Thái Ngọc Duy, Oct 15, 2012
  43. 10/12 pathspec.c: move reusable code from builtin/add.cNguyễn Thái Ngọc Duy, Oct 15, 2012
  44. 11/12 dir.c: provide free_directory() for reclaiming dir_struct memoryNguyễn Thái Ngọc Duy, Oct 15, 2012
  45. 12/12 Add git-check-ignore sub-commandNguyễn Thái Ngọc Duy, Oct 15, 2012
  46. Junio C HamanoOct 15, 2012
  47. Nguyen Thai Ngoc DuyOct 16, 2012
  48. Adam SpiersOct 16, 2012
  49. Nguyen Thai Ngoc DuyOct 16, 2012
  50. Adam SpiersOct 16, 2012
  51. Junio C HamanoOct 16, 2012
  52. Adam SpiersDec 17, 2012
  53. t0007: fix tests on WindowsJohannes Sixt, Nov 4, 2012
  54. Jeff KingNov 8, 2012
  55. Junio C HamanoOct 15, 2012

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.