diff options
author | Jacques Germishuys <jacquesg@striata.com> | 2014-10-10 13:22:11 +0200 |
---|---|---|
committer | Edward Thomson <ethomson@microsoft.com> | 2014-10-25 15:06:43 -0400 |
commit | 46ef5a719c4974bc7ea55e13fbd43bb63381681b (patch) | |
tree | 6482b90e3cd736c2267178c90260624cf1e40fd7 | |
parent | 6e41c27f1b458d0db7b4d6114fb3b9b8744c4e84 (diff) | |
download | libgit2-46ef5a719c4974bc7ea55e13fbd43bb63381681b.tar.gz |
Ensure filters (i.e. CRLF) are applied when checking out conflict content
-rw-r--r-- | src/checkout.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/checkout.c b/src/checkout.c index 20763fd35..c265c3fea 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -1736,10 +1736,12 @@ static int checkout_write_merge( checkout_conflictdata *conflict) { git_buf our_label = GIT_BUF_INIT, their_label = GIT_BUF_INIT, - path_suffixed = GIT_BUF_INIT, path_workdir = GIT_BUF_INIT; + path_suffixed = GIT_BUF_INIT, path_workdir = GIT_BUF_INIT, + in_data = GIT_BUF_INIT, out_data = GIT_BUF_INIT; git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT; git_merge_file_result result = {0}; git_filebuf output = GIT_FILEBUF_INIT; + git_filter_list *fl = NULL; int error = 0; if (data->opts.checkout_strategy & GIT_CHECKOUT_CONFLICT_STYLE_DIFF3) @@ -1785,13 +1787,27 @@ static int checkout_write_merge( (error = checkout_safe_for_update_only(git_buf_cstr(&path_workdir), result.mode)) <= 0) goto done; + if (!data->opts.disable_filters) { + if ((error = git_buf_put(&in_data, result.ptr, result.len)) < 0 || + (error = git_filter_list_load(&fl, data->repo, NULL, git_buf_cstr(&path_workdir), + GIT_FILTER_TO_WORKTREE, GIT_FILTER_OPT_DEFAULT)) < 0 || + (error = git_filter_list_apply_to_data(&out_data, fl, &in_data)) < 0) + goto done; + } else if ((error = git_buf_put(&out_data, result.ptr, result.len)) < 0) + goto done; + + if ((error = git_futils_mkpath2file(path_workdir.ptr, 0755)) < 0 || - (error = git_filebuf_open(&output, path_workdir.ptr, GIT_FILEBUF_DO_NOT_BUFFER, result.mode)) < 0 || - (error = git_filebuf_write(&output, result.ptr, result.len)) < 0 || + (error = git_filebuf_open(&output, git_buf_cstr(&path_workdir), GIT_FILEBUF_DO_NOT_BUFFER, result.mode)) < 0 || + (error = git_filebuf_write(&output, out_data.ptr, out_data.size)) < 0 || (error = git_filebuf_commit(&output)) < 0) goto done; done: + git_filter_list_free(fl); + + git_buf_free(&out_data); + git_buf_free(&in_data); git_buf_free(&our_label); git_buf_free(&their_label); |