/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
#ifndef INCLUDE_pathspec_h__
#define INCLUDE_pathspec_h__

#include "common.h"
#include <git2/pathspec.h>
#include "buffer.h"
#include "vector.h"
#include "pool.h"
#include "array.h"

/* public compiled pathspec */
struct git_pathspec {
	git_refcount rc;
	char *prefix;
	git_vector pathspec;
	git_pool pool;
};

enum {
	PATHSPEC_DATATYPE_STRINGS = 0,
	PATHSPEC_DATATYPE_DIFF = 1,
};

typedef git_array_t(char *) git_pathspec_string_array_t;

/* public interface to pathspec matching */
struct git_pathspec_match_list {
	git_pathspec *pathspec;
	git_array_t(void *) matches;
	git_pathspec_string_array_t failures;
	git_pool pool;
	int datatype;
};

/* what is the common non-wildcard prefix for all items in the pathspec */
extern char *git_pathspec_prefix(const git_strarray *pathspec);

/* is there anything in the spec that needs to be filtered on */
extern bool git_pathspec_is_empty(const git_strarray *pathspec);

/* build a vector of fnmatch patterns to evaluate efficiently */
extern int git_pathspec__vinit(
	git_vector *vspec, const git_strarray *strspec, git_pool *strpool);

/* free data from the pathspec vector */
extern void git_pathspec__vfree(git_vector *vspec);

#define GIT_PATHSPEC_NOMATCH ((size_t)-1)

/*
 * Match a path against the vectorized pathspec.
 * The matched pathspec is passed back into the `matched_pathspec` parameter,
 * unless it is passed as NULL by the caller.
 */
extern bool git_pathspec__match(
	const git_vector *vspec,
	const char *path,
	bool disable_fnmatch,
	bool casefold,
	const char **matched_pathspec,
	size_t *matched_at);

/* easy pathspec setup */

extern int git_pathspec__init(git_pathspec *ps, const git_strarray *paths);

extern void git_pathspec__clear(git_pathspec *ps);

#endif
