From 9587895f572ad4808fb1746dd6510f92ec30c3a6 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Mon, 16 Jul 2012 12:06:23 -0700 Subject: [PATCH] Migrate code to git_filter_blob_contents. Also removes the unnecessary check for filter length, since git_filters_apply does the right thing when there are none, and it's more efficient than this. --- src/checkout.c | 39 +-------------------------------------- src/filter.c | 33 +++++++++++++++++++++++++++++++++ src/filter.h | 12 ++++++++++++ 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/checkout.c b/src/checkout.c index 61e81c538..dc4e559e1 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -32,49 +32,12 @@ typedef struct tree_walk_data } tree_walk_data; -static int unfiltered_blob_contents(git_buf *out, git_repository *repo, const git_oid *blob_id) -{ - int retcode = GIT_ERROR; - git_blob *blob; - - if (!(retcode = git_blob_lookup(&blob, repo, blob_id))) - retcode = git_blob__getbuf(out, blob); - - return retcode; -} - -static int filtered_blob_contents(git_buf *out, git_repository *repo, const git_oid *oid, const char *path) -{ - int retcode = GIT_ERROR; - - git_buf unfiltered = GIT_BUF_INIT; - if (!unfiltered_blob_contents(&unfiltered, repo, oid)) { - git_vector filters = GIT_VECTOR_INIT; - int filter_count = git_filters_load(&filters, repo, - path, GIT_FILTER_TO_WORKTREE); - if (filter_count >= 0) { - git_buf_clear(out); - if (!filter_count) { - git_buf_put(out, git_buf_cstr(&unfiltered), git_buf_len(&unfiltered)); - retcode = 0; - } else { - retcode = git_filters_apply(out, &unfiltered, &filters); - } - } - - git_filters_free(&filters); - } - - git_buf_free(&unfiltered); - return retcode; -} - static int blob_contents_to_file(git_repository *repo, git_buf *fnbuf, const git_oid *id, int mode) { int retcode = GIT_ERROR; git_buf filteredcontents = GIT_BUF_INIT; - if (!filtered_blob_contents(&filteredcontents, repo, id, git_buf_cstr(fnbuf))) { + if (!git_filter_blob_contents(&filteredcontents, repo, id, git_buf_cstr(fnbuf))) { int fd = git_futils_creat_withpath(git_buf_cstr(fnbuf), GIT_DIR_MODE, mode); if (fd >= 0) { diff --git a/src/filter.c b/src/filter.c index aa95e0267..ecdc809a4 100644 --- a/src/filter.c +++ b/src/filter.c @@ -11,6 +11,7 @@ #include "filter.h" #include "repository.h" #include "git2/config.h" +#include "blob.h" /* Tweaked from Core Git. I wonder what we could use this for... */ void git_text_gather_stats(git_text_stats *stats, const git_buf *text) @@ -163,3 +164,35 @@ int git_filters_apply(git_buf *dest, git_buf *source, git_vector *filters) return 0; } + +static int unfiltered_blob_contents(git_buf *out, git_repository *repo, const git_oid *blob_id) +{ + int retcode = GIT_ERROR; + git_blob *blob; + + if (!(retcode = git_blob_lookup(&blob, repo, blob_id))) + retcode = git_blob__getbuf(out, blob); + + return retcode; +} + +int git_filter_blob_contents(git_buf *out, git_repository *repo, const git_oid *oid, const char *path) +{ + int retcode = GIT_ERROR; + + git_buf unfiltered = GIT_BUF_INIT; + if (!unfiltered_blob_contents(&unfiltered, repo, oid)) { + git_vector filters = GIT_VECTOR_INIT; + if (git_filters_load(&filters, + repo, path, GIT_FILTER_TO_WORKTREE) >= 0) { + git_buf_clear(out); + retcode = git_filters_apply(out, &unfiltered, &filters); + } + + git_filters_free(&filters); + } + + git_buf_free(&unfiltered); + return retcode; +} + diff --git a/src/filter.h b/src/filter.h index b9beb4942..5b7a25b04 100644 --- a/src/filter.h +++ b/src/filter.h @@ -119,4 +119,16 @@ extern void git_text_gather_stats(git_text_stats *stats, const git_buf *text); */ extern int git_text_is_binary(git_text_stats *stats); + +/** + * Get the content of a blob after all filters have been run. + * + * @param out buffer to receive the contents + * @param repo repository containing the blob + * @param oid object id for the blob + * @param path path to the blob's output file, relative to the workdir root + * @return 0 on success, an error code otherwise + */ +extern int git_filter_blob_contents(git_buf *out, git_repository *repo, const git_oid *oid, const char *path); + #endif