]> git.proxmox.com Git - libgit2.git/commitdiff
Migrate code to git_filter_blob_contents.
authorBen Straub <bstraub@github.com>
Mon, 16 Jul 2012 19:06:23 +0000 (12:06 -0700)
committerBen Straub <bstraub@github.com>
Mon, 16 Jul 2012 19:06:23 +0000 (12:06 -0700)
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
src/filter.c
src/filter.h

index 61e81c53862bf964735036f24d69ea4fab3e0494..dc4e559e18f20b6167a82d646deab92bc6ac6c78 100644 (file)
@@ -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) {
index aa95e0267cfa644cf1b2611eedad23e2de5a461a..ecdc809a48b61f7ca59b4e623e1df87d0bcfca6b 100644 (file)
@@ -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;
+}
+
index b9beb49427faf671ee77edb3f9d5dfcfeed9d7ad..5b7a25b045fdf95566f81a2b59a4eb5556d853a1 100644 (file)
@@ -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