diff options
author | Russell Belfer <rb@github.com> | 2012-06-08 11:56:24 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2012-06-08 12:11:13 -0700 |
commit | 145e696b498a046762e4df9045c9b71440308486 (patch) | |
tree | b37682dece97e69e2be1056d656dc8d6fc5d3155 /src/diff_output.c | |
parent | 0abd724454078f2089701b54be94df7306dcfb8e (diff) | |
download | libgit2-145e696b498a046762e4df9045c9b71440308486.tar.gz |
Minor fixes, cleanups, and clarifications
There are three actual changes in this commit:
1. When the trailing newline of a file is removed in a diff, the
change will now be reported with `GIT_DIFF_LINE_DEL_EOFNL` passed
to the callback. Previously, the `ADD_EOFNL` constant was given
which was just an error in my understanding of when the various
circumstances arose. `GIT_DIFF_LINE_ADD_EOFNL` is deprecated and
should never be generated. A new newline is simply an `ADD`.
2. Rewrote the `diff_delta__merge_like_cgit` function that contains
the core logic of the `git_diff_merge` implementation. The new
version doesn't actually have significantly different behavior,
but the logic should be much more obvious, I think.
3. Fixed a bug in `git_diff_merge` where it freed a string pool
while some of the string data was still in use. This led to
`git_diff_print_patch` accessing memory that had been freed.
The rest of this commit contains improved documentation in `diff.h`
to make the behavior and the equivalencies with core git clearer,
and a bunch of new tests to cover the various cases, oh and a minor
simplification of `examples/diff.c`.
Diffstat (limited to 'src/diff_output.c')
-rw-r--r-- | src/diff_output.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/diff_output.c b/src/diff_output.c index d1aa910b3..92f7f8f2f 100644 --- a/src/diff_output.c +++ b/src/diff_output.c @@ -83,12 +83,13 @@ static int diff_output_cb(void *priv, mmbuffer_t *bufs, int len) info->cb_data, info->delta, &info->range, origin, bufs[1].ptr, bufs[1].size) < 0) return -1; - /* deal with adding and removing newline at EOF */ + /* This should only happen if we are adding a line that does not + * have a newline at the end and the old code did. In that case, + * we have a ADD with a DEL_EOFNL as a pair. + */ if (len == 3) { - if (origin == GIT_DIFF_LINE_ADDITION) - origin = GIT_DIFF_LINE_ADD_EOFNL; - else - origin = GIT_DIFF_LINE_DEL_EOFNL; + origin = (origin == GIT_DIFF_LINE_ADDITION) ? + GIT_DIFF_LINE_DEL_EOFNL : GIT_DIFF_LINE_ADD_EOFNL; return info->line_cb( info->cb_data, info->delta, &info->range, origin, bufs[2].ptr, bufs[2].size); |