diff options
Diffstat (limited to 'src/diff.c')
-rw-r--r-- | src/diff.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/diff.c b/src/diff.c index 7c8e2a9bb..7ee919b5a 100644 --- a/src/diff.c +++ b/src/diff.c @@ -807,6 +807,28 @@ on_error: return -1; } + +bool git_diff_delta__should_skip( + git_diff_options *opts, git_diff_delta *delta) +{ + uint32_t flags = opts ? opts->flags : 0; + + if (delta->status == GIT_DELTA_UNMODIFIED && + (flags & GIT_DIFF_INCLUDE_UNMODIFIED) == 0) + return true; + + if (delta->status == GIT_DELTA_IGNORED && + (flags & GIT_DIFF_INCLUDE_IGNORED) == 0) + return true; + + if (delta->status == GIT_DELTA_UNTRACKED && + (flags & GIT_DIFF_INCLUDE_UNTRACKED) == 0) + return true; + + return false; +} + + int git_diff_merge( git_diff_list *onto, const git_diff_list *from) @@ -843,6 +865,14 @@ int git_diff_merge( j++; } + /* the ignore rules for the target may not match the source + * or the result of a merged delta could be skippable... + */ + if (git_diff_delta__should_skip(&onto->opts, delta)) { + git__free(delta); + continue; + } + if ((error = !delta ? -1 : git_vector_insert(&onto_new, delta)) < 0) break; } |