/* * path-walk.h : Methods and structures for walking the object graph in batches * by the paths that can reach those objects. */ #include "object.h" /* Required for 'enum object_type'. */ struct rev_info; struct oid_array; struct pattern_list; /** * The type of a function pointer for the method that is called on a list of * objects reachable at a given path. */ typedef int (*path_fn)(const char *path, struct oid_array *oids, enum object_type type, void *data); struct path_walk_info { /** * revs provides the definitions for the commit walk, including * which commits are UNINTERESTING or not. This structure is * expected to be owned by the caller. */ struct rev_info *revs; /** * The caller wishes to execute custom logic on objects reachable at a * given path. Every reachable object will be visited exactly once, and * the first path to see an object wins. This may not be a stable choice. */ path_fn path_fn; void *path_fn_data; /** * Initialize which object types the path_fn should be called on. This * could also limit the walk to skip blobs if not set. */ int commits; int trees; int blobs; int tags; /** * When 'prune_all_uninteresting' is set and a path has all objects * marked as UNINTERESTING, then the path-walk will not visit those * objects. It will not call path_fn on those objects and will not * walk the children of such trees. */ int prune_all_uninteresting; /** * Specify a sparse-checkout definition to match our paths to. Do not * walk outside of this sparse definition. If the patterns are in * cone mode, then the search may prune directories that are outside * of the cone. If not in cone mode, then all tree paths will be * explored but the path_fn will only be called when the path matches * the sparse-checkout patterns. */ struct pattern_list *pl; }; #define PATH_WALK_INFO_INIT { \ .blobs = 1, \ .trees = 1, \ .commits = 1, \ .tags = 1, \ } void path_walk_info_init(struct path_walk_info *info); void path_walk_info_clear(struct path_walk_info *info); /** * Given the configuration of 'info', walk the commits based on 'info->revs' and * call 'info->path_fn' on each discovered path. * * Returns nonzero on an error. */ int walk_objects_by_path(struct path_walk_info *info);