diff --git a/Fix-CI.patch b/Fix-CI.patch new file mode 100644 index 0000000..0e9d2e4 --- /dev/null +++ b/Fix-CI.patch @@ -0,0 +1,67 @@ +From 51d35d010b9dcee199be5eb3785246ca9ef418e9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=2E=20David=20Ib=C3=A1=C3=B1ez?= +Date: Thu, 21 Mar 2024 10:53:59 +0100 +Subject: [PATCH] Fix CI + +(cherry picked from commit 3eba911fb5fcc4d431d31848a66f117df8275af2) +--- + src/blob.c | 1 + + src/filter.c | 1 + + test/test_credentials.py | 10 ++++++---- + 3 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/src/blob.c b/src/blob.c +index e69a8f7..a1f40df 100644 +--- a/src/blob.c ++++ b/src/blob.c +@@ -28,6 +28,7 @@ + #define PY_SSIZE_T_CLEAN + #include + #include ++#include + #include "diff.h" + #include "error.h" + #include "object.h" +diff --git a/src/filter.c b/src/filter.c +index a1b220e..5e51a20 100644 +--- a/src/filter.c ++++ b/src/filter.c +@@ -28,6 +28,7 @@ + #define PY_SSIZE_T_CLEAN + #include + #include ++#include + #include + #include "diff.h" + #include "error.h" +diff --git a/test/test_credentials.py b/test/test_credentials.py +index 2d1166c..04e2185 100644 +--- a/test/test_credentials.py ++++ b/test/test_credentials.py +@@ -26,6 +26,7 @@ + """Tests for credentials""" + + from pathlib import Path ++import platform + + import pytest + +@@ -161,10 +162,11 @@ def test_fetch_certificate_check(testrepo): + remote.fetch(callbacks=MyCallbacks()) + + # libgit2 uses different error message for Linux and Windows +- # TODO test one or the other depending on the platform +- assert str(exc.value) in ( +- 'user rejected certificate for github.com', # httpclient +- 'user cancelled certificate check') # winhttp ++ value = str(exc.value) ++ if platform.system() == 'Windows': ++ assert value == 'user cancelled certificate check' # winhttp ++ else: ++ assert value == 'user rejected certificate for github.com' # httpclient + + # TODO Add GitError.error_code + #assert exc.value.error_code == pygit2.GIT_ERROR_HTTP +-- +2.44.0 + diff --git a/Fix-leaks-in-fetch_refspecs-and-push_refspecs.patch b/Fix-leaks-in-fetch_refspecs-and-push_refspecs.patch new file mode 100644 index 0000000..67f679d --- /dev/null +++ b/Fix-leaks-in-fetch_refspecs-and-push_refspecs.patch @@ -0,0 +1,171 @@ +From 0f8a1a91db0825daa0d25549f15791bcee0f9a94 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=2E=20David=20Ib=C3=A1=C3=B1ez?= +Date: Sun, 24 Mar 2024 09:09:36 +0100 +Subject: [PATCH] Fix leaks in fetch_refspecs and push_refspecs + +Also use git_strarray_dispose instead of deprecated git_strarray_free. +And fix a couple of build warnings in git_commit_create. + +(cherry picked from commit c7c65cf12547eeadb46cfb30531285e1afcbd708) +--- + pygit2/decl/strarray.h | 2 +- + pygit2/remotes.py | 16 +++------------- + pygit2/utils.py | 15 ++++++++++----- + src/repository.c | 10 ++++------ + 4 files changed, 18 insertions(+), 25 deletions(-) + +diff --git a/pygit2/decl/strarray.h b/pygit2/decl/strarray.h +index a9b249f..fdbf2aa 100644 +--- a/pygit2/decl/strarray.h ++++ b/pygit2/decl/strarray.h +@@ -3,4 +3,4 @@ typedef struct git_strarray { + size_t count; + } git_strarray; + +-void git_strarray_free(git_strarray *array); ++void git_strarray_dispose(git_strarray *array); +diff --git a/pygit2/remotes.py b/pygit2/remotes.py +index 3c4748c..37a6ca3 100644 +--- a/pygit2/remotes.py ++++ b/pygit2/remotes.py +@@ -222,7 +222,6 @@ class Remote: + specs = ffi.new('git_strarray *') + err = C.git_remote_get_fetch_refspecs(specs, self._remote) + check_error(err) +- + return strarray_to_strings(specs) + + @property +@@ -232,7 +231,6 @@ class Remote: + specs = ffi.new('git_strarray *') + err = C.git_remote_get_push_refspecs(specs, self._remote) + check_error(err) +- + return strarray_to_strings(specs) + + def push(self, specs, callbacks=None, proxy=None): +@@ -294,14 +292,12 @@ class RemoteCollection: + + def __len__(self): + names = ffi.new('git_strarray *') +- + try: + err = C.git_remote_list(names, self._repo._repo) + check_error(err) +- + return names.count + finally: +- C.git_strarray_free(names) ++ C.git_strarray_dispose(names) + + def __iter__(self): + cremote = ffi.new('git_remote **') +@@ -323,15 +319,13 @@ class RemoteCollection: + + def _ffi_names(self): + names = ffi.new('git_strarray *') +- + try: + err = C.git_remote_list(names, self._repo._repo) + check_error(err) +- + for i in range(names.count): + yield names.strings[i] + finally: +- C.git_strarray_free(names) ++ C.git_strarray_dispose(names) + + def names(self): + """An iterator over the names of the available remotes.""" +@@ -386,11 +380,7 @@ class RemoteCollection: + problems = ffi.new('git_strarray *') + err = C.git_remote_rename(problems, self._repo._repo, to_bytes(name), to_bytes(new_name)) + check_error(err) +- +- ret = strarray_to_strings(problems) +- C.git_strarray_free(problems) +- +- return ret ++ return strarray_to_strings(problems) + + def delete(self, name): + """Remove a remote from the configuration +diff --git a/pygit2/utils.py b/pygit2/utils.py +index 638c199..f4e3fc8 100644 +--- a/pygit2/utils.py ++++ b/pygit2/utils.py +@@ -26,7 +26,7 @@ + import os + + # Import from pygit2 +-from .ffi import ffi ++from .ffi import ffi, C + + + def maybe_string(ptr): +@@ -73,11 +73,16 @@ def ptr_to_bytes(ptr_cdata): + + + def strarray_to_strings(arr): +- l = [None] * arr.count +- for i in range(arr.count): +- l[i] = ffi.string(arr.strings[i]).decode('utf-8') ++ """ ++ Return a list of strings from a git_strarray pointer. + +- return l ++ Free the strings contained in the git_strarry, this means it won't be usable after ++ calling this function. ++ """ ++ try: ++ return [ffi.string(arr.strings[i]).decode('utf-8') for i in range(arr.count)] ++ finally: ++ C.git_strarray_dispose(arr) + + + class StrArray: +diff --git a/src/repository.c b/src/repository.c +index cf7597c..1f6db24 100644 +--- a/src/repository.c ++++ b/src/repository.c +@@ -1069,8 +1069,7 @@ Repository_create_commit(Repository *self, PyObject *args) + + err = git_commit_create(&oid, self->repo, update_ref, + py_author->signature, py_committer->signature, +- encoding, message, tree, parent_count, +- (const git_commit**)parents); ++ encoding, message, tree, parent_count, parents); + if (err < 0) { + Error_set(err); + goto out; +@@ -1152,8 +1151,7 @@ Repository_create_commit_string(Repository *self, PyObject *args) + + err = git_commit_create_buffer(&buf, self->repo, + py_author->signature, py_committer->signature, +- encoding, message, tree, parent_count, +- (const git_commit**)parents); ++ encoding, message, tree, parent_count, parents); + if (err < 0) { + Error_set(err); + goto out; +@@ -1313,7 +1311,7 @@ Repository_raw_listall_references(Repository *self, PyObject *args) + } + + out: +- git_strarray_free(&c_result); ++ git_strarray_dispose(&c_result); + return py_result; + } + +@@ -2182,7 +2180,7 @@ Repository_list_worktrees(Repository *self, PyObject *args) + } + + out: +- git_strarray_free(&c_result); ++ git_strarray_dispose(&c_result); + return py_result; + } + +-- +2.44.0 + diff --git a/python-pygit2.changes b/python-pygit2.changes index 25d7f70..430fc8d 100644 --- a/python-pygit2.changes +++ b/python-pygit2.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu May 2 10:26:23 UTC 2024 - Michal Suchanek + +- Fix build with gcc 14 + * Fix-CI.patch + * Fix-leaks-in-fetch_refspecs-and-push_refspecs.patch + ------------------------------------------------------------------- Sat Mar 30 23:08:16 UTC 2024 - Fridrich Strba diff --git a/python-pygit2.spec b/python-pygit2.spec index 3998e88..97ed495 100644 --- a/python-pygit2.spec +++ b/python-pygit2.spec @@ -27,6 +27,10 @@ URL: https://github.com/libgit2/pygit2 Source: https://files.pythonhosted.org/packages/source/p/pygit2/pygit2-%{version}.tar.gz # PATCH-FIX-UPSTREAM pygit2-Upgrade_to_libgit2_v1_8_0.patch gh#libgit2/pygit2@6d539d76b53b Patch0: pygit2-Upgrade_to_libgit2_v1_8_0.patch +# PATCH-FIX-UPSTREAM - fixup for the libgit 1.8 support +Patch1: Fix-CI.patch +# PATCH-FIX-UPSTREAM - happens to eliminate bogus pointer casts +Patch2: Fix-leaks-in-fetch_refspecs-and-push_refspecs.patch BuildRequires: %{python_module cached-property} BuildRequires: %{python_module cffi >= 1.4.0} BuildRequires: %{python_module devel} @@ -48,9 +52,10 @@ Requires: python-cached-property Bindings for libgit2, a linkable C library for the Git version-control system. %prep -%setup -q -n pygit2-%{version} -%if %{?pkg_vcmp:%pkg_vcmp libgit2-devel >= 1.8}%{!?pkg_vcmp:0} -%patch -P 0 -p1 +%autosetup -p1 -n pygit2-%{version} +%if %{?pkg_vcmp:%pkg_vcmp libgit2-devel < 1.8}%{!?pkg_vcmp:1} +%patch -P 1 -p1 -R +%patch -P 0 -p1 -R %endif # do not add options to pytest