From caf71ec081fe4067fff5f1a172e7a2e4bbe7eb0f Mon Sep 17 00:00:00 2001 From: Russell Belfer Date: Tue, 7 Feb 2012 15:30:18 -0800 Subject: [PATCH] Add tests and fix bugs for diff whitespace options Once I added tests for the whitespace handling options of diff, I realized that there were some bugs. This fixes those and adds the new tests into the test suite. --- src/diff.c | 16 ++-- tests-clar/diff/diff_helpers.c | 2 + tests-clar/diff/tree.c | 87 ++++++++++++++++++ tests/resources/attr/.gitted/index | Bin 1376 -> 1376 bytes tests/resources/attr/.gitted/logs/HEAD | Bin 828 -> 1020 bytes .../attr/.gitted/logs/refs/heads/master | Bin 828 -> 1020 bytes .../10/8bb4e7fd7b16490dc33ff7d972151e73d7166e | Bin 0 -> 130 bytes .../6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd | Bin 0 -> 422 bytes .../a9/7cc019851d401a4f1d091cb91a15890a0dd1ba | Bin 0 -> 191 bytes .../resources/attr/.gitted/refs/heads/master | Bin 41 -> 41 bytes tests/resources/attr/root_test3 | Bin 143 -> 158 bytes 11 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 tests/resources/attr/.gitted/objects/10/8bb4e7fd7b16490dc33ff7d972151e73d7166e create mode 100644 tests/resources/attr/.gitted/objects/6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd create mode 100644 tests/resources/attr/.gitted/objects/a9/7cc019851d401a4f1d091cb91a15890a0dd1ba diff --git a/src/diff.c b/src/diff.c index 9a12aa07c..197fe354a 100644 --- a/src/diff.c +++ b/src/diff.c @@ -486,9 +486,11 @@ static int set_file_is_binary( return GIT_SUCCESS; } -static void setup_xdiff_config(git_diff_options *opts, xdemitconf_t *cfg) +static void setup_xdiff_options( + git_diff_options *opts, xdemitconf_t *cfg, xpparam_t *param) { memset(cfg, 0, sizeof(xdemitconf_t)); + memset(param, 0, sizeof(xpparam_t)); cfg->ctxlen = (!opts || !opts->context_lines) ? 3 : opts->context_lines; @@ -499,11 +501,11 @@ static void setup_xdiff_config(git_diff_options *opts, xdemitconf_t *cfg) return; if (opts->flags & GIT_DIFF_IGNORE_WHITESPACE) - cfg->flags |= XDF_WHITESPACE_FLAGS; + param->flags |= XDF_WHITESPACE_FLAGS; if (opts->flags & GIT_DIFF_IGNORE_WHITESPACE_CHANGE) - cfg->flags |= XDF_IGNORE_WHITESPACE_CHANGE; + param->flags |= XDF_IGNORE_WHITESPACE_CHANGE; if (opts->flags & GIT_DIFF_IGNORE_WHITESPACE_EOL) - cfg->flags |= XDF_IGNORE_WHITESPACE_AT_EOL; + param->flags |= XDF_IGNORE_WHITESPACE_AT_EOL; } int git_diff_foreach( @@ -525,8 +527,7 @@ int git_diff_foreach( di.hunk_cb = hunk_cb; di.line_cb = line_cb; - memset(&xdiff_params, 0, sizeof(xdiff_params)); - setup_xdiff_config(&diff->opts, &xdiff_config); + setup_xdiff_options(&diff->opts, &xdiff_config, &xdiff_params); memset(&xdiff_callback, 0, sizeof(xdiff_callback)); xdiff_callback.outf = diff_output_cb; xdiff_callback.priv = &di; @@ -898,8 +899,7 @@ int git_diff_blobs( di.hunk_cb = hunk_cb; di.line_cb = line_cb; - memset(&xdiff_params, 0, sizeof(xdiff_params)); - setup_xdiff_config(options, &xdiff_config); + setup_xdiff_options(options, &xdiff_config, &xdiff_params); memset(&xdiff_callback, 0, sizeof(xdiff_callback)); xdiff_callback.outf = diff_output_cb; xdiff_callback.priv = &di; diff --git a/tests-clar/diff/diff_helpers.c b/tests-clar/diff/diff_helpers.c index b32c4bc2d..80c648033 100644 --- a/tests-clar/diff/diff_helpers.c +++ b/tests-clar/diff/diff_helpers.c @@ -72,9 +72,11 @@ int diff_line_fn( e->line_ctxt++; break; case GIT_DIFF_LINE_ADDITION: + case GIT_DIFF_LINE_ADD_EOFNL: e->line_adds++; break; case GIT_DIFF_LINE_DELETION: + case GIT_DIFF_LINE_DEL_EOFNL: e->line_dels++; break; default: diff --git a/tests-clar/diff/tree.c b/tests-clar/diff/tree.c index 836db5765..eb4092af8 100644 --- a/tests-clar/diff/tree.c +++ b/tests-clar/diff/tree.c @@ -84,3 +84,90 @@ void test_diff_tree__0(void) git_tree_free(b); git_tree_free(c); } + +void test_diff_tree__options(void) +{ + /* grabbed a couple of commit oids from the history of the attr repo */ + const char *a_commit = "6bab5c79cd5140d0"; + const char *b_commit = "605812ab7fe421fdd"; + const char *c_commit = "f5b0af1fb4f5"; + const char *d_commit = "a97cc019851"; + + git_tree *a = resolve_commit_oid_to_tree(g_repo, a_commit); + git_tree *b = resolve_commit_oid_to_tree(g_repo, b_commit); + git_tree *c = resolve_commit_oid_to_tree(g_repo, c_commit); + git_tree *d = resolve_commit_oid_to_tree(g_repo, d_commit); + + git_diff_options opts = {0}; + git_diff_list *diff = NULL; + diff_expects exp; + int test_ab_or_cd[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1 }; + git_diff_options test_options[] = { + /* a vs b tests */ + { GIT_DIFF_NORMAL, 1, 1, NULL, NULL, {0} }, + { GIT_DIFF_NORMAL, 3, 1, NULL, NULL, {0} }, + { GIT_DIFF_REVERSE, 2, 1, NULL, NULL, {0} }, + { GIT_DIFF_FORCE_TEXT, 2, 1, NULL, NULL, {0} }, + /* c vs d tests */ + { GIT_DIFF_NORMAL, 3, 1, NULL, NULL, {0} }, + { GIT_DIFF_IGNORE_WHITESPACE, 3, 1, NULL, NULL, {0} }, + { GIT_DIFF_IGNORE_WHITESPACE_CHANGE, 3, 1, NULL, NULL, {0} }, + { GIT_DIFF_IGNORE_WHITESPACE_EOL, 3, 1, NULL, NULL, {0} }, + { GIT_DIFF_IGNORE_WHITESPACE | GIT_DIFF_REVERSE, 1, 1, NULL, NULL, {0} }, + }; + /* to generate these values: + * - cd to tests/resources/attr, + * - mv .gitted .git + * - git diff [options] 6bab5c79cd5140d0 605812ab7fe421fdd + * - mv .git .gitted + */ + diff_expects test_expects[] = { + /* a vs b tests */ + { 5, 3, 0, 2, 4, 0, 0, 51, 2, 46, 3 }, + { 5, 3, 0, 2, 4, 0, 0, 53, 4, 46, 3 }, + { 5, 0, 3, 2, 4, 0, 0, 52, 3, 3, 46 }, + { 5, 3, 0, 2, 5, 0, 0, 54, 3, 48, 3 }, + /* c vs d tests */ + { 1, 0, 0, 1, 1, 0, 0, 22, 9, 10, 3 }, + { 1, 0, 0, 1, 1, 0, 0, 19, 12, 7, 0 }, + { 1, 0, 0, 1, 1, 0, 0, 20, 11, 8, 1 }, + { 1, 0, 0, 1, 1, 0, 0, 20, 11, 8, 1 }, + { 1, 0, 0, 1, 1, 0, 0, 18, 11, 0, 7 }, + { 0 }, + }; + int i; + + cl_assert(a); + cl_assert(b); + + for (i = 0; test_expects[i].files > 0; i++) { + memset(&exp, 0, sizeof(exp)); /* clear accumulator */ + opts = test_options[i]; + + if (test_ab_or_cd[i] == 0) + cl_git_pass(git_diff_tree_to_tree(g_repo, &opts, a, b, &diff)); + else + cl_git_pass(git_diff_tree_to_tree(g_repo, &opts, c, d, &diff)); + + cl_git_pass(git_diff_foreach( + diff, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn)); + + cl_assert(exp.files == test_expects[i].files); + cl_assert(exp.file_adds == test_expects[i].file_adds); + cl_assert(exp.file_dels == test_expects[i].file_dels); + cl_assert(exp.file_mods == test_expects[i].file_mods); + cl_assert(exp.hunks == test_expects[i].hunks); + cl_assert(exp.lines == test_expects[i].lines); + cl_assert(exp.line_ctxt == test_expects[i].line_ctxt); + cl_assert(exp.line_adds == test_expects[i].line_adds); + cl_assert(exp.line_dels == test_expects[i].line_dels); + + git_diff_list_free(diff); + diff = NULL; + } + + git_tree_free(a); + git_tree_free(b); + git_tree_free(c); + git_tree_free(d); +} diff --git a/tests/resources/attr/.gitted/index b/tests/resources/attr/.gitted/index index f35d3005eede3416685c62c857e9664fb533d5a4..19fa99d5b20eb89465b2e1561d69b4ec0ae0d252 100644 GIT binary patch delta 189 zcmaFB^?+-`S|)Lwmh%ii;18ww7#LU>#5Gn;KEh;KZ@BmeSPn{qlK7I;;u2$!86W_&14cvbT7zcZ pnSbTx1xJ^iDcoGce1TEKqOQP!zd2M>V$ploBdqCrQeJ2N2LPdPHc9{h delta 189 zcmaFB^?+-`S|)MD{iX~+;18ww7#LU>1Xt)!KEh;KulTSKA_t)%a-T987#f!_Ffe`v z%83AR|H? qyfgpG%?pk$J5#v1hWP@c$foVz!%lX|%=mXoVf$Gk6_PU& d^U_m`71HvH6o3*XnR)371*Js=`NgTlTmX&nD1HC{ delta 7 OcmeyvzK3mt4Kn}@WCFDS diff --git a/tests/resources/attr/.gitted/logs/refs/heads/master b/tests/resources/attr/.gitted/logs/refs/heads/master index 6d096351c674a5120c97a424fe209c7ec03ab504..68fcff2c5c2f92240447401ec7775ca352d6a040 100644 GIT binary patch delta 127 zcmdnP_J@6g4fEt9Oq%M6mgdRH28NavriLjd28M|yX@)5VmWIhmmWGLjrWTe4i3TYt zhDj3xG(0TKOpT2VjTLkaEDQ`dlk;k6_PU& d^U_m`71HvH6o3*XnR)371*Js=`NgTlTmX&nD1HC{ delta 7 OcmeyvzK3mt4Kn}@WCFDS diff --git a/tests/resources/attr/.gitted/objects/10/8bb4e7fd7b16490dc33ff7d972151e73d7166e b/tests/resources/attr/.gitted/objects/10/8bb4e7fd7b16490dc33ff7d972151e73d7166e new file mode 100644 index 0000000000000000000000000000000000000000..edcf7520c758be0f9bc4b51b8e4056982e9f1527 GIT binary patch literal 130 zcmV-|0Db>>0VRwv4#F@LLz#05Z_Erxtd)8L2If@xAra}f)cg|l_6=e2@cithaKY{V zxIDQEd@L+>UHD6|Sj kyvcxSdyHc?>CwjX!5z)34LVb=h99z&_0uoh38$AdjSm?>ivR!s literal 0 HcmV?d00001 diff --git a/tests/resources/attr/.gitted/objects/6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd b/tests/resources/attr/.gitted/objects/6d/968d62c89c7d9ea23a4c9a7b665d017c3d8ffd new file mode 100644 index 0000000000000000000000000000000000000000..e832241c9e518a3c468902831f57f8cd6d60be61 GIT binary patch literal 422 zcmV;X0a^Zd0V^p=O;s>8Fk>(@FfcPQQAjK)DKcOP&F^Wd?(mk!9N4*WOR^9COxTOtMRg|A! z5)V>j$lxj>Rk^&v>FBIvr76rxTz=lq{cO=y88P@4+8*i4mcAa%o4A&}d*vysu##AG zRmKbg-CLgjtrqj-J#7E|W|62|@pZ90bX6vLB^4zM|H{n^jxIY>*c!nziDlz|iN*Gx z|Cks6fkJU0M1R$f1PUG6#xJL literal 0 HcmV?d00001 diff --git a/tests/resources/attr/.gitted/objects/a9/7cc019851d401a4f1d091cb91a15890a0dd1ba b/tests/resources/attr/.gitted/objects/a9/7cc019851d401a4f1d091cb91a15890a0dd1ba new file mode 100644 index 0000000000000000000000000000000000000000..1a7ec0c55ecdcf29471df6466af9f15f75edb0cb GIT binary patch literal 191 zcmV;w06_nE0iBLfYQ!)MMEmVi=mJ~hXk$B2O6d{W6DYF02_$i_9hTm{hTfoG12b>n zN#6Ih!Qk9WE2`k)Ap-8T5tEop%_E@f8z_={J``#V?~f*Xk}!3_hV>1}sx t9skeUeCJ)^xvWj=$)b>t?FVGx nuoB0-%JPgTUI|##B|lHS1T0jNk(rkbG>QuV*A^Oi delta 73 zcmbQo*v~jYe4>>6L>pNf$GjAUocxkvh5R&y^!)r3h2oOZv@|X*$Gpn&jMSo3h06R= Zh4RF_5-u*6{5