diff options
author | Russell Belfer <rb@github.com> | 2012-09-24 20:52:34 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2012-09-25 16:35:05 -0700 |
commit | 5f69a31f7d706aa5788ad9937391577a66e3c77d (patch) | |
tree | 8201821372d02499f092b774a8fd521478564a7e /tests-clar/diff/diff_helpers.c | |
parent | 9a12a6256efa7da4b4245d0f2b7df6f3b84edabd (diff) | |
download | libgit2-5f69a31f7d706aa5788ad9937391577a66e3c77d.tar.gz |
Initial implementation of new diff patch API
Replacing the `git_iterator` object, this creates a simple API
for accessing the "patch" for any file pair in a diff list and
then gives indexed access to the hunks in the patch and the lines
in the hunk. This is the initial implementation of this revised
API - it is still broken, but at least builds cleanly.
Diffstat (limited to 'tests-clar/diff/diff_helpers.c')
-rw-r--r-- | tests-clar/diff/diff_helpers.c | 75 |
1 files changed, 38 insertions, 37 deletions
diff --git a/tests-clar/diff/diff_helpers.c b/tests-clar/diff/diff_helpers.c index 767b34392..1c0435975 100644 --- a/tests-clar/diff/diff_helpers.c +++ b/tests-clar/diff/diff_helpers.c @@ -112,64 +112,65 @@ int diff_foreach_via_iterator( git_diff_hunk_fn hunk_cb, git_diff_data_fn line_cb) { - int error; - git_diff_iterator *iter; - git_diff_delta *delta; + size_t d, num_d = git_diff_num_deltas(diff); - if ((error = git_diff_iterator_new(&iter, diff)) < 0) - return error; + for (d = 0; d < num_d; ++d) { + git_diff_patch *patch; + git_diff_delta *delta; + size_t h, num_h; - while (!(error = git_diff_iterator_next_file(&delta, iter))) { - git_diff_range *range; - const char *hdr; - size_t hdr_len; - float progress = git_diff_iterator_progress(iter); + cl_git_pass(git_diff_get_patch(&patch, &delta, diff, d)); + cl_assert(delta && patch); /* call file_cb for this file */ - if (file_cb != NULL && file_cb(data, delta, progress) != 0) + if (file_cb != NULL && file_cb(data, delta, (float)d / num_d) != 0) { + git_diff_patch_free(patch); goto abort; + } - if (!hunk_cb && !line_cb) + if (!hunk_cb && !line_cb) { + git_diff_patch_free(patch); continue; + } + + num_h = git_diff_patch_num_hunks(patch); - while (!(error = git_diff_iterator_next_hunk( - &range, &hdr, &hdr_len, iter))) { - char origin; - const char *line; - size_t line_len; + for (h = 0; h < num_h; h++) { + git_diff_range *range; + const char *hdr; + size_t hdr_len, l, num_l; - if (hunk_cb && hunk_cb(data, delta, range, hdr, hdr_len) != 0) + cl_git_pass(git_diff_patch_get_hunk( + &range, &hdr, &hdr_len, &num_l, patch, h)); + + if (hunk_cb && hunk_cb(data, delta, range, hdr, hdr_len) != 0) { + git_diff_patch_free(patch); goto abort; + } - if (!line_cb) - continue; + for (l = 0; l < num_l; ++l) { + char origin; + const char *line; + size_t line_len; + int old_lineno, new_lineno; - while (!(error = git_diff_iterator_next_line( - &origin, &line, &line_len, iter))) { + cl_git_pass(git_diff_patch_get_line_in_hunk( + &origin, &line, &line_len, &old_lineno, &new_lineno, + patch, h, l)); - if (line_cb(data, delta, range, origin, line, line_len) != 0) + if (line_cb(data, delta, range, origin, line, line_len) != 0) { + git_diff_patch_free(patch); goto abort; + } } - - if (error && error != GIT_ITEROVER) - goto done; } - if (error && error != GIT_ITEROVER) - goto done; + git_diff_patch_free(patch); } -done: - git_diff_iterator_free(iter); - - if (error == GIT_ITEROVER) - error = 0; - - return error; + return 0; abort: - git_diff_iterator_free(iter); giterr_clear(); - return GIT_EUSER; } |