diff options
author | Ben Straub <bstraub@github.com> | 2012-07-16 23:06:23 +0400 |
---|---|---|
committer | Ben Straub <bstraub@github.com> | 2012-07-16 23:06:23 +0400 |
commit | 9587895f572ad4808fb1746dd6510f92ec30c3a6 (patch) | |
tree | 7de0a8d95aafa99901ad8221d7f7af5348897c13 /src/filter.c | |
parent | 41ad70d0a8d5bf294197be5da26411bc7aa33fcc (diff) |
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.
Diffstat (limited to 'src/filter.c')
-rw-r--r-- | src/filter.c | 33 |
1 files changed, 33 insertions, 0 deletions
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; +} + |