diff options
| author | Vicent Martà <vicent@github.com> | 2012-11-15 10:18:25 -0800 |
|---|---|---|
| committer | Vicent Martà <vicent@github.com> | 2012-11-15 10:18:25 -0800 |
| commit | 63f7c6f4c8730e6ce1447a1c8b02c23c23d9682b (patch) | |
| tree | 61f442146ed5b98352016f4ecec3ac4736e10c8c /src/diff.c | |
| parent | 5a36f127808c7b470eef17b1a8a130dde0cc64a1 (diff) | |
| parent | bbe6dbec81d2050fb52b600bc27e2dacdc780e77 (diff) | |
| download | libgit2-63f7c6f4c8730e6ce1447a1c8b02c23c23d9682b.tar.gz | |
Merge pull request #1072 from arrbee/diff-api-signatures
Diff API signatures
Diffstat (limited to 'src/diff.c')
| -rw-r--r-- | src/diff.c | 113 |
1 files changed, 51 insertions, 62 deletions
diff --git a/src/diff.c b/src/diff.c index 6f48d72a2..728e23712 100644 --- a/src/diff.c +++ b/src/diff.c @@ -568,11 +568,11 @@ static int diff_list_init_from_iterators( } static int diff_from_iterators( + git_diff_list **diff_ptr, git_repository *repo, - const git_diff_options *opts, /**< can be NULL for defaults */ git_iterator *old_iter, git_iterator *new_iter, - git_diff_list **diff_ptr) + const git_diff_options *opts) { int error = 0; const git_index_entry *oitem, *nitem; @@ -747,108 +747,97 @@ fail: error = -1; } - git_iterator_free(old_iter); - git_iterator_free(new_iter); git_buf_free(&ignore_prefix); return error; } +#define DIFF_FROM_ITERATORS(MAKE_FIRST, MAKE_SECOND) do { \ + git_iterator *a = NULL, *b = NULL; \ + char *pfx = opts ? git_pathspec_prefix(&opts->pathspec) : NULL; \ + if (!(error = MAKE_FIRST) && !(error = MAKE_SECOND)) \ + error = diff_from_iterators(diff, repo, a, b, opts); \ + git__free(pfx); git_iterator_free(a); git_iterator_free(b); \ + } while (0) + int git_diff_tree_to_tree( + git_diff_list **diff, git_repository *repo, - const git_diff_options *opts, /**< can be NULL for defaults */ git_tree *old_tree, git_tree *new_tree, - git_diff_list **diff) + const git_diff_options *opts) { - git_iterator *a = NULL, *b = NULL; - char *pfx = opts ? git_pathspec_prefix(&opts->pathspec) : NULL; - - assert(repo && old_tree && new_tree && diff); + int error = 0; - if (git_iterator_for_tree_range(&a, repo, old_tree, pfx, pfx) < 0 || - git_iterator_for_tree_range(&b, repo, new_tree, pfx, pfx) < 0) - return -1; + assert(diff && repo); - git__free(pfx); + DIFF_FROM_ITERATORS( + git_iterator_for_tree_range(&a, repo, old_tree, pfx, pfx), + git_iterator_for_tree_range(&b, repo, new_tree, pfx, pfx) + ); - return diff_from_iterators(repo, opts, a, b, diff); + return error; } int git_diff_index_to_tree( + git_diff_list **diff, git_repository *repo, - const git_diff_options *opts, git_tree *old_tree, - git_diff_list **diff) + git_index *index, + const git_diff_options *opts) { - git_iterator *a = NULL, *b = NULL; - char *pfx = opts ? git_pathspec_prefix(&opts->pathspec) : NULL; - - assert(repo && diff); + int error = 0; - if (git_iterator_for_tree_range(&a, repo, old_tree, pfx, pfx) < 0 || - git_iterator_for_index_range(&b, repo, pfx, pfx) < 0) - goto on_error; + assert(diff && repo); - git__free(pfx); + if (!index && (error = git_repository_index__weakptr(&index, repo)) < 0) + return error; - return diff_from_iterators(repo, opts, a, b, diff); + DIFF_FROM_ITERATORS( + git_iterator_for_tree_range(&a, repo, old_tree, pfx, pfx), + git_iterator_for_index_range(&b, index, pfx, pfx) + ); -on_error: - git__free(pfx); - git_iterator_free(a); - return -1; + return error; } int git_diff_workdir_to_index( + git_diff_list **diff, git_repository *repo, - const git_diff_options *opts, - git_diff_list **diff) + git_index *index, + const git_diff_options *opts) { - int error; - git_iterator *a = NULL, *b = NULL; - char *pfx = opts ? git_pathspec_prefix(&opts->pathspec) : NULL; - - assert(repo && diff); + int error = 0; - if ((error = git_iterator_for_index_range(&a, repo, pfx, pfx)) < 0 || - (error = git_iterator_for_workdir_range(&b, repo, pfx, pfx)) < 0) - goto on_error; + assert(diff && repo); - git__free(pfx); + if (!index && (error = git_repository_index__weakptr(&index, repo)) < 0) + return error; - return diff_from_iterators(repo, opts, a, b, diff); + DIFF_FROM_ITERATORS( + git_iterator_for_index_range(&a, index, pfx, pfx), + git_iterator_for_workdir_range(&b, repo, pfx, pfx) + ); -on_error: - git__free(pfx); - git_iterator_free(a); return error; } int git_diff_workdir_to_tree( + git_diff_list **diff, git_repository *repo, - const git_diff_options *opts, - git_tree *tree, - git_diff_list **diff) + git_tree *old_tree, + const git_diff_options *opts) { - int error; - git_iterator *a = NULL, *b = NULL; - char *pfx = opts ? git_pathspec_prefix(&opts->pathspec) : NULL; - - assert(repo && tree && diff); - - if ((error = git_iterator_for_tree_range(&a, repo, tree, pfx, pfx)) < 0 || - (error = git_iterator_for_workdir_range(&b, repo, pfx, pfx)) < 0) - goto on_error; + int error = 0; - git__free(pfx); + assert(diff && repo); - return diff_from_iterators(repo, opts, a, b, diff); + DIFF_FROM_ITERATORS( + git_iterator_for_tree_range(&a, repo, old_tree, pfx, pfx), + git_iterator_for_workdir_range(&b, repo, pfx, pfx) + ); -on_error: - git__free(pfx); - git_iterator_free(a); return error; } |
