The path-walk API is used to walk reachable objects, but to visit objects in batches based on a common path they appear in, or by type.
For example, all reachable commits are visited in a group. All tags are
visited in a group. Then, all root trees are visited. At some point, all
blobs reachable via a path my/dir/to/A
are visited. When there are
multiple paths possible to reach the same object, then only one of those
paths is used to visit the object.
Basics
To use the path-walk API, include path-walk.h
and call
walk_objects_by_path
() with a customized path_walk_info
struct. The
struct is used to set all of the options for how the walk should proceed.
Let’s dig into the different options and their use.
path_fn
andpath_fn_data
-
The most important option is the
path_fn
option, which is a function pointer to the callback that can execute logic on the object IDs for objects grouped by type and path. This function also receives adata
value that corresponds to thepath_fn_data
member, for providing custom data structures to this callback function. revs
-
To configure the exact details of the reachable set of objects, use the
revs
member and initialize it using the revision machinery inrevision.h
. Initializerevs
using calls such assetup_revisions
() orparse_revision_opt
(). Do not callprepare_revision_walk
(), as that will be called withinwalk_objects_by_path
().It is also important that you do not specify the
--objects
flag for therevs
struct. The revision walk should only be used to walk commits, and the objects will be walked in a separate way based on those starting commits. commits
,blobs
,trees
,tags
-
By default, these members are enabled and signal that the path-walk API should call the
path_fn
on objects of these types. Specialized applications could disable some options to make it simpler to walk the objects or to have fewer calls topath_fn
.While it is possible to walk only commits in this way, consumers would be better off using the revision walk API instead.
prune_all_uninteresting
-
By default, all reachable paths are emitted by the path-walk API. This option allows consumers to declare that they are not interested in paths where all included objects are marked with the
UNINTERESTING
flag. This requires using theboundary
option in the revision walk so that the walk emits commits marked with theUNINTERESTING
flag.
Examples
See example usages in:
t/helper/test-path-walk.c