[packages/python-pygit2] - updated to 0.22.0 (with #487 fix from git)

qboosh qboosh at pld-linux.org
Tue Mar 3 21:24:00 CET 2015


commit a66114b593038c243585ef71e01c2bd4f9439d48
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Tue Mar 3 21:27:08 2015 +0100

    - updated to 0.22.0 (with #487 fix from git)

 487.patch          | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 python-pygit2.spec |  14 +++--
 2 files changed, 178 insertions(+), 5 deletions(-)
---
diff --git a/python-pygit2.spec b/python-pygit2.spec
index 259e579..7a6ea0a 100644
--- a/python-pygit2.spec
+++ b/python-pygit2.spec
@@ -8,15 +8,18 @@
 Summary:	Python 2.x bindings for libgit2 library
 Summary(pl.UTF-8):	Wiązania Pythona 2.x do biblioteki libgit2
 Name:		python-%{module}
-Version:	0.21.4
+Version:	0.22.0
 Release:	1
 License:	GPL v2 with linking exception
 Group:		Libraries/Python
+#Source0Download: https://pypi.python.org/pypi/pygit2
 Source0:	https://pypi.python.org/packages/source/p/pygit2/%{module}-%{version}.tar.gz
-# Source0-md5:	8a3d02eded2bef2e0af18172814eec32
+# Source0-md5:	31dc65b3cbe6e39d75a39db86dd7cd8c
 Patch0:		%{name}-docbuild.patch
+# https://github.com/libgit2/pygit2/pull/487.patch
+Patch1:		487.patch
 URL:		https://pypi.python.org/pypi/pygit2
-BuildRequires:	libgit2-devel >= 0.21.0
+BuildRequires:	libgit2-devel >= 0.22.0
 BuildRequires:	python-devel
 BuildRequires:	python-distribute
 BuildRequires:	rpm-pythonprov
@@ -27,7 +30,7 @@ BuildRequires:	python3-distribute
 BuildRequires:	python3-modules
 %endif
 %{?with_docs:BuildRequires:     sphinx-pdg}
-Requires:	libgit2 >= 0.21.0
+Requires:	libgit2 >= 0.22.0
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
 %description
@@ -40,7 +43,7 @@ pygit2 to zbiór wiązań Pythona do biblioteki współdzielonej libgit2.
 Summary:	Python 3.x bindings for libgit2 library
 Summary(pl.UTF-8):	Wiązania Pythona 3.x do biblioteki libgit2
 Group:		Libraries/Python
-Requires:	libgit2 >= 0.21.0
+Requires:	libgit2 >= 0.22.0
 
 %description -n python3-%{module}
 pygit2 is a set of Python bindings to the libgit2 shared library.
@@ -62,6 +65,7 @@ Dokumentacja API %{module}.
 %prep
 %setup -q -n %{module}-%{version}
 %patch0 -p1
+%patch1 -p1
 
 # these tests use network
 %{__rm} test/test_{credentials,repository}.py
diff --git a/487.patch b/487.patch
new file mode 100644
index 0000000..344b3ed
--- /dev/null
+++ b/487.patch
@@ -0,0 +1,169 @@
+From 0ba17a5b4608706f696c2212315ea0bb301db209 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= <cmn at dwim.me>
+Date: Fri, 6 Feb 2015 03:41:37 +0100
+Subject: [PATCH] Safer handling of string arrays
+
+We need to keep hold of the strings which we create. We must also hold
+on to the array of strings which we assing to our git_strarray.
+
+We were not doing the latter, which meant that our strings may have been
+freed too early, leaving us with with memory access errors (though often
+not leading to a crash due to the custom allocator in python).
+
+As we need to keep hold of two/three pieces of information, this looks
+like a good place to introduce a context manager. This allows us to
+keep these pointers alive without burdening the call sites with a return
+of multiple objects they have no use for.
+---
+ pygit2/index.py  |  8 ++++----
+ pygit2/remote.py | 20 ++++++++++----------
+ pygit2/utils.py  | 46 +++++++++++++++++++++++-----------------------
+ 3 files changed, 37 insertions(+), 37 deletions(-)
+
+diff --git a/pygit2/index.py b/pygit2/index.py
+index 61b7c97..47d4cd6 100644
+--- a/pygit2/index.py
++++ b/pygit2/index.py
+@@ -32,7 +32,7 @@
+ from _pygit2 import Oid, Tree, Diff
+ from .errors import check_error
+ from .ffi import ffi, C
+-from .utils import is_string, strings_to_strarray, to_bytes, to_str
++from .utils import is_string, to_bytes, to_str, StrArray
+ 
+ 
+ class Index(object):
+@@ -175,9 +175,9 @@ def add_all(self, pathspecs=[]):
+         If pathspecs are specified, only files matching those pathspecs will
+         be added.
+         """
+-        arr, refs = strings_to_strarray(pathspecs)
+-        err = C.git_index_add_all(self._index, arr, 0, ffi.NULL, ffi.NULL)
+-        check_error(err, True)
++        with StrArray(pathspecs) as arr:
++            err = C.git_index_add_all(self._index, arr, 0, ffi.NULL, ffi.NULL)
++            check_error(err, True)
+ 
+     def add(self, path_or_entry):
+         """add([path|entry])
+diff --git a/pygit2/remote.py b/pygit2/remote.py
+index c4a195f..d2fbdcf 100644
+--- a/pygit2/remote.py
++++ b/pygit2/remote.py
+@@ -34,7 +34,7 @@
+ from .ffi import ffi, C
+ from .credentials import KeypairFromAgent
+ from .refspec import Refspec
+-from .utils import to_bytes, strarray_to_strings, strings_to_strarray
++from .utils import to_bytes, strarray_to_strings, StrArray
+ 
+ 
+ def maybe_string(ptr):
+@@ -253,9 +253,9 @@ def fetch_refspecs(self):
+ 
+     @fetch_refspecs.setter
+     def fetch_refspecs(self, l):
+-        arr, refs = strings_to_strarray(l)
+-        err = C.git_remote_set_fetch_refspecs(self._remote, arr)
+-        check_error(err)
++        with StrArray(l) as arr:
++            err = C.git_remote_set_fetch_refspecs(self._remote, arr)
++            check_error(err)
+ 
+     @property
+     def push_refspecs(self):
+@@ -269,9 +269,9 @@ def push_refspecs(self):
+ 
+     @push_refspecs.setter
+     def push_refspecs(self, l):
+-        arr, refs = strings_to_strarray(l)
+-        err = C.git_remote_set_push_refspecs(self._remote, arr)
+-        check_error(err)
++        with StrArray(l) as arr:
++            err = C.git_remote_set_push_refspecs(self._remote, arr)
++            check_error(err)
+ 
+     def add_fetch(self, spec):
+         """add_fetch(refspec)
+@@ -305,7 +305,6 @@ def push(self, specs, signature=None, message=None):
+         err = C.git_remote_init_callbacks(defaultcallbacks, 1)
+         check_error(err)
+ 
+-        refspecs, refspecs_refs = strings_to_strarray(specs)
+         if signature:
+             sig_cptr = ffi.new('git_signature **')
+             ffi.buffer(sig_cptr)[:] = signature._pointer[:]
+@@ -333,8 +332,9 @@ def push(self, specs, signature=None, message=None):
+             raise
+ 
+         try:
+-            err = C.git_remote_push(self._remote, refspecs, ffi.NULL, sig_ptr, to_bytes(message))
+-            check_error(err)
++            with StrArray(specs) as refspecs:
++                err = C.git_remote_push(self._remote, refspecs, ffi.NULL, sig_ptr, to_bytes(message))
++                check_error(err)
+         finally:
+             self._self_handle = None
+ 
+diff --git a/pygit2/utils.py b/pygit2/utils.py
+index 3c5fc88..17582a4 100644
+--- a/pygit2/utils.py
++++ b/pygit2/utils.py
+@@ -50,34 +50,34 @@ def strarray_to_strings(arr):
+     return l
+ 
+ 
+-def strings_to_strarray(l):
+-    """Convert a list of strings to a git_strarray
++class StrArray(object):
++    """A git_strarray wrapper
+ 
+-    We return first the git_strarray* you can pass to libgit2 and a
+-    list of references to the memory, which we must keep around for as
+-    long as the git_strarray must live.
+-    """
++    Use this in order to get a git_strarray* to pass to libgit2 out of a
++    list of strings. This has a context manager, which you should use, e.g.
+ 
+-    if not isinstance(l, list):
+-        raise TypeError("Value must be a list")
++        with StrArray(list_of_strings) as arr:
++            C.git_function_that_takes_strarray(arr)
++    """
+ 
+-    arr = ffi.new('git_strarray *')
+-    strings = ffi.new('char *[]', len(l))
++    def __init__(self, l):
++        if not isinstance(l, list):
++            raise TypeError("Value must be a list")
+ 
+-    # We need refs in order to keep a reference to the value returned
+-    # by the ffi.new(). Otherwise, they will be freed and the memory
+-    # re-used, with less than great consequences.
+-    refs = [None] * len(l)
++        arr = ffi.new('git_strarray *')
++        strings = [None] * len(l)
++        for i in range(len(l)):
++            if not is_string(l[i]):
++                raise TypeError("Value must be a string")
+ 
+-    for i in range(len(l)):
+-        if not is_string(l[i]):
+-            raise TypeError("Value must be a string")
++            strings[i] = ffi.new('char []', to_bytes(l[i]))
+ 
+-        s = ffi.new('char []', to_bytes(l[i]))
+-        refs[i] = s
+-        strings[i] = s
++        self._arr = ffi.new('char *[]', strings)
++        self._strings = strings
++        self.array = ffi.new('git_strarray *', [self._arr, len(strings)])
+ 
+-    arr.strings = strings
+-    arr.count = len(l)
++    def __enter__(self):
++        return self.array
+ 
+-    return arr, refs
++    def __exit__(self, type, value, traceback):
++        pass
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/python-pygit2.git/commitdiff/a66114b593038c243585ef71e01c2bd4f9439d48



More information about the pld-cvs-commit mailing list