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

Re: [PATCH v2 10/15] dir-iterator: refactor dir_iterator_advance()

From
PKPlato Kiorpelidis <kioplato@gmail.com>
Date
May 18, 2022, 15:39 UTC
Message-ID
<20220518153951.ebmcd5nsnwwdrebz@compass>
In-Reply-To
<xmqqr152be4n.fsf@gitster.g>
On 22/05/09 02:16PM, Junio C Hamano wrote:
Show 24 quoted lines
> Plato Kiorpelidis <kioplato@gmail.com> writes:
> 
> > Simplify dir_iterator_advance() by converting from iterative to
> > recursive implementation. This conversion makes dir-iterator more
> > maintainable for the following reasons:
> >   * dir-iterator iterates the file-system, which is a tree structure.
> >     Traditionally, tree traversals, in textbooks, lectures and online
> >     sources are implemented recursively and not iteratively. Therefore
> >     it helps reduce mental load for readers, since it's easier to follow
> >     as it reminds of the same tree traversals we use on tree structures.
> 
> Careful.
> 
> Many algorithms that are taught in the recursive form in textbooks
> are turned into iterative in production systems for a reason.  To
> avoid too deep a recursion wasting too much stack space.  A loop
> with management of work items using in-program data structures like
> stack or queue often makes a large traversal bearable.
> 
> The most obvious example is our history traversal code.  History
> stored in Git is a tree structure, but no sane reimplementation of
> Git (well, at least those that want to be able to deal with a
> history larger than a toy project) would implement "git log" using a
> recursive algorithm.

That's a good point, I didn't think about that. It's also something that's objective, so it's easier to reach a conclusion. This whole refactoring of dir_iterator_advance() is a matter of opinion on what's more readable or not.

In this case, however, the dir_iterator_advance() is performing tail recursion which doesn't require stack space. It reuses the stack frame from the current call for the next call. Does this still pose a problem and why? If it does, I've got no problem to work with the existing iterative implementation.

Thanks, Plato

Previous: Junio C HamanoNext: Phillip Wood
Message 16 of 31 in “[GSoC] iterate dirs before or after their contents”
  1. 00/15 [GSoC] iterate dirs before or after their contentsPlato Kiorpelidis, May 9, 2022
  2. 01/15 t0066: refactor dir-iterator testsPlato Kiorpelidis, May 9, 2022
  3. 02/15 t0066: remove dependency between unrelated testsPlato Kiorpelidis, May 9, 2022
  4. 03/15 t0066: shorter expected and actual output file namesPlato Kiorpelidis, May 9, 2022
  5. 04/15 test-dir-iterator: consistently return EXIT_FAILURE or EXIT_SUCCESSPlato Kiorpelidis, May 9, 2022
  6. Junio C HamanoMay 9, 2022
  7. Plato KiorpelidisMay 18, 2022
  8. Junio C HamanoMay 18, 2022
  9. 05/15 test-dir-iterator: print EACCES and ELOOP errno set by dir_iteratorPlato Kiorpelidis, May 9, 2022
  10. 06/15 test-dir-iterator: print errno name set by dir_iterator_advancePlato Kiorpelidis, May 9, 2022
  11. 09/15 t0066: rename test directoriesPlato Kiorpelidis, May 9, 2022
  12. 08/15 t0066: reorder tests from simple to more complexPlato Kiorpelidis, May 9, 2022
  13. 07/15 t0066: better test coverage for dir-iteratorPlato Kiorpelidis, May 9, 2022
  14. 10/15 dir-iterator: refactor dir_iterator_advance()Plato Kiorpelidis, May 9, 2022
  15. Junio C HamanoMay 9, 2022
  16. Plato KiorpelidisMay 18, 2022
  17. Phillip WoodMay 10, 2022
  18. 11/15 dir-iterator: open root dir in dir_iterator_begin()Plato Kiorpelidis, May 9, 2022
  19. 12/15 t0066: rename subtest descriptionsPlato Kiorpelidis, May 9, 2022
  20. 15/15 entry.c: use dir-iterator to avoid explicit dir traversalPlato Kiorpelidis, May 9, 2022
  21. Phillip WoodMay 10, 2022
  22. 13/15 dir-iterator: option to iterate dirs in pre-orderPlato Kiorpelidis, May 9, 2022
  23. Phillip WoodMay 10, 2022
  24. Plato KiorpelidisMay 18, 2022
  25. rsbecker@nexbridge.comMay 18, 2022
  26. Junio C HamanoMay 18, 2022
  27. rsbecker@nexbridge.comMay 18, 2022
  28. 14/15 dir-iterator: option to iterate dirs in post-orderPlato Kiorpelidis, May 9, 2022
  29. Phillip WoodMay 10, 2022
  30. Junio C HamanoMay 10, 2022
  31. Plato KiorpelidisMay 20, 2022

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.