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

Re: [JGIT PATCH v2 19/24] Added the class AddRuleListFactory.

From
FKFlorian Köberle <florianskarten@web.de>
Date
May 13, 2008, 11:24 UTC
Message-ID
<48297A88.5040508@web.de>
In-Reply-To
<20080513012909.GG29038@spearce.org>
Shawn O. Pearce wrote:
Show 36 quoted lines
> Florian Koeberle <florianskarten@web.de> wrote:
>> +class AddRuleListFactory {
>> +	/*
>> +	 * The add command of git 1.5.2.5 behaves a little bit stange: "git add
>> +	 * a/\*z" adds the file "a/b/xyz" but "git add a/x\*" does not.
>> +	 * 
>> +	 * The first is parsed as pattern "*z" for whole directory tree "a". The
>> +	 * second is parsed as an path.
>> +	 * 
>> +	 */
> 
> Its not strange.  C Git expands each file path to its _full_ path
> and stores that into a buffer, then runs fnmatch() for each pattern
> on the buffer.  If fnmatch() succeeds the path is added to the index.
> 
> In the case above we are running a match of "a/\*.z" against
> "a/b/xyz" and that passes.  Or we run "a/x\*" on "a/b/xyz" and it
> fails as the sequence of characters "a/x" does not appear in the
> string "a/b".
> 
> You are running into this odd corner case because you are not
> treating the pattern passed as something that matches against the
> entire path.  This is one reason why TreeFilter's use the entire
> path when they process an entry for inclusion or exclusion, and why
> TreeWalk has each AbstractTreeIterator append the current entry name
> onto the end of the current path buffer, so we can always examine
> the full path from the root of the repository/working directory.
> 
> Trying to avoid the full path in classes like ComplexFilePattern
> is why you are running into this corner case here, and must now do
> extra contortions to somewhat match the behavior of C Git.
> 
> At this point I think most of the rules package is overcomplicated
> and overoptimized, and yet doesn't actually quite match the behavior
> of C Git.
> 

Still I think that the behavior of git-add is strange: For example, if you want to add the following file: a/b/c/test.txt Then I can do this with "a/\*.txt" or "a/b\*.txt" but not with "a/\*/c/test.txt"

I know that I handle "a/b\*.txt" wrong, and I don't know a nice way to implement it in the current rules framework.

I see three options: 1.) Let the jgit add command work in another way then git-add does. 2.) Don't use the rules framework to determine if a file is selected by the add command. 3.) Completely drop the patches [4.) Add some evil hacks to make it working] <- I don't like that version

Please tell me which way to go, so that I don't waste even more time on patches which will never make it in.

Best regards, Florian

Previous: Shawn O. PearceNext: Robin Rosenberg
Message 37 of 46 in “Implementation of a file tree iteration using ignore rules.”
  1. 0/24 Implementation of a file tree iteration using ignore rules.Florian Koeberle, May 12, 2008
  2. 01/24 Start of an implementation of a git like command line tool.Florian Koeberle, May 12, 2008
  3. 02/24 Formatted Repository class.Florian Koeberle, May 12, 2008
  4. 03/24 Formatted Constats class.Florian Koeberle, May 12, 2008
  5. 04/24 Added path related constats to Constats class.Florian Koeberle, May 12, 2008
  6. Shawn O. PearceMay 12, 2008
  7. Florian KöberleMay 23, 2008
  8. 05/24 Added WorkTree class which can be constructed over Repository.Florian Koeberle, May 12, 2008
  9. Shawn O. PearceMay 13, 2008
  10. Robin RosenbergMay 13, 2008
  11. Shawn O. PearceMay 14, 2008
  12. 06/24 Added a "init" command to the git like command line tool.Florian Koeberle, May 12, 2008
  13. 07/24 Added findWorkTree method to Repository class.Florian Koeberle, May 12, 2008
  14. Shawn O. PearceMay 13, 2008
  15. Florian KöberleMay 23, 2008
  16. Miklos VajnaMay 23, 2008
  17. Shawn O. PearceMay 23, 2008
  18. Robin RosenbergMay 23, 2008
  19. 08/24 Added the interface FilePattern.Florian Koeberle, May 12, 2008
  20. 09/24 Added the class Rule.Florian Koeberle, May 12, 2008
  21. 10/24 Added the iterface Rules.Florian Koeberle, May 12, 2008
  22. 11/24 Added the class FNMatchPattern.Florian Koeberle, May 12, 2008
  23. Shawn O. PearceMay 13, 2008
  24. 12/24 Added the class GlobalFilePatternFlorian Koeberle, May 12, 2008
  25. 13/24 Added the class ComplexFilePattern.Florian Koeberle, May 12, 2008
  26. 14/24 Added the class IgnoreRuleListFactory.Florian Koeberle, May 12, 2008
  27. Shawn O. PearceMay 13, 2008
  28. Florian KöberleMay 13, 2008
  29. Shawn O. PearceMay 14, 2008
  30. 15/24 Added a Rules interface implementation and a factory for it.Florian Koeberle, May 12, 2008
  31. 16/24 Added test class OverallIgnoreRulestest.Florian Koeberle, May 12, 2008
  32. 17/24 Added the class TreeFilePattern.Florian Koeberle, May 12, 2008
  33. Shawn O. PearceMay 13, 2008
  34. 18/24 Added InvalidPatternException and PathNotInProjectDirectoryExceptionFlorian Koeberle, May 12, 2008
  35. 19/24 Added the class AddRuleListFactory.Florian Koeberle, May 12, 2008
  36. Shawn O. PearceMay 13, 2008
  37. Florian KöberleMay 13, 2008
  38. Robin RosenbergMay 13, 2008
  39. Shawn O. PearceMay 14, 2008
  40. 20/24 Added class AddRulesFactory.Florian Koeberle, May 12, 2008
  41. 21/24 Added the class LightFileTreeIterator and a test for it.Florian Koeberle, May 12, 2008
  42. Paolo BonziniMay 14, 2008
  43. 22/24 Added class LightFileTreeIterable.Florian Koeberle, May 12, 2008
  44. 23/24 Added the test class AddCommandIterationTest.Florian Koeberle, May 12, 2008
  45. 24/24 Added a "add" command to the git like command line tool.Florian Koeberle, May 12, 2008
  46. Miklos VajnaMay 12, 2008

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.