33
44#include "cache.h"
55
6+ /**
7+ * The tree walking API is used to traverse and inspect trees.
8+ */
9+
10+ /**
11+ * An entry in a tree. Each entry has a sha1 identifier, pathname, and mode.
12+ */
613struct name_entry {
714 struct object_id oid ;
815 const char * path ;
916 int pathlen ;
1017 unsigned int mode ;
1118};
1219
20+ /**
21+ * A semi-opaque data structure used to maintain the current state of the walk.
22+ */
1323struct tree_desc {
24+ /*
25+ * pointer into the memory representation of the tree. It always
26+ * points at the current entry being visited.
27+ */
1428 const void * buffer ;
29+
30+ /* points to the current entry being visited. */
1531 struct name_entry entry ;
32+
33+ /* counts the number of bytes left in the `buffer`. */
1634 unsigned int size ;
1735};
1836
37+ /**
38+ * Decode the entry currently being visited (the one pointed to by
39+ * `tree_desc's` `entry` member) and return the sha1 of the entry. The
40+ * `pathp` and `modep` arguments are set to the entry's pathname and mode
41+ * respectively.
42+ */
1943static inline const struct object_id * tree_entry_extract (struct tree_desc * desc , const char * * pathp , unsigned short * modep )
2044{
2145 * pathp = desc -> entry .path ;
2246 * modep = desc -> entry .mode ;
2347 return & desc -> entry .oid ;
2448}
2549
50+ /**
51+ * Calculate the length of a tree entry's pathname. This utilizes the
52+ * memory structure of a tree entry to avoid the overhead of using a
53+ * generic strlen().
54+ */
2655static inline int tree_entry_len (const struct name_entry * ne )
2756{
2857 return ne -> pathlen ;
@@ -33,52 +62,141 @@ static inline int tree_entry_len(const struct name_entry *ne)
3362 * corrupt tree entry rather than dying,
3463 */
3564
65+ /**
66+ * Walk to the next entry in a tree. This is commonly used in conjunction
67+ * with `tree_entry_extract` to inspect the current entry.
68+ */
3669void update_tree_entry (struct tree_desc * );
70+
3771int update_tree_entry_gently (struct tree_desc * );
72+
73+ /**
74+ * Initialize a `tree_desc` and decode its first entry. The buffer and
75+ * size parameters are assumed to be the same as the buffer and size
76+ * members of `struct tree`.
77+ */
3878void init_tree_desc (struct tree_desc * desc , const void * buf , unsigned long size );
79+
3980int init_tree_desc_gently (struct tree_desc * desc , const void * buf , unsigned long size );
4081
4182/*
42- * Helper function that does both tree_entry_extract() and update_tree_entry()
43- * and returns true for success
83+ * Visit the next entry in a tree. Returns 1 when there are more entries
84+ * left to visit and 0 when all entries have been visited. This is
85+ * commonly used in the test of a while loop.
4486 */
4587int tree_entry (struct tree_desc * , struct name_entry * );
88+
4689int tree_entry_gently (struct tree_desc * , struct name_entry * );
4790
91+ /**
92+ * Initialize a `tree_desc` and decode its first entry given the
93+ * object ID of a tree. Returns the `buffer` member if the latter
94+ * is a valid tree identifier and NULL otherwise.
95+ */
4896void * fill_tree_descriptor (struct repository * r ,
4997 struct tree_desc * desc ,
5098 const struct object_id * oid );
5199
52100struct traverse_info ;
53101typedef int (* traverse_callback_t )(int n , unsigned long mask , unsigned long dirmask , struct name_entry * entry , struct traverse_info * );
102+
103+ /**
104+ * Traverse `n` number of trees in parallel. The `fn` callback member of
105+ * `traverse_info` is called once for each tree entry.
106+ */
54107int traverse_trees (struct index_state * istate , int n , struct tree_desc * t , struct traverse_info * info );
55108
56109enum get_oid_result get_tree_entry_follow_symlinks (struct repository * r , struct object_id * tree_oid , const char * name , struct object_id * result , struct strbuf * result_path , unsigned short * mode );
57110
111+ /**
112+ * A structure used to maintain the state of a traversal.
113+ */
58114struct traverse_info {
59115 const char * traverse_path ;
116+
117+ /*
118+ * points to the traverse_info which was used to descend into the
119+ * current tree. If this is the top-level tree `prev` will point to
120+ * a dummy traverse_info.
121+ */
60122 struct traverse_info * prev ;
123+
124+ /* is the entry for the current tree (if the tree is a subtree). */
61125 const char * name ;
126+
62127 size_t namelen ;
63128 unsigned mode ;
64129
130+ /* is the length of the full path for the current tree. */
65131 size_t pathlen ;
132+
66133 struct pathspec * pathspec ;
67134
135+ /* can be used by callbacks to maintain directory-file conflicts. */
68136 unsigned long df_conflicts ;
137+
138+ /* a callback called for each entry in the tree.
139+ *
140+ * The arguments passed to the traverse callback are as follows:
141+ *
142+ * - `n` counts the number of trees being traversed.
143+ *
144+ * - `mask` has its nth bit set if something exists in the nth entry.
145+ *
146+ * - `dirmask` has its nth bit set if the nth tree's entry is a directory.
147+ *
148+ * - `entry` is an array of size `n` where the nth entry is from the nth tree.
149+ *
150+ * - `info` maintains the state of the traversal.
151+ *
152+ * Returning a negative value will terminate the traversal. Otherwise the
153+ * return value is treated as an update mask. If the nth bit is set the nth tree
154+ * will be updated and if the bit is not set the nth tree entry will be the
155+ * same in the next callback invocation.
156+ */
69157 traverse_callback_t fn ;
158+
159+ /* can be anything the `fn` callback would want to use. */
70160 void * data ;
161+
162+ /* tells whether to stop at the first error or not. */
71163 int show_all_errors ;
72164};
73165
166+ /**
167+ * Find an entry in a tree given a pathname and the sha1 of a tree to
168+ * search. Returns 0 if the entry is found and -1 otherwise. The third
169+ * and fourth parameters are set to the entry's sha1 and mode respectively.
170+ */
74171int get_tree_entry (struct repository * , const struct object_id * , const char * , struct object_id * , unsigned short * );
172+
173+ /**
174+ * Generate the full pathname of a tree entry based from the root of the
175+ * traversal. For example, if the traversal has recursed into another
176+ * tree named "bar" the pathname of an entry "baz" in the "bar"
177+ * tree would be "bar/baz".
178+ */
75179char * make_traverse_path (char * path , size_t pathlen , const struct traverse_info * info ,
76180 const char * name , size_t namelen );
181+
182+ /**
183+ * Convenience wrapper to `make_traverse_path` into a strbuf.
184+ */
77185void strbuf_make_traverse_path (struct strbuf * out ,
78186 const struct traverse_info * info ,
79187 const char * name , size_t namelen );
188+
189+ /**
190+ * Initialize a `traverse_info` given the pathname of the tree to start
191+ * traversing from.
192+ */
80193void setup_traverse_info (struct traverse_info * info , const char * base );
81194
195+ /**
196+ * Calculate the length of a pathname returned by `make_traverse_path`.
197+ * This utilizes the memory structure of a tree entry to avoid the
198+ * overhead of using a generic strlen().
199+ */
82200static inline size_t traverse_path_len (const struct traverse_info * info ,
83201 size_t namelen )
84202{
0 commit comments