/* * 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_filter_h__ #define INCLUDE_filter_h__ #include "common.h" #include "buffer.h" #include "git2/odb.h" #include "git2/repository.h" typedef struct git_filter { int (*apply)(struct git_filter *self, git_buf *dest, const git_buf *source); void (*do_free)(struct git_filter *self); } git_filter; typedef enum { GIT_FILTER_TO_WORKTREE, GIT_FILTER_TO_ODB } git_filter_mode; typedef enum { GIT_CRLF_GUESS = -1, GIT_CRLF_BINARY = 0, GIT_CRLF_TEXT, GIT_CRLF_INPUT, GIT_CRLF_CRLF, GIT_CRLF_AUTO, } git_crlf_t; /* * FILTER API */ /* * For any given path in the working directory, fill the `filters` * array with the relevant filters that need to be applied. * * Mode is either `GIT_FILTER_TO_WORKTREE` if you need to load the * filters that will be used when checking out a file to the working * directory, or `GIT_FILTER_TO_ODB` for the filters used when writing * a file to the ODB. * * @param filters Vector where to store all the loaded filters * @param repo Repository object that contains `path` * @param path Relative path of the file to be filtered * @param mode Filtering direction (WT->ODB or ODB->WT) * @return the number of filters loaded for the file (0 if the file * doesn't need filtering), or a negative error code */ extern int git_filters_load(git_vector *filters, git_repository *repo, const char *path, int mode); /* * Apply one or more filters to a file. * * The file must have been loaded as a `git_buf` object. Both the `source` * and `dest` buffers are owned by the caller and must be freed once * they are no longer needed. * * NOTE: Because of the double-buffering schema, the `source` buffer that contains * the original file may be tampered once the filtering is complete. Regardless, * the `dest` buffer will always contain the final result of the filtering * * @param dest Buffer to store the result of the filtering * @param source Buffer containing the document to filter * @param filters A non-empty vector of filters as supplied by `git_filters_load` * @return 0 on success, an error code otherwise */ extern int git_filters_apply(git_buf *dest, git_buf *source, git_vector *filters); /* * Free the `filters` array generated by `git_filters_load`. * * Note that this frees both the array and its contents. The array will * be clean/reusable after this call. * * @param filters A filters array as supplied by `git_filters_load` */ extern void git_filters_free(git_vector *filters); /* * Available filters */ /* Strip CRLF, from Worktree to ODB */ extern int git_filter_add__crlf_to_odb(git_vector *filters, git_repository *repo, const char *path); /* Add CRLF, from ODB to worktree */ extern int git_filter_add__crlf_to_workdir(git_vector *filters, git_repository *repo, const char *path); #endif