* [RFC/PATCH] technical-docs: document tree-walking API
@ 2009-07-29 5:23 Stephen Boyd
2009-07-29 8:25 ` Junio C Hamano
0 siblings, 1 reply; 2+ messages in thread
From: Stephen Boyd @ 2009-07-29 5:23 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano
---
Since it's rc time right now I've decided to look into documenting one of the
simpler API's, or so I thought ;-) This is my first attempt and I would
appreciate any and all feedback.
Some things to get you started:
- the traversal callback mask parameter
- a better general usage description at the top
- add an authors section?
Documentation/technical/api-tree-walking.txt | 142 ++++++++++++++++++++++++-
1 files changed, 136 insertions(+), 6 deletions(-)
diff --git a/Documentation/technical/api-tree-walking.txt b/Documentation/technical/api-tree-walking.txt
index e3ddf91..baa382d 100644
--- a/Documentation/technical/api-tree-walking.txt
+++ b/Documentation/technical/api-tree-walking.txt
@@ -1,12 +1,142 @@
tree walking API
================
-Talk about <tree-walk.h>, things like
+The tree walking API is used to traverse and inspect trees.
-* struct tree_desc
-* init_tree_desc
-* tree_entry_extract
-* update_tree_entry
-* get_tree_entry
+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. The members are
+ as follows
++
+* `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.
+
+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 tree's being traversed.
+
+* `mask` has its nth bit set if the nth tree's entry is valid. (or different?)
+
+* `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().
(JC, Linus)
--
1.6.4.rc2.22.g65174
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [RFC/PATCH] technical-docs: document tree-walking API
2009-07-29 5:23 [RFC/PATCH] technical-docs: document tree-walking API Stephen Boyd
@ 2009-07-29 8:25 ` Junio C Hamano
0 siblings, 0 replies; 2+ messages in thread
From: Junio C Hamano @ 2009-07-29 8:25 UTC (permalink / raw)
To: Stephen Boyd; +Cc: git
Stephen Boyd <bebarino@gmail.com> writes:
> Some things to get you started:
>
> - the traversal callback mask parameter
> - a better general usage description at the top
> - add an authors section?
Thanks.
> diff --git a/Documentation/technical/api-tree-walking.txt b/Documentation/technical/api-tree-walking.txt
> index e3ddf91..baa382d 100644
> +* `mask` has its nth bit set if the nth tree's entry is valid. (or different?)
nth bit is set when something exists in that tree at the path (entry[nth]
could be either a file (regular or symlink) or a directory).
> +* `dirmask` has its nth bit set if the nth tree's entry is a directory.
Correct.
> +* `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.
Correct.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-07-29 8:25 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-07-29 5:23 [RFC/PATCH] technical-docs: document tree-walking API Stephen Boyd
2009-07-29 8:25 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox