Commit 5ef43d41 by Edward Thomson

git_diff__merge: allow pluggable diff merges

parent 83ba5e36
...@@ -123,6 +123,16 @@ extern int git_diff_find_similar__calc_similarity( ...@@ -123,6 +123,16 @@ extern int git_diff_find_similar__calc_similarity(
extern int git_diff__commit( extern int git_diff__commit(
git_diff **diff, git_repository *repo, const git_commit *commit, const git_diff_options *opts); git_diff **diff, git_repository *repo, const git_commit *commit, const git_diff_options *opts);
/* Merge two `git_diff`s according to the callback given by `cb`. */
typedef git_diff_delta *(*git_diff__merge_cb)(
const git_diff_delta *left,
const git_diff_delta *right,
git_pool *pool);
extern int git_diff__merge(
git_diff *onto, const git_diff *from, git_diff__merge_cb cb);
/* /*
* Sometimes a git_diff_file will have a zero size; this attempts to * Sometimes a git_diff_file will have a zero size; this attempts to
* fill in the size without loading the blob if possible. If that is * fill in the size without loading the blob if possible. If that is
......
...@@ -109,7 +109,8 @@ static git_diff_delta *diff_delta__merge_like_cgit( ...@@ -109,7 +109,8 @@ static git_diff_delta *diff_delta__merge_like_cgit(
return dup; return dup;
} }
int git_diff_merge(git_diff *onto, const git_diff *from) int git_diff__merge_deltas(
git_diff *onto, const git_diff *from, git_diff__merge_cb cb)
{ {
int error = 0; int error = 0;
git_pool onto_pool; git_pool onto_pool;
...@@ -154,7 +155,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from) ...@@ -154,7 +155,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from)
const git_diff_delta *left = reversed ? f : o; const git_diff_delta *left = reversed ? f : o;
const git_diff_delta *right = reversed ? o : f; const git_diff_delta *right = reversed ? o : f;
delta = diff_delta__merge_like_cgit(left, right, &onto_pool); delta = cb(left, right, &onto_pool);
i++; i++;
j++; j++;
} }
...@@ -162,7 +163,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from) ...@@ -162,7 +163,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from)
/* the ignore rules for the target may not match the source /* the ignore rules for the target may not match the source
* or the result of a merged delta could be skippable... * or the result of a merged delta could be skippable...
*/ */
if (git_diff_delta__should_skip(&onto->opts, delta)) { if (delta && git_diff_delta__should_skip(&onto->opts, delta)) {
git__free(delta); git__free(delta);
continue; continue;
} }
...@@ -193,6 +194,11 @@ int git_diff_merge(git_diff *onto, const git_diff *from) ...@@ -193,6 +194,11 @@ int git_diff_merge(git_diff *onto, const git_diff *from)
return error; return error;
} }
int git_diff_merge(git_diff *onto, const git_diff *from)
{
return git_diff__merge_deltas(onto, from, diff_delta__merge_like_cgit);
}
int git_diff_find_similar__hashsig_for_file( int git_diff_find_similar__hashsig_for_file(
void **out, const git_diff_file *f, const char *path, void *p) void **out, const git_diff_file *f, const char *path, void *p)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment