|  | tree walking API | 
|  | ================ | 
|  |  | 
|  | The tree walking API is used to traverse and inspect trees. | 
|  |  | 
|  | Data Structures | 
|  | --------------- | 
|  |  | 
|  | `struct name_entry`:: | 
|  |  | 
|  | An entry in a tree. Each entry has a sha1 identifier, pathname, and | 
|  | mode. | 
|  |  | 
|  | `struct tree_desc`:: | 
|  |  | 
|  | A semi-opaque data structure used to maintain the current state of the | 
|  | walk. | 
|  | + | 
|  | * `buffer` is a pointer into the memory representation of the tree. It always | 
|  | points at the current entry being visited. | 
|  |  | 
|  | * `size` counts the number of bytes left in the `buffer`. | 
|  |  | 
|  | * `entry` points to the current entry being visited. | 
|  |  | 
|  | `struct traverse_info`:: | 
|  |  | 
|  | A structure used to maintain the state of a traversal. | 
|  | + | 
|  | * `prev` points to the traverse_info which was used to descend into the | 
|  | current tree. If this is the top-level tree `prev` will point to | 
|  | a dummy traverse_info. | 
|  |  | 
|  | * `name` is the entry for the current tree (if the tree is a subtree). | 
|  |  | 
|  | * `pathlen` is the length of the full path for the current tree. | 
|  |  | 
|  | * `conflicts` can be used by callbacks to maintain directory-file conflicts. | 
|  |  | 
|  | * `fn` is a callback called for each entry in the tree. See Traversing for more | 
|  | information. | 
|  |  | 
|  | * `data` can be anything the `fn` callback would want to use. | 
|  |  | 
|  | * `show_all_errors` tells whether to stop at the first error or not. | 
|  |  | 
|  | Initializing | 
|  | ------------ | 
|  |  | 
|  | `init_tree_desc`:: | 
|  |  | 
|  | Initialize a `tree_desc` and decode its first entry. The buffer and | 
|  | size parameters are assumed to be the same as the buffer and size | 
|  | members of `struct tree`. | 
|  |  | 
|  | `fill_tree_descriptor`:: | 
|  |  | 
|  | Initialize a `tree_desc` and decode its first entry given the sha1 of | 
|  | a tree. Returns the `buffer` member if the sha1 is a valid tree | 
|  | identifier and NULL otherwise. | 
|  |  | 
|  | `setup_traverse_info`:: | 
|  |  | 
|  | Initialize a `traverse_info` given the pathname of the tree to start | 
|  | traversing from. The `base` argument is assumed to be the `path` | 
|  | member of the `name_entry` being recursed into unless the tree is a | 
|  | top-level tree in which case the empty string ("") is used. | 
|  |  | 
|  | Walking | 
|  | ------- | 
|  |  | 
|  | `tree_entry`:: | 
|  |  | 
|  | Visit the next entry in a tree. Returns 1 when there are more entries | 
|  | left to visit and 0 when all entries have been visited. This is | 
|  | commonly used in the test of a while loop. | 
|  |  | 
|  | `tree_entry_len`:: | 
|  |  | 
|  | Calculate the length of a tree entry's pathname. This utilizes the | 
|  | memory structure of a tree entry to avoid the overhead of using a | 
|  | generic strlen(). | 
|  |  | 
|  | `update_tree_entry`:: | 
|  |  | 
|  | Walk to the next entry in a tree. This is commonly used in conjunction | 
|  | with `tree_entry_extract` to inspect the current entry. | 
|  |  | 
|  | `tree_entry_extract`:: | 
|  |  | 
|  | Decode the entry currently being visited (the one pointed to by | 
|  | `tree_desc's` `entry` member) and return the sha1 of the entry. The | 
|  | `pathp` and `modep` arguments are set to the entry's pathname and mode | 
|  | respectively. | 
|  |  | 
|  | `get_tree_entry`:: | 
|  |  | 
|  | Find an entry in a tree given a pathname and the sha1 of a tree to | 
|  | search. Returns 0 if the entry is found and -1 otherwise. The third | 
|  | and fourth parameters are set to the entry's sha1 and mode | 
|  | respectively. | 
|  |  | 
|  | Traversing | 
|  | ---------- | 
|  |  | 
|  | `traverse_trees`:: | 
|  |  | 
|  | Traverse `n` number of trees in parallel. The `fn` callback member of | 
|  | `traverse_info` is called once for each tree entry. | 
|  |  | 
|  | `traverse_callback_t`:: | 
|  | The arguments passed to the traverse callback are as follows: | 
|  | + | 
|  | * `n` counts the number of trees being traversed. | 
|  |  | 
|  | * `mask` has its nth bit set if something exists in the nth entry. | 
|  |  | 
|  | * `dirmask` has its nth bit set if the nth tree's entry is a directory. | 
|  |  | 
|  | * `entry` is an array of size `n` where the nth entry is from the nth tree. | 
|  |  | 
|  | * `info` maintains the state of the traversal. | 
|  |  | 
|  | + | 
|  | Returning a negative value will terminate the traversal. Otherwise the | 
|  | return value is treated as an update mask. If the nth bit is set the nth tree | 
|  | will be updated and if the bit is not set the nth tree entry will be the | 
|  | same in the next callback invocation. | 
|  |  | 
|  | `make_traverse_path`:: | 
|  |  | 
|  | Generate the full pathname of a tree entry based from the root of the | 
|  | traversal. For example, if the traversal has recursed into another | 
|  | tree named "bar" the pathname of an entry "baz" in the "bar" | 
|  | tree would be "bar/baz". | 
|  |  | 
|  | `traverse_path_len`:: | 
|  |  | 
|  | Calculate the length of a pathname returned by `make_traverse_path`. | 
|  | This utilizes the memory structure of a tree entry to avoid the | 
|  | overhead of using a generic strlen(). | 
|  |  | 
|  | Authors | 
|  | ------- | 
|  |  | 
|  | Written by Junio C Hamano <gitster@pobox.com> and Linus Torvalds | 
|  | <torvalds@linux-foundation.org> |