diff options
author | Max Kostyukevich <maxim.kostyukevich@mera.com> | 2019-08-20 03:29:45 +0300 |
---|---|---|
committer | Max Kostyukevich <maxim.kostyukevich@mera.com> | 2019-08-20 03:29:45 +0300 |
commit | de4bc2bd6d1aa35a69dd6c0f5a06196cebbfa2fa (patch) | |
tree | c108aa18fdd3ea596adac3ba5f1c999f4bc4e539 | |
parent | 0f40e68e2f468169d711a806f6839781ae4f7a3e (diff) | |
download | libgit2-de4bc2bd6d1aa35a69dd6c0f5a06196cebbfa2fa.tar.gz |
apply: git_apply_to_tree fails to apply patches that add new files
git_apply_to_tree() cannot be used apply patches with new files. An attempt
to apply such a patch fails because git_apply_to_tree() tries to remove a
non-existing file from an old index.
The solution is to modify git_apply_to_tree() to git_index_remove() when the
patch states that the modified files is removed.
-rw-r--r-- | src/apply.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/apply.c b/src/apply.c index 1ee9291d3..e0ddef457 100644 --- a/src/apply.c +++ b/src/apply.c @@ -649,9 +649,12 @@ int git_apply_to_tree( for (i = 0; i < git_diff_num_deltas(diff); i++) { delta = git_diff_get_delta(diff, i); - if ((error = git_index_remove(postimage, - delta->old_file.path, 0)) < 0) - goto done; + if (delta->status == GIT_DELTA_DELETED || + delta->status == GIT_DELTA_RENAMED) { + if ((error = git_index_remove(postimage, + delta->old_file.path, 0)) < 0) + goto done; + } } if ((error = apply_deltas(repo, pre_reader, NULL, post_reader, postimage, diff, &opts)) < 0) |