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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html