Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUngureanu Marius <marius.ungureanu@xamarin.com>2015-05-30 18:59:08 +0300
committerVsevolod Kukol <sevoku@microsoft.com>2019-02-19 01:33:55 +0300
commit8000cd6071dbb20645f73431f14273ad99b07c97 (patch)
tree91e3ce9c28c38741c4e67b56477b4f9ad26de848
parent572e4d8c1f1d42feac1c770f0cddf6fda6c4eca0 (diff)
Introduce git_blame_options diff find configurabilityvs-8.0-v0.28.1
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)
-rw-r--r--docs/changelog.md6
-rw-r--r--include/git2/blame.h11
-rw-r--r--include/git2/diff.h3
-rw-r--r--src/blame_git.c5
-rw-r--r--src/diff_tform.c3
-rw-r--r--tests/blame/simple.c49
-rw-r--r--tests/resources/blametest.git/objects/49/aed320fb734fe132f8a0723743b78ab369b17cbin0 -> 204 bytes
-rw-r--r--tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aabin0 -> 172 bytes
-rw-r--r--tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749bin0 -> 141 bytes
-rw-r--r--tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7bin0 -> 135 bytes
-rw-r--r--tests/resources/blametest.git/objects/c3/47c9265f655dcd26dd0d41a244d4c1bb6cb8c62
-rw-r--r--tests/resources/blametest.git/objects/c6/6b79ec0ee8f5aa0e981168c4c96e5e2483d3612
-rw-r--r--tests/resources/blametest.git/objects/f7/fe99763e059cb1989222c230c8a0102d0efc56bin0 -> 35 bytes
-rw-r--r--tests/resources/blametest.git/refs/heads/master2
14 files changed, 77 insertions, 6 deletions
diff --git a/docs/changelog.md b/docs/changelog.md
index 7d1dac62a..e9b45e06a 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -792,6 +792,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
new file mode 100644
index 000000000..58419f9b1
--- /dev/null
+++ b/tests/resources/blametest.git/objects/49/aed320fb734fe132f8a0723743b78ab369b17c
Binary files differ
diff --git a/tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa b/tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa
new file mode 100644
index 000000000..7d8605deb
--- /dev/null
+++ b/tests/resources/blametest.git/objects/68/6d51de188b5a542c9af7f64a4ac5f31b4c43aa
Binary files differ
diff --git a/tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749 b/tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749
new file mode 100644
index 000000000..cbe75ee25
--- /dev/null
+++ b/tests/resources/blametest.git/objects/6c/90a25d65273c4599f00fa396082b7cc9e5b749
Binary files differ
diff --git a/tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7 b/tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7
new file mode 100644
index 000000000..89533f6dc
--- /dev/null
+++ b/tests/resources/blametest.git/objects/7e/18c1f0e766379f588fcee7ec7c2e45295d8df7
Binary files differ
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 @@
+x5j1 EWhE!!{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
new file mode 100644
index 000000000..12f6624a2
--- /dev/null
+++ b/tests/resources/blametest.git/objects/f7/fe99763e059cb1989222c230c8a0102d0efc56
Binary files differ
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