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

[PATCH 0/9] new git check-ignore sub-command

From
Adam Spiers <git@adamspiers.org>
Date
Sep 2, 2012, 00:12 UTC
Message-ID
<1346544731-938-1-git-send-email-git@adamspiers.org>
I was browsing stackoverflow the other day and came across this question:
    http://stackoverflow.com/questions/12144633/which-gitignore-rule-is-ignoring-my-file/
A quick google revealed this thread from 2009:
    http://thread.gmane.org/gmane.comp.version-control.git/108671/focus=108815

where Junio and Jeff discussed the possibility of adding a new `git check-ignore' subcommand somewhat analogous to the existing `git check-attr', and suggested the beginnings of an implementation. It struck me that it might not be too hard to follow these ideas to their natural conclusion, so I decided it would make a fun project :-)

The following series of patches is the outcome. I am completely new to git hacking, so whilst I have tried very hard to follow all the conventions and documented guidelines, please go easy on me if there are any glaring errors ;-) However, the added test suite should cover the new code paths thoroughly, and I also ran check-ignore through valgrind and made some improvements accordingly, so hopefully it's pretty near the mark.

I have a question and some comments about my current patch series.

Firstly, I re-used pathspec-handling code from builtin/add.c, so I moved it to a new pathspec.c file. It looks like setup.c might have been a better candidate, but that library is already a fairly large collection of apparently loosely associated things, so I wasn't sure. According to the comments, get_pathspec() is due to be superceded by the "struct pathspec" interface, so perhaps it would make sense to split setup.c up into pathspec.c and one or two other files so as to move towards a clean demarcation of this new API?

Secondly, in the course of trying to understand the code base, my little brain got confused and I noticed a few areas where I thought there was potential to make things a bit clearer. So some of my commits are janitorial in nature.

Thirdly, currently the new sub-command hardly looks at the cache. This is partially because it doesn't need to in the most common use case (i.e. user is confused about why files are/aren't being ignored). It's also because this whole project took a lot longer than I expected, so I'm running out of time :-) Perhaps someone can add this in the future if it's needed. Right now the cache is only used to prevent recursing into submodules.

Thanks, Adam

Adam Spiers (9):
  Update directory listing API doc to match code
  Improve documentation and comments regarding directory traversal API
  Rename cryptic 'which' variable to more consistent name
  Refactor excluded_from_list
  Refactor excluded and path_excluded
  For each exclude pattern, store information about where it came from
  Extract some useful pathspec handling code from builtin/add.c into a
    library
  Provide free_directory() for reclaiming dir_struct memory
  Add git-check-ignores
 .gitignore                                        |   1 +
 Documentation/git-check-ignore.txt                |  58 +++++
 Documentation/gitignore.txt                       |   6 +-
 Documentation/technical/api-directory-listing.txt |  23 +-
 Makefile                                          |   3 +
 builtin.h                                         |   1 +
 builtin/add.c                                     |  84 +-----
 builtin/check-ignore.c                            | 150 +++++++++++
 builtin/clean.c                                   |   2 +-
 builtin/ls-files.c                                |   3 +-
 command-list.txt                                  |   1 +
 contrib/completion/git-completion.bash            |   1 +
 dir.c                                             | 183 ++++++++++---
 dir.h                                             |  37 ++-
 git.c                                             |   1 +
 pathspec.c                                        |  87 +++++++
 pathspec.h                                        |   6 +
 t/t0007-ignores.sh                                | 301 ++++++++++++++++++++++
 18 files changed, 811 insertions(+), 137 deletions(-)
 create mode 100644 Documentation/git-check-ignore.txt
 create mode 100644 builtin/check-ignore.c
 create mode 100644 pathspec.c
 create mode 100644 pathspec.h
 create mode 100755 t/t0007-ignores.sh
-- 
1.7.12.155.ge5750d5.dirty
Next: Adam Spiers
Message 1 of 80 in “new git check-ignore sub-command”
  1. 0/9 new git check-ignore sub-commandAdam Spiers, Sep 2, 2012
  2. 1/9 Update directory listing API doc to match codeAdam Spiers, Sep 2, 2012
  3. 2/9 Improve documentation and comments regarding directory traversal APIAdam Spiers, Sep 2, 2012
  4. 3/9 Rename cryptic 'which' variable to more consistent nameAdam Spiers, Sep 2, 2012
  5. Junio C HamanoSep 2, 2012
  6. 4/9 Refactor excluded_from_listAdam Spiers, Sep 2, 2012
  7. Nguyen Thai Ngoc DuySep 4, 2012
  8. 5/9 Refactor excluded and path_excludedAdam Spiers, Sep 2, 2012
  9. Nguyen Thai Ngoc DuySep 4, 2012
  10. Junio C HamanoSep 4, 2012
  11. Nguyen Thai Ngoc DuySep 5, 2012
  12. Junio C HamanoSep 6, 2012
  13. Nguyen Thai Ngoc DuySep 6, 2012
  14. Thiago FarinaSep 6, 2012
  15. Nguyen Thai Ngoc DuySep 6, 2012
  16. Adam SpiersSep 6, 2012
  17. Junio C HamanoSep 6, 2012
  18. 6/9 For each exclude pattern, store information about where it came fromAdam Spiers, Sep 2, 2012
  19. Philip OakleySep 2, 2012
  20. Junio C HamanoSep 2, 2012
  21. Philip OakleySep 2, 2012
  22. Adam SpiersSep 6, 2012
  23. 7/9 Extract some useful pathspec handling code from builtin/add.c into a libraryAdam Spiers, Sep 2, 2012
  24. 8/9 Provide free_directory() for reclaiming dir_struct memoryAdam Spiers, Sep 2, 2012
  25. 9/9 Add git-check-ignoresAdam Spiers, Sep 2, 2012
  26. Nguyen Thai Ngoc DuySep 2, 2012
  27. Adam SpiersSep 2, 2012
  28. Junio C HamanoSep 2, 2012
  29. Nguyen Thai Ngoc DuySep 3, 2012
  30. Junio C HamanoSep 2, 2012
  31. Junio C HamanoSep 3, 2012
  32. 00/14 new git check-ignore sub-commandAdam Spiers, Sep 20, 2012
  33. 01/14 Update directory listing API doc to match codeAdam Spiers, Sep 20, 2012
  34. 02/14 Improve documentation and comments regarding directory traversal APIAdam Spiers, Sep 20, 2012
  35. 03/14 Rename cryptic 'which' variable to more consistent nameAdam Spiers, Sep 20, 2012
  36. 04/14 Rename path_excluded() to is_path_excluded()Adam Spiers, Sep 20, 2012
  37. 05/14 Rename excluded_from_list() to is_excluded_from_list()Adam Spiers, Sep 20, 2012
  38. 06/14 Rename excluded() to is_excluded()Adam Spiers, Sep 20, 2012
  39. 07/14 Refactor is_excluded_from_list()Adam Spiers, Sep 20, 2012
  40. 08/14 Refactor is_excluded()Adam Spiers, Sep 20, 2012
  41. 09/14 Refactor is_path_excluded()Adam Spiers, Sep 20, 2012
  42. 10/14 For each exclude pattern, store information about where it came fromAdam Spiers, Sep 20, 2012
  43. Junio C HamanoSep 20, 2012
  44. Adam SpiersDec 26, 2012
  45. 11/14 Refactor treat_gitlinks()Adam Spiers, Sep 20, 2012
  46. 12/14 Extract some useful pathspec handling code from builtin/add.c into a libraryAdam Spiers, Sep 20, 2012
  47. Michael HaggertySep 21, 2012
  48. 13/14 Provide free_directory() for reclaiming dir_struct memoryAdam Spiers, Sep 20, 2012
  49. Michael HaggertySep 21, 2012
  50. Junio C HamanoSep 21, 2012
  51. 14/14 Add git-check-ignore sub-commandAdam Spiers, Sep 20, 2012
  52. Johannes SixtSep 21, 2012
  53. Junio C HamanoSep 25, 2012
  54. Johannes SixtSep 26, 2012
  55. Junio C HamanoSep 26, 2012
  56. Michael HaggertySep 21, 2012
  57. Junio C HamanoSep 21, 2012
  58. Junio C HamanoSep 21, 2012
  59. Junio C HamanoSep 20, 2012
  60. Junio C HamanoSep 20, 2012
  61. Adam SpiersSep 20, 2012
  62. Junio C HamanoSep 21, 2012
  63. Adam SpiersDec 26, 2012
  64. Junio C HamanoSep 21, 2012
  65. compiler checksAdam Spiers, Dec 16, 2012
  66. Junio C HamanoSep 24, 2012
  67. Nguyen Thai Ngoc DuySep 4, 2012
  68. Junio C HamanoSep 4, 2012
  69. Nguyen Thai Ngoc DuySep 5, 2012
  70. Adam SpiersSep 10, 2012
  71. Adam SpiersSep 10, 2012
  72. Nguyen Thai Ngoc DuySep 10, 2012
  73. Junio C HamanoSep 10, 2012
  74. Junio C HamanoSep 2, 2012
  75. Adam SpiersSep 6, 2012
  76. Adam SpiersSep 7, 2012
  77. Junio C HamanoSep 7, 2012
  78. Document conventions on static initialization and else cuddlingAdam Spiers, Sep 19, 2012
  79. Junio C HamanoSep 19, 2012
  80. Adam SpiersSep 19, 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.