summaryrefslogtreecommitdiff
path: root/tests-clar/diff/diff_helpers.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-09-24 20:52:34 -0700
committerRussell Belfer <rb@github.com>2012-09-25 16:35:05 -0700
commit5f69a31f7d706aa5788ad9937391577a66e3c77d (patch)
tree8201821372d02499f092b774a8fd521478564a7e /tests-clar/diff/diff_helpers.c
parent9a12a6256efa7da4b4245d0f2b7df6f3b84edabd (diff)
downloadlibgit2-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.c75
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;
}