Checkout: add structure for CRLF.
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
diff --git a/src/crlf.c b/src/crlf.c
index 303a46d..888d86c 100644
--- a/src/crlf.c
+++ b/src/crlf.c
@@ -184,7 +184,8 @@ static int crlf_apply_to_odb(git_filter *self, git_buf *dest, const git_buf *sou
return drop_crlf(dest, source);
}
-int git_filter_add__crlf_to_odb(git_vector *filters, git_repository *repo, const char *path)
+static int find_and_add_filter(git_vector *filters, git_repository *repo, const char *path,
+ int (*apply)(struct git_filter *self, git_buf *dest, const git_buf *source))
{
struct crlf_attrs ca;
struct crlf_filter *filter;
@@ -219,10 +220,25 @@ int git_filter_add__crlf_to_odb(git_vector *filters, git_repository *repo, const
filter = git__malloc(sizeof(struct crlf_filter));
GITERR_CHECK_ALLOC(filter);
- filter->f.apply = &crlf_apply_to_odb;
+ filter->f.apply = apply;
filter->f.do_free = NULL;
memcpy(&filter->attrs, &ca, sizeof(struct crlf_attrs));
return git_vector_insert(filters, filter);
}
+static int crlf_apply_to_workdir(git_filter *self, git_buf *dest, const git_buf *source)
+{
+ /* TODO */
+ return 0;
+}
+
+int git_filter_add__crlf_to_odb(git_vector *filters, git_repository *repo, const char *path)
+{
+ return find_and_add_filter(filters, repo, path, &crlf_apply_to_odb);
+}
+
+int git_filter_add__crlf_to_workdir(git_vector *filters, git_repository *repo, const char *path)
+{
+ return find_and_add_filter(filters, repo, path, &crlf_apply_to_workdir);
+}
diff --git a/src/filter.c b/src/filter.c
index 8fa3eb6..aa95e02 100644
--- a/src/filter.c
+++ b/src/filter.c
@@ -95,8 +95,9 @@ int git_filters_load(git_vector *filters, git_repository *repo, const char *path
if (error < 0)
return error;
} else {
- giterr_set(GITERR_INVALID, "Worktree filters are not implemented yet");
- return -1;
+ error = git_filter_add__crlf_to_workdir(filters, repo, path);
+ if (error < 0)
+ return error;
}
return (int)filters->length;
@@ -162,4 +163,3 @@ int git_filters_apply(git_buf *dest, git_buf *source, git_vector *filters)
return 0;
}
-
diff --git a/src/filter.h b/src/filter.h
index 66e370a..b9beb49 100644
--- a/src/filter.h
+++ b/src/filter.h
@@ -96,6 +96,9 @@ extern void git_filters_free(git_vector *filters);
/* Strip CRLF, from Worktree to ODB */
extern int git_filter_add__crlf_to_odb(git_vector *filters, git_repository *repo, const char *path);
+/* Add CRLF, from ODB to worktree */
+extern int git_filter_add__crlf_to_workdir(git_vector *filters, git_repository *repo, const char *path);
+
/*
* PLAINTEXT API