Commit 570ba25cb0f757f993e06df629faced32fdf2f8f

Russell Belfer 2013-08-30T16:02:07

Make git_filter_source opaque

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)) {