diff options
author | Vicent Martà <vicent@github.com> | 2013-09-17 09:57:55 -0700 |
---|---|---|
committer | Vicent Martà <vicent@github.com> | 2013-09-17 09:57:55 -0700 |
commit | bb371b62e950e3307d3acf2f772495a60565d266 (patch) | |
tree | b4479ec3ad261bcac13493ee3f5ad45d15dfdda2 /src/diff_file.c | |
parent | 4581f9d8ab72e9b97817e1eaa7154bcec1c7f0b1 (diff) | |
parent | f60ed4e6495b8bf68d0604335672e6f300330b3b (diff) | |
download | libgit2-bb371b62e950e3307d3acf2f772495a60565d266.tar.gz |
Merge pull request #1847 from libgit2/filters-alternative
Alternative proposal for filter API
Diffstat (limited to 'src/diff_file.c')
-rw-r--r-- | src/diff_file.c | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/src/diff_file.c b/src/diff_file.c index bcfef13cd..5939ee8b8 100644 --- a/src/diff_file.c +++ b/src/diff_file.c @@ -296,9 +296,9 @@ static int diff_file_content_load_workdir_file( git_diff_file_content *fc, git_buf *path) { int error = 0; - git_vector filters = GIT_VECTOR_INIT; - git_buf raw = GIT_BUF_INIT, filtered = GIT_BUF_INIT; + git_filter_list *fl = NULL; git_file fd = git_futils_open_ro(git_buf_cstr(path)); + git_buf raw = GIT_BUF_INIT; if (fd < 0) return fd; @@ -310,41 +310,38 @@ static int diff_file_content_load_workdir_file( if (diff_file_content_binary_by_size(fc)) goto cleanup; - if ((error = git_filters_load( - &filters, fc->repo, fc->file->path, GIT_FILTER_TO_ODB)) < 0) + if ((error = git_filter_list_load( + &fl, fc->repo, NULL, fc->file->path, GIT_FILTER_TO_ODB)) < 0) goto cleanup; - /* error >= is a filter count */ - if (error == 0) { + /* if there are no filters, try to mmap the file */ + if (fl == NULL) { if (!(error = git_futils_mmap_ro( - &fc->map, fd, 0, (size_t)fc->file->size))) + &fc->map, fd, 0, (size_t)fc->file->size))) { fc->flags |= GIT_DIFF_FLAG__UNMAP_DATA; - else /* fall through to try readbuffer below */ - giterr_clear(); + goto cleanup; + } + + /* if mmap failed, fall through to try readbuffer below */ + giterr_clear(); } - if (error != 0) { - error = git_futils_readbuffer_fd(&raw, fd, (size_t)fc->file->size); - if (error < 0) - goto cleanup; + if (!(error = git_futils_readbuffer_fd(&raw, fd, (size_t)fc->file->size))) { + git_buf out = GIT_BUF_INIT; - if (!filters.length) - git_buf_swap(&filtered, &raw); - else - error = git_filters_apply(&filtered, &raw, &filters); + error = git_filter_list_apply_to_data(&out, fl, &raw); + + git_buf_free(&raw); if (!error) { - fc->map.len = git_buf_len(&filtered); - fc->map.data = git_buf_detach(&filtered); + fc->map.len = out.size; + fc->map.data = out.ptr; fc->flags |= GIT_DIFF_FLAG__FREE_DATA; } - - git_buf_free(&raw); - git_buf_free(&filtered); } cleanup: - git_filters_free(&filters); + git_filter_list_free(fl); p_close(fd); return error; |