Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Flags for find_similar #394

@ArnoVanLumig

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions