Make git_filter_source opaque
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 125 126 127 128 129 130 131 132 133
diff --git a/include/git2/sys/filter.h b/include/git2/sys/filter.h
index 2264be0..b1193a5 100644
--- a/include/git2/sys/filter.h
+++ b/include/git2/sys/filter.h
@@ -22,12 +22,29 @@ GIT_BEGIN_DECL
* A filter source represents a file/blob to be processed
*/
typedef struct git_filter_source git_filter_source;
-struct git_filter_source {
- git_repository *repo;
- const char *path;
- git_oid oid; /* zero if unknown (which is likely) */
- uint16_t filemode; /* zero if unknown */
-};
+
+/**
+ * Get the repository that the source data is coming from.
+ */
+GIT_EXTERN(git_repository *) git_filter_source_repo(const git_filter_source *src);
+
+/**
+ * Get the path that the source data is coming from.
+ */
+GIT_EXTERN(const char *) git_filter_source_path(const git_filter_source *src);
+
+/**
+ * Get the file mode of the source file
+ * If the mode is unknown, this will return 0
+ */
+GIT_EXTERN(uint16_t) git_filter_source_filemode(const git_filter_source *src);
+
+/**
+ * Get the OID of the source
+ * If the OID is unknown (often the case with GIT_FILTER_CLEAN) then
+ * this will return NULL.
+ */
+GIT_EXTERN(const git_oid *) git_filter_source_id(const git_filter_source *src);
/**
* Callback to actually perform the data filtering
diff --git a/src/crlf.c b/src/crlf.c
index 2177bff..cfc2d1e 100644
--- a/src/crlf.c
+++ b/src/crlf.c
@@ -107,8 +107,10 @@ static int crlf_load_attributes(
return -1;
}
-static int has_cr_in_index(git_repository *repo, const char *path)
+static int has_cr_in_index(const git_filter_source *src)
{
+ git_repository *repo = git_filter_source_repo(src);
+ const char *path = git_filter_source_path(src);
git_index *index;
const git_index_entry *entry;
git_blob *blob;
@@ -180,7 +182,7 @@ static int crlf_apply_to_odb(
* If the file in the index has any CR in it, do not convert.
* This is the new safer autocrlf handling.
*/
- if (has_cr_in_index(src->repo, src->path))
+ if (has_cr_in_index(src))
return GIT_ENOTFOUND;
}
@@ -290,7 +292,9 @@ static int crlf_check(
GIT_UNUSED(mode);
/* Load gitattributes for the path */
- if ((error = crlf_load_attributes(&ca, src->repo, src->path)) < 0)
+ error = crlf_load_attributes(
+ &ca, git_filter_source_repo(src), git_filter_source_path(src));
+ if (error < 0)
return error;
/*
@@ -303,8 +307,9 @@ static int crlf_check(
return GIT_ENOTFOUND;
if (ca.crlf_action == GIT_CRLF_GUESS) {
- if ((error = git_repository__cvar(
- &ca.auto_crlf, src->repo, GIT_CVAR_AUTO_CRLF)) < 0)
+ error = git_repository__cvar(
+ &ca.auto_crlf, git_filter_source_repo(src), GIT_CVAR_AUTO_CRLF);
+ if (error < 0)
return error;
if (ca.auto_crlf == GIT_AUTO_CRLF_FALSE)
diff --git a/src/filter.c b/src/filter.c
index 7935e65..3d4c6d6 100644
--- a/src/filter.c
+++ b/src/filter.c
@@ -13,6 +13,13 @@
#include "git2/config.h"
#include "blob.h"
+struct git_filter_source {
+ git_repository *repo;
+ const char *path;
+ git_oid oid; /* zero if unknown (which is likely) */
+ uint16_t filemode; /* zero if unknown */
+};
+
typedef struct {
git_filter *filter;
void *payload;
@@ -32,6 +39,26 @@ typedef struct {
static git_array_t(git_filter_def) filter_registry = GIT_ARRAY_INIT;
+git_repository *git_filter_source_repo(const git_filter_source *src)
+{
+ return src->repo;
+}
+
+const char *git_filter_source_path(const git_filter_source *src)
+{
+ return src->path;
+}
+
+uint16_t git_filter_source_filemode(const git_filter_source *src)
+{
+ return src->filemode;
+}
+
+const git_oid *git_filter_source_id(const git_filter_source *src)
+{
+ return git_oid_iszero(&src->oid) ? NULL : &src->oid;
+}
+
static int filter_load_defaults(void)
{
if (!git_array_size(filter_registry)) {