/*
 * 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);
