diff options
author | Ungureanu Marius <marius.ungureanu@xamarin.com> | 2015-05-30 18:59:08 +0300 |
---|---|---|
committer | Vsevolod Kukol <sevoku@microsoft.com> | 2019-08-08 10:30:33 +0300 |
commit | 762b44f1926fef5c8b4bb6068f3e53cf03ec9c9c (patch) | |
tree | 15c6729bddae1376f00e44d8cf3743aadebcf625 | |
parent | b3e1a56ebb2b9291e82dc027ba9cbcfc3ead54d3 (diff) |
Introduce git_blame_options diff find configurabilityvs-8.0-v0.28.2
This introduces a git_diff_find_options structure into
git_blame_options that can be used to filter out what
kind of file diffing to take place.
Added a new entry GIT_DIFF_FIND_NO_RENAMES which discards
any attempt of the library to check for renames.
The blobs added have the following steps:
Commit 'H': 49aed320fb734fe132f8a0723743b78ab369b17c
Added c.txt and d.txt, files with 2 blocks of text.
Commit 'I': c347c9265f655dcd26dd0d41a244d4c1bb6cb8c6
Renamed c.txt to c_exact.txt.
Commit 'J': c66b79ec0ee8f5aa0e981168c4c96e5e2483d361
Renamed d.txt to d_similar.txt and modified a block of text.
(cherry picked from commit 933a7b17c98a4fe9af50a6818c3bfffedcc9e351)
(cherry picked from commit 8000cd6071dbb20645f73431f14273ad99b07c97)
-rw-r--r-- | docs/changelog.md | 6 | ||||
-rw-r--r-- | include/git2/blame.h | 11 | ||||
-rw-r--r-- | include/git2/diff.h | 3 | ||||
-rw-r--r-- | src/blame_git.c | 5 | ||||
-rw-r--r-- | src/diff_tform.c | 3 | ||||
-rw-r--r-- | tests/blame/simple.c | 49 | ||||
-rw-r--r-- | tests/resources/blametest.git/objects/49/aed320fb734fe132f8a0723743b78ab369b17c | bin | 0 -> 204 bytes | |||
-rw-r--r-- | tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa | bin | 0 -> 172 bytes | |||
-rw-r--r-- | tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749 | bin | 0 -> 141 bytes | |||
-rw-r--r-- | tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7 | bin | 0 -> 135 bytes | |||
-rw-r--r-- | tests/resources/blametest.git/objects/c3/47c9265f655dcd26dd0d41a244d4c1bb6cb8c6 | 2 | ||||
-rw-r--r-- | tests/resources/blametest.git/objects/c6/6b79ec0ee8f5aa0e981168c4c96e5e2483d361 | 2 | ||||
-rw-r--r-- | tests/resources/blametest.git/objects/f7/fe99763e059cb1989222c230c8a0102d0efc56 | bin | 0 -> 35 bytes | |||
-rw-r--r-- | tests/resources/blametest.git/refs/heads/master | 2 |
14 files changed, 77 insertions, 6 deletions
diff --git a/docs/changelog.md b/docs/changelog.md index d6ad2a9ce..374aa927c 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -816,6 +816,12 @@ v0.23 * `git_submodule_set_branch()` allows to set the configured branch for a submodule. +* `git_blame_options` has been taught how to handle diff find options + through its find_options field. + +* `git_diff_find_t` has now been taught how to ignore rename handling + completely through `GIT_DIFF_FIND_NO_RENAMES`. + ### API removals * `git_remote_save()` and `git_remote_clear_refspecs()` have been diff --git a/include/git2/blame.h b/include/git2/blame.h index eef863f9c..cf91f3f7d 100644 --- a/include/git2/blame.h +++ b/include/git2/blame.h @@ -9,6 +9,7 @@ #define INCLUDE_git_blame_h__ #include "common.h" +#include "diff.h" #include "oid.h" /** @@ -55,10 +56,14 @@ typedef enum { * Initialize with `GIT_BLAME_OPTIONS_INIT`. Alternatively, you can * use `git_blame_init_options`. * + *- `find_options` specifies what strategies should be used for + * rename detection. The default is rename with threshold + * heuristics. */ typedef struct git_blame_options { unsigned int version; + git_diff_find_options find_options; /** A combination of `git_blame_flag_t` */ uint32_t flags; /** The lower bound on the number of alphanumeric @@ -87,8 +92,12 @@ typedef struct git_blame_options { size_t max_line; } git_blame_options; +#define GIT_BLAME_DIFF_FIND_OPTIONS_INIT {GIT_DIFF_FIND_OPTIONS_VERSION, \ + GIT_DIFF_FIND_RENAMES } + #define GIT_BLAME_OPTIONS_VERSION 1 -#define GIT_BLAME_OPTIONS_INIT {GIT_BLAME_OPTIONS_VERSION} +#define GIT_BLAME_OPTIONS_INIT {GIT_BLAME_OPTIONS_VERSION, \ + GIT_BLAME_DIFF_FIND_OPTIONS_INIT } /** * Initialize git_blame_options structure diff --git a/include/git2/diff.h b/include/git2/diff.h index b920385ee..e9934a0e8 100644 --- a/include/git2/diff.h +++ b/include/git2/diff.h @@ -663,6 +663,9 @@ typedef enum { /** Turn on all finding features. */ GIT_DIFF_FIND_ALL = (0x0ff), + /** Does no work on trying to find renames. */ + GIT_DIFF_FIND_NO_RENAMES = (1u << 8), + /** Measure similarity ignoring leading whitespace (default) */ GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE = 0, /** Measure similarity ignoring all whitespace */ diff --git a/src/blame_git.c b/src/blame_git.c index 06e7d648e..2862c4298 100644 --- a/src/blame_git.c +++ b/src/blame_git.c @@ -441,7 +441,6 @@ static git_blame__origin* find_origin( /* No changes; copy data */ git_blame__get_origin(&porigin, blame, parent, origin->path); } else { - git_diff_find_options findopts = GIT_DIFF_FIND_OPTIONS_INIT; int i; /* Generate a full diff between the two trees */ @@ -450,9 +449,7 @@ static git_blame__origin* find_origin( if (0 != git_diff_tree_to_tree(&difflist, blame->repository, ptree, otree, &diffopts)) goto cleanup; - /* Let diff find renames */ - findopts.flags = GIT_DIFF_FIND_RENAMES; - if (0 != git_diff_find_similar(difflist, &findopts)) + if (0 != git_diff_find_similar(difflist, &blame->options.find_options)) goto cleanup; /* Find one that matches */ diff --git a/src/diff_tform.c b/src/diff_tform.c index 00ce1cbf6..12faad3f3 100644 --- a/src/diff_tform.c +++ b/src/diff_tform.c @@ -303,6 +303,9 @@ static int normalize_find_opts( if (opts->flags & GIT_DIFF_BREAK_REWRITES) opts->flags |= GIT_DIFF_FIND_REWRITES; + if (opts->flags & GIT_DIFF_FIND_NO_RENAMES) + opts->flags &= ~GIT_DIFF_FIND_ALL; + #define USE_DEFAULT(X) ((X) == 0 || (X) > 100) if (USE_DEFAULT(opts->rename_threshold)) diff --git a/tests/blame/simple.c b/tests/blame/simple.c index 30b78168f..7330e71f7 100644 --- a/tests/blame/simple.c +++ b/tests/blame/simple.c @@ -334,3 +334,52 @@ void test_blame_simple__can_restrict_to_first_parent_commits(void) check_blame_hunk_index(g_repo, g_blame, 2, 6, 5, 0, "63d671eb", "b.txt"); check_blame_hunk_index(g_repo, g_blame, 3, 11, 5, 0, "bc7c5ac2", "b.txt"); } + +void test_blame_simple__can_follow_renames(void) +{ + git_blame_options opts = GIT_BLAME_OPTIONS_INIT; + + cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); + + cl_git_pass(git_blame_file(&g_blame, g_repo, "c_exact.txt", &opts)); + cl_assert_equal_i(1, git_blame_get_hunk_count(g_blame)); + check_blame_hunk_index(g_repo, g_blame, 0, 1, 10, 0, "49aed320", "c.txt"); + + cl_git_pass(git_blame_file(&g_blame, g_repo, "d_similar.txt", &opts)); + cl_assert_equal_i(3, git_blame_get_hunk_count(g_blame)); + check_blame_hunk_index(g_repo, g_blame, 0, 1, 5, 0, "49aed320", "d.txt"); + check_blame_hunk_index(g_repo, g_blame, 1, 6, 4, 0, "c66b79ec", "d_similar.txt"); + check_blame_hunk_index(g_repo, g_blame, 2, 10, 1, 0, "49aed320", "d.txt"); +} + +void test_blame_simple__can_follow_only_exact_renames(void) +{ + git_blame_options opts = GIT_BLAME_OPTIONS_INIT; + opts.find_options.flags = GIT_DIFF_FIND_EXACT_MATCH_ONLY; + + cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); + + cl_git_pass(git_blame_file(&g_blame, g_repo, "c_exact.txt", &opts)); + cl_assert_equal_i(1, git_blame_get_hunk_count(g_blame)); + check_blame_hunk_index(g_repo, g_blame, 0, 1, 10, 0, "49aed320", "c.txt"); + + cl_git_pass(git_blame_file(&g_blame, g_repo, "d_similar.txt", &opts)); + cl_assert_equal_i(1, git_blame_get_hunk_count(g_blame)); + check_blame_hunk_index(g_repo, g_blame, 0, 1, 10, 0, "c66b79ec", "d_similar.txt"); +} + +void test_blame_simple__does_not_follow_renames(void) +{ + git_blame_options opts = GIT_BLAME_OPTIONS_INIT; + opts.find_options.flags = GIT_DIFF_FIND_NO_RENAMES; + + cl_git_pass(git_repository_open(&g_repo, cl_fixture("blametest.git"))); + + cl_git_pass(git_blame_file(&g_blame, g_repo, "c_exact.txt", &opts)); + cl_assert_equal_i(1, git_blame_get_hunk_count(g_blame)); + check_blame_hunk_index(g_repo, g_blame, 0, 1, 10, 0, "c347c926", "c_exact.txt"); + + cl_git_pass(git_blame_file(&g_blame, g_repo, "d_similar.txt", &opts)); + cl_assert_equal_i(1, git_blame_get_hunk_count(g_blame)); + check_blame_hunk_index(g_repo, g_blame, 0, 1, 10, 0, "c66b79ec", "d_similar.txt"); +} diff --git a/tests/resources/blametest.git/objects/49/aed320fb734fe132f8a0723743b78ab369b17c b/tests/resources/blametest.git/objects/49/aed320fb734fe132f8a0723743b78ab369b17c Binary files differnew file mode 100644 index 000000000..58419f9b1 --- /dev/null +++ b/tests/resources/blametest.git/objects/49/aed320fb734fe132f8a0723743b78ab369b17c diff --git a/tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa b/tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa Binary files differnew file mode 100644 index 000000000..7d8605deb --- /dev/null +++ b/tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa diff --git a/tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749 b/tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749 Binary files differnew file mode 100644 index 000000000..cbe75ee25 --- /dev/null +++ b/tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749 diff --git a/tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7 b/tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7 Binary files differnew file mode 100644 index 000000000..89533f6dc --- /dev/null +++ b/tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7 diff --git a/tests/resources/blametest.git/objects/c3/47c9265f655dcd26dd0d41a244d4c1bb6cb8c6 b/tests/resources/blametest.git/objects/c3/47c9265f655dcd26dd0d41a244d4c1bb6cb8c6 new file mode 100644 index 000000000..1db685d13 --- /dev/null +++ b/tests/resources/blametest.git/objects/c3/47c9265f655dcd26dd0d41a244d4c1bb6cb8c6 @@ -0,0 +1,2 @@ +x5j1S)s0{Zt&\2%NF'<~T;;3>Tj FhG-
y#b#N9hg-a؆$FgH0E#(rfFv¶V]ڲ
pwk`PD +5#v%P}gxi|cZ|[KɻOM
\ No newline at end of file diff --git a/tests/resources/blametest.git/objects/c6/6b79ec0ee8f5aa0e981168c4c96e5e2483d361 b/tests/resources/blametest.git/objects/c6/6b79ec0ee8f5aa0e981168c4c96e5e2483d361 new file mode 100644 index 000000000..9df2f1bd9 --- /dev/null +++ b/tests/resources/blametest.git/objects/c6/6b79ec0ee8f5aa0e981168c4c96e5e2483d361 @@ -0,0 +1,2 @@ +x5j1EWhE!!{f @v-]{YCqإ_s9FPKF +QdQD0;$$Q
Qk68𤝝v!Ȁ4b@V;#;A~o빕HkW*K~/u9=BcD9(&:X}K~^1-\'8I*@u8V=7]RO
\ No newline at end of file diff --git a/tests/resources/blametest.git/objects/f7/fe99763e059cb1989222c230c8a0102d0efc56 b/tests/resources/blametest.git/objects/f7/fe99763e059cb1989222c230c8a0102d0efc56 Binary files differnew file mode 100644 index 000000000..12f6624a2 --- /dev/null +++ b/tests/resources/blametest.git/objects/f7/fe99763e059cb1989222c230c8a0102d0efc56 diff --git a/tests/resources/blametest.git/refs/heads/master b/tests/resources/blametest.git/refs/heads/master index d1bc4ca6b..454f53717 100644 --- a/tests/resources/blametest.git/refs/heads/master +++ b/tests/resources/blametest.git/refs/heads/master @@ -1 +1 @@ -6653ff42313eb5c82806f145391b18a9699800c7 +c66b79ec0ee8f5aa0e981168c4c96e5e2483d361 |