Commit a32ab076 by Edward Thomson

blob: introduce git_blob_filter

Provide a function to filter blobs that allows for more functionality
than the existing `git_blob_filtered_content` function.
parent c0290e27
......@@ -97,6 +97,27 @@ GIT_EXTERN(const void *) git_blob_rawcontent(const git_blob *blob);
GIT_EXTERN(git_off_t) git_blob_rawsize(const git_blob *blob);
/**
* Flags to control the functionality of `git_blob_filter`.
*/
typedef enum {
/** When set, filters will not be applied to binary files. */
GIT_BLOB_FILTER_CHECK_FOR_BINARY = (1 << 0),
} git_blob_filter_flag_t;
/**
* The options used when applying filter options to a file.
*/
typedef struct {
int version;
/** Flags to control the filtering process */
git_blob_filter_flag_t flags;
} git_blob_filter_options;
#define GIT_BLOB_FILTER_OPTIONS_VERSION 1
#define GIT_BLOB_FILTER_OPTIONS_INIT {GIT_BLOB_FILTER_OPTIONS_VERSION, GIT_BLOB_FILTER_CHECK_FOR_BINARY}
/**
* Get a buffer with the filtered content of a blob.
*
* This applies filters as if the blob was being checked out to the
......@@ -115,6 +136,24 @@ GIT_EXTERN(git_off_t) git_blob_rawsize(const git_blob *blob);
* @param out The git_buf to be filled in
* @param blob Pointer to the blob
* @param as_path Path used for file attribute lookups, etc.
* @param opts Options to use for filtering the blob
* @return 0 on success or an error code
*/
GIT_EXTERN(int) git_blob_filter(
git_buf *out,
git_blob *blob,
const char *as_path,
git_blob_filter_options *opts);
/**
* Get a buffer with the filtered content of a blob. This is
* equivalent to calling `git_blob_filter`, with the only possible
* option being the binary check.
*
* @see git_blob_filter
* @param out The git_buf to be filled in
* @param blob Pointer to the blob
* @param as_path Path used for file attribute lookups, etc.
* @param check_for_binary_data Should this test if blob content contains
* NUL bytes / looks like binary data before applying filters?
* @return 0 on success or an error code
......
......@@ -400,25 +400,34 @@ int git_blob_is_binary(const git_blob *blob)
return git_buf_text_is_binary(&content);
}
int git_blob_filtered_content(
int git_blob_filter(
git_buf *out,
git_blob *blob,
const char *path,
int check_for_binary_data)
git_blob_filter_options *given_opts)
{
int error = 0;
git_filter_list *fl = NULL;
git_blob_filter_options opts = GIT_BLOB_FILTER_OPTIONS_INIT;
git_filter_flag_t flags = GIT_FILTER_DEFAULT;
assert(blob && path && out);
git_buf_sanitize(out);
if (check_for_binary_data && git_blob_is_binary(blob))
GIT_ERROR_CHECK_VERSION(
given_opts, GIT_BLOB_FILTER_OPTIONS_VERSION, "git_blob_filter_options");
if (given_opts != NULL)
memcpy(&opts, given_opts, sizeof(git_blob_filter_options));
if ((opts.flags & GIT_BLOB_FILTER_CHECK_FOR_BINARY) != 0 &&
git_blob_is_binary(blob))
return 0;
if (!(error = git_filter_list_load(
&fl, git_blob_owner(blob), blob, path,
GIT_FILTER_TO_WORKTREE, GIT_FILTER_DEFAULT))) {
GIT_FILTER_TO_WORKTREE, flags))) {
error = git_filter_list_apply_to_blob(out, fl, blob);
......@@ -428,6 +437,22 @@ int git_blob_filtered_content(
return error;
}
int git_blob_filtered_content(
git_buf *out,
git_blob *blob,
const char *path,
int check_for_binary_data)
{
git_blob_filter_options opts = GIT_BLOB_FILTER_OPTIONS_INIT;
if (check_for_binary_data)
opts.flags |= GIT_BLOB_FILTER_CHECK_FOR_BINARY;
else
opts.flags &= ~GIT_BLOB_FILTER_CHECK_FOR_BINARY;
return git_blob_filter(out, blob, path, &opts);
}
/* Deprecated functions */
int git_blob_create_frombuffer(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment