Skip to content

Commit 6639ffc

Browse files
bebarinogitster
authored andcommitted
technical-docs: document tree-walking API
Signed-off-by: Stephen Boyd <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 07a4a3b commit 6639ffc

File tree

1 file changed

+140
-7
lines changed

1 file changed

+140
-7
lines changed
Lines changed: 140 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,145 @@
11
tree walking API
22
================
33

4-
Talk about <tree-walk.h>, things like
4+
The tree walking API is used to traverse and inspect trees.
55

6-
* struct tree_desc
7-
* init_tree_desc
8-
* tree_entry_extract
9-
* update_tree_entry
10-
* get_tree_entry
6+
Data Structures
7+
---------------
118

12-
(JC, Linus)
9+
`struct name_entry`::
10+
11+
An entry in a tree. Each entry has a sha1 identifier, pathname, and
12+
mode.
13+
14+
`struct tree_desc`::
15+
16+
A semi-opaque data structure used to maintain the current state of the
17+
walk.
18+
+
19+
* `buffer` is a pointer into the memory representation of the tree. It always
20+
points at the current entry being visited.
21+
22+
* `size` counts the number of bytes left in the `buffer`.
23+
24+
* `entry` points to the current entry being visited.
25+
26+
`struct traverse_info`::
27+
28+
A structure used to maintain the state of a traversal.
29+
+
30+
* `prev` points to the traverse_info which was used to descend into the
31+
current tree. If this is the top-level tree `prev` will point to
32+
a dummy traverse_info.
33+
34+
* `name` is the entry for the current tree (if the tree is a subtree).
35+
36+
* `pathlen` is the length of the full path for the current tree.
37+
38+
* `conflicts` can be used by callbacks to maintain directory-file conflicts.
39+
40+
* `fn` is a callback called for each entry in the tree. See Traversing for more
41+
information.
42+
43+
* `data` can be anything the `fn` callback would want to use.
44+
45+
Initializing
46+
------------
47+
48+
`init_tree_desc`::
49+
50+
Initialize a `tree_desc` and decode its first entry. The buffer and
51+
size parameters are assumed to be the same as the buffer and size
52+
members of `struct tree`.
53+
54+
`fill_tree_descriptor`::
55+
56+
Initialize a `tree_desc` and decode its first entry given the sha1 of
57+
a tree. Returns the `buffer` member if the sha1 is a valid tree
58+
identifier and NULL otherwise.
59+
60+
`setup_traverse_info`::
61+
62+
Initialize a `traverse_info` given the pathname of the tree to start
63+
traversing from. The `base` argument is assumed to be the `path`
64+
member of the `name_entry` being recursed into unless the tree is a
65+
top-level tree in which case the empty string ("") is used.
66+
67+
Walking
68+
-------
69+
70+
`tree_entry`::
71+
72+
Visit the next entry in a tree. Returns 1 when there are more entries
73+
left to visit and 0 when all entries have been visited. This is
74+
commonly used in the test of a while loop.
75+
76+
`tree_entry_len`::
77+
78+
Calculate the length of a tree entry's pathname. This utilizes the
79+
memory structure of a tree entry to avoid the overhead of using a
80+
generic strlen().
81+
82+
`update_tree_entry`::
83+
84+
Walk to the next entry in a tree. This is commonly used in conjunction
85+
with `tree_entry_extract` to inspect the current entry.
86+
87+
`tree_entry_extract`::
88+
89+
Decode the entry currently being visited (the one pointed to by
90+
`tree_desc's` `entry` member) and return the sha1 of the entry. The
91+
`pathp` and `modep` arguments are set to the entry's pathname and mode
92+
respectively.
93+
94+
`get_tree_entry`::
95+
96+
Find an entry in a tree given a pathname and the sha1 of a tree to
97+
search. Returns 0 if the entry is found and -1 otherwise. The third
98+
and fourth parameters are set to the entry's sha1 and mode
99+
respectively.
100+
101+
Traversing
102+
----------
103+
104+
`traverse_trees`::
105+
106+
Traverse `n` number of trees in parallel. The `fn` callback member of
107+
`traverse_info` is called once for each tree entry.
108+
109+
`traverse_callback_t`::
110+
The arguments passed to the traverse callback are as follows:
111+
+
112+
* `n` counts the number of trees being traversed.
113+
114+
* `mask` has its nth bit set if something exists in the nth entry.
115+
116+
* `dirmask` has its nth bit set if the nth tree's entry is a directory.
117+
118+
* `entry` is an array of size `n` where the nth entry is from the nth tree.
119+
120+
* `info` maintains the state of the traversal.
121+
122+
+
123+
Returning a negative value will terminate the traversal. Otherwise the
124+
return value is treated as an update mask. If the nth bit is set the nth tree
125+
will be updated and if the bit is not set the nth tree entry will be the
126+
same in the next callback invocation.
127+
128+
`make_traverse_path`::
129+
130+
Generate the full pathname of a tree entry based from the root of the
131+
traversal. For example, if the traversal has recursed into another
132+
tree named "bar" the pathname of an entry "baz" in the "bar"
133+
tree would be "bar/baz".
134+
135+
`traverse_path_len`::
136+
137+
Calculate the length of a pathname returned by `make_traverse_path`.
138+
This utilizes the memory structure of a tree entry to avoid the
139+
overhead of using a generic strlen().
140+
141+
Authors
142+
-------
143+
144+
Written by Junio C Hamano <[email protected]> and Linus Torvalds
145+

0 commit comments

Comments
 (0)