Flags for find_similar · Issue #394 · libgit2/pygit2 · GitHub
Skip to content

Flags for find_similar #394

Description

@ArnoVanLumig

The libgit2 api allows you to set, among others, the rename_threshold when calling git_diff_find_similar but this doesn't seem to be supported in pygit2.

Would be great if this could be implemented!

I tried to change it myself but I can't seem to do this without getting a "ValueError: Invalid version 0 on git_diff_find_options" error when trying to call it... Probably just my lack of C++ skills. Diff of my changes is below.

diff --git a/src/diff.c b/src/diff.c
index 83fcb51..886f169 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -438,19 +438,27 @@ Diff_merge(Diff *self, PyObject *args)


 PyDoc_STRVAR(Diff_find_similar__doc__,
-  "find_similar([flags])\n"
+  "find_similar([flags, rename_threshold, copy_threshold, rename_from_rewrite_threshold, break_rewrite_threshold])\n"
   "\n"
   "Find renamed files in diff and updates them in-place in the diff itself.");

 PyObject *
-Diff_find_similar(Diff *self, PyObject *args)
+Diff_find_similar(Diff *self, PyObject *args, PyObject *kwds)
 {
     int err;
     git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT;

-    if (!PyArg_ParseTuple(args, "|i", &opts.flags))
+    uint16_t rename_threshold, copy_threshold, rename_from_rewrite_threshold, break_rewrite_threshold;
+    char *keywords[] = {"flags", "rename_threshold", "copy_threshold", "rename_from_rewrite_threshold", "break_rewrite_threshold", NULL};
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iIIII", keywords, &opts.flags, &rename_threshold, &copy_threshold, &rename_from_rewrite_threshold, &break_rewrite_threshold))
         return NULL;

+    opts.rename_threshold = rename_threshold;
+    opts.copy_threshold = copy_threshold;
+    opts.rename_from_rewrite_threshold = rename_from_rewrite_threshold;
+    opts.break_rewrite_threshold = break_rewrite_threshold;
+
     err = git_diff_find_similar(self->list, &opts);
     if (err < 0)
         return Error_set(err);
@@ -508,7 +516,7 @@ PyMappingMethods Diff_as_mapping = {

 static PyMethodDef Diff_methods[] = {
     METHOD(Diff, merge, METH_VARARGS),
-    METHOD(Diff, find_similar, METH_VARARGS),
+    METHOD(Diff, find_similar, METH_VARARGS | METH_KEYWORDS),
     METHOD(Diff, from_c, METH_STATIC | METH_VARARGS),
     {NULL}
 };

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions