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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
diff --git a/src/checkout.c b/src/checkout.c
index 61e81c5..dc4e559 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 aa95e02..ecdc809 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 b9beb49..5b7a25b 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