public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Sam James" <sam@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-python/pygraphviz/, dev-python/pygraphviz/files/
Date: Tue,  6 Feb 2024 05:18:12 +0000 (UTC)	[thread overview]
Message-ID: <1707196598.3e56c3670c1c691007f710416d0b9d6c86658842.sam@gentoo> (raw)

commit:     3e56c3670c1c691007f710416d0b9d6c86658842
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Tue Feb  6 05:16:38 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Tue Feb  6 05:16:38 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=3e56c367

dev-python/pygraphviz: fix build w/ swig-4.2.0

Closes: https://bugs.gentoo.org/921637
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../files/pygraphviz-1.12-swig-4.2.0.patch         | 290 +++++++++++++++++++++
 dev-python/pygraphviz/pygraphviz-1.12-r1.ebuild    |  54 ++++
 2 files changed, 344 insertions(+)

diff --git a/dev-python/pygraphviz/files/pygraphviz-1.12-swig-4.2.0.patch b/dev-python/pygraphviz/files/pygraphviz-1.12-swig-4.2.0.patch
new file mode 100644
index 000000000000..3daa485044ce
--- /dev/null
+++ b/dev-python/pygraphviz/files/pygraphviz-1.12-swig-4.2.0.patch
@@ -0,0 +1,290 @@
+https://bugs.gentoo.org/921637
+https://github.com/swig/swig/issues/2778
+https://github.com/pygraphviz/pygraphviz/commit/6ecae22cc382407652f9d3b57e9da89a3a03043b
+
+From 6ecae22cc382407652f9d3b57e9da89a3a03043b Mon Sep 17 00:00:00 2001
+From: William S Fulton <wsf@fultondesigns.co.uk>
+Date: Fri, 26 Jan 2024 00:52:44 +0000
+Subject: [PATCH] Remove outdated pystrings.swg (#508)
+
+Remove pystring.swg - a very ancient copy from SWIG which does not
+compile when using swig-4.2.0. Instead SWIG's version of pystrings.swg
+that is kept up to date in SWIG is used. SWIG_PYTHON_STRICT_BYTE_CHAR
+needs to be defined in order to maintain the current behaviour of only
+allowing Python 3 byte type instead of Python 3 string type as input.
+
+As the output of swig is in graphviz_wrap.c and is committed to the
+repo, the updates committed in this file (keeping the current swig-4.1.1
+version). A later commit could update it to swig-4.2.0.
+
+Fixes build problems on Fedora where SWIG_Python_str_AsChar no longer exists,
+as reported at https://github.com/swig/swig/issues/2778.
+---
+ pygraphviz/graphviz.i      |   4 ++
+ pygraphviz/graphviz_wrap.c | 106 ++++++++++++++++++++++++++++---------
+ pystrings.swg              |  86 ------------------------------
+ 3 files changed, 84 insertions(+), 112 deletions(-)
+ delete mode 100644 pystrings.swg
+
+diff --git a/pygraphviz/graphviz.i b/pygraphviz/graphviz.i
+index c63eb2d3..d7c49330 100644
+--- a/pygraphviz/graphviz.i
++++ b/pygraphviz/graphviz.i
+@@ -1,5 +1,9 @@
+ %module graphviz
+ 
++%begin %{
++#define SWIG_PYTHON_STRICT_BYTE_CHAR
++%}
++
+ %{
+ #include "graphviz/cgraph.h"
+ #include "graphviz/gvc.h"
+diff --git a/pygraphviz/graphviz_wrap.c b/pygraphviz/graphviz_wrap.c
+index 8f4d3a62..cb06da79 100644
+--- a/pygraphviz/graphviz_wrap.c
++++ b/pygraphviz/graphviz_wrap.c
+@@ -6,6 +6,9 @@
+  * the SWIG interface file instead.
+  * ----------------------------------------------------------------------------- */
+ 
++#define SWIG_PYTHON_STRICT_BYTE_CHAR
++
++
+ 
+ #define SWIG_VERSION 0x040101
+ #define SWIGPYTHON
+@@ -3038,49 +3041,96 @@ SWIGINTERN int
+ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+ {
+ #if PY_VERSION_HEX>=0x03000000
++#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+   if (PyBytes_Check(obj))
+ #else
++  if (PyUnicode_Check(obj))
++#endif
++#else  
+   if (PyString_Check(obj))
+ #endif
+   {
+     char *cstr; Py_ssize_t len;
++    int ret = SWIG_OK;
+ #if PY_VERSION_HEX>=0x03000000
+-    PyBytes_AsStringAndSize(obj, &cstr, &len);
+-    if(alloc) *alloc = SWIG_NEWOBJ;
++#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
++    if (!alloc && cptr) {
++        /* We can't allow converting without allocation, since the internal
++           representation of string in Python 3 is UCS-2/UCS-4 but we require
++           a UTF-8 representation.
++           TODO(bhy) More detailed explanation */
++        return SWIG_RuntimeError;
++    }
++    obj = PyUnicode_AsUTF8String(obj);
++    if (!obj)
++      return SWIG_TypeError;
++    if (alloc)
++      *alloc = SWIG_NEWOBJ;
++#endif
++    if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1)
++      return SWIG_TypeError;
+ #else
+-    PyString_AsStringAndSize(obj, &cstr, &len);
++    if (PyString_AsStringAndSize(obj, &cstr, &len) == -1)
++      return SWIG_TypeError;
+ #endif
+     if (cptr) {
+       if (alloc) {
+-	/*
+-	   In python the user should not be able to modify the inner
+-	   string representation. To warranty that, if you define
+-	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
+-	   buffer is always returned.
+-
+-	   The default behavior is just to return the pointer value,
+-	   so, be careful.
+-	*/
+-#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
+-	if (*alloc != SWIG_OLDOBJ)
+-#else
+-	if (*alloc == SWIG_NEWOBJ)
+-#endif
+-	  {
+-	    *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
+-	    *alloc = SWIG_NEWOBJ;
+-	  }
+-	else {
++	if (*alloc == SWIG_NEWOBJ) {
++	  *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
++	  *alloc = SWIG_NEWOBJ;
++	} else {
+ 	  *cptr = cstr;
+ 	  *alloc = SWIG_OLDOBJ;
+ 	}
+       } else {
++#if PY_VERSION_HEX>=0x03000000
++#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
++	*cptr = PyBytes_AsString(obj);
++#else
++	assert(0); /* Should never reach here with Unicode strings in Python 3 */
++#endif
++#else
+ 	*cptr = SWIG_Python_str_AsChar(obj);
++        if (!*cptr)
++          ret = SWIG_TypeError;
++#endif
+       }
+     }
+     if (psize) *psize = len + 1;
+-    return SWIG_OK;
++#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
++    Py_XDECREF(obj);
++#endif
++    return ret;
+   } else {
++#if defined(SWIG_PYTHON_2_UNICODE)
++#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
++#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once"
++#endif
++#if PY_VERSION_HEX<0x03000000
++    if (PyUnicode_Check(obj)) {
++      char *cstr; Py_ssize_t len;
++      if (!alloc && cptr) {
++        return SWIG_RuntimeError;
++      }
++      obj = PyUnicode_AsUTF8String(obj);
++      if (!obj)
++        return SWIG_TypeError;
++      if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
++        if (cptr) {
++          if (alloc) *alloc = SWIG_NEWOBJ;
++          *cptr = (char *)memcpy(malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
++        }
++        if (psize) *psize = len + 1;
++
++        Py_XDECREF(obj);
++        return SWIG_OK;
++      } else {
++        Py_XDECREF(obj);
++      }
++    }
++#endif
++#endif
++
+     swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+     if (pchar_descriptor) {
+       void* vptr = 0;
+@@ -3311,13 +3361,17 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+   if (carray) {
+     if (size > INT_MAX) {
+       swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+-      return pchar_descriptor ?
++      return pchar_descriptor ? 
+ 	SWIG_InternalNewPointerObj((char *)(carray), pchar_descriptor, 0) : SWIG_Py_Void();
+     } else {
+ #if PY_VERSION_HEX >= 0x03000000
+-      return PyBytes_FromStringAndSize(carray, (int)(size));
++#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
++      return PyBytes_FromStringAndSize(carray, (Py_ssize_t)(size));
++#else
++      return PyUnicode_DecodeUTF8(carray, (Py_ssize_t)(size), "surrogateescape");
++#endif
+ #else
+-      return PyString_FromStringAndSize(carray, (int)(size));
++      return PyString_FromStringAndSize(carray, (Py_ssize_t)(size));
+ #endif
+     }
+   } else {
+diff --git a/pystrings.swg b/pystrings.swg
+deleted file mode 100644
+index 7988a353..00000000
+--- a/pystrings.swg
++++ /dev/null
+@@ -1,86 +0,0 @@
+-/* Fixed fragments for work with bytes in Python 3. */
+-
+-%fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
+-SWIGINTERN int
+-SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+-{
+-%#if PY_VERSION_HEX>=0x03000000
+-  if (PyBytes_Check(obj))
+-%#else
+-  if (PyString_Check(obj))
+-%#endif
+-  {
+-    char *cstr; Py_ssize_t len;
+-%#if PY_VERSION_HEX>=0x03000000
+-    PyBytes_AsStringAndSize(obj, &cstr, &len);
+-    if(alloc) *alloc = SWIG_NEWOBJ;
+-%#else
+-    PyString_AsStringAndSize(obj, &cstr, &len);
+-%#endif
+-    if (cptr) {
+-      if (alloc) {
+-	/*
+-	   In python the user should not be able to modify the inner
+-	   string representation. To warranty that, if you define
+-	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
+-	   buffer is always returned.
+-
+-	   The default behavior is just to return the pointer value,
+-	   so, be careful.
+-	*/
+-%#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
+-	if (*alloc != SWIG_OLDOBJ)
+-%#else
+-	if (*alloc == SWIG_NEWOBJ)
+-%#endif
+-	  {
+-	    *cptr = %new_copy_array(cstr, len + 1, char);
+-	    *alloc = SWIG_NEWOBJ;
+-	  }
+-	else {
+-	  *cptr = cstr;
+-	  *alloc = SWIG_OLDOBJ;
+-	}
+-      } else {
+-	*cptr = SWIG_Python_str_AsChar(obj);
+-      }
+-    }
+-    if (psize) *psize = len + 1;
+-    return SWIG_OK;
+-  } else {
+-    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+-    if (pchar_descriptor) {
+-      void* vptr = 0;
+-      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+-	if (cptr) *cptr = (char *) vptr;
+-	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
+-	if (alloc) *alloc = SWIG_OLDOBJ;
+-	return SWIG_OK;
+-      }
+-    }
+-  }
+-  return SWIG_TypeError;
+-}
+-}
+-
+-%fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") {
+-SWIGINTERNINLINE PyObject *
+-SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+-{
+-  if (carray) {
+-    if (size > INT_MAX) {
+-      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+-      return pchar_descriptor ?
+-	SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void();
+-    } else {
+-%#if PY_VERSION_HEX >= 0x03000000
+-      return PyBytes_FromStringAndSize(carray, %numeric_cast(size,int));
+-%#else
+-      return PyString_FromStringAndSize(carray, %numeric_cast(size,int));
+-%#endif
+-    }
+-  } else {
+-    return SWIG_Py_Void();
+-  }
+-}
+-}
+

diff --git a/dev-python/pygraphviz/pygraphviz-1.12-r1.ebuild b/dev-python/pygraphviz/pygraphviz-1.12-r1.ebuild
new file mode 100644
index 000000000000..1b22df1f3274
--- /dev/null
+++ b/dev-python/pygraphviz/pygraphviz-1.12-r1.ebuild
@@ -0,0 +1,54 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_EXT=1
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( python3_{10..11} )
+
+inherit distutils-r1 pypi
+
+DESCRIPTION="Python wrapper for the Graphviz Agraph data structure"
+HOMEPAGE="
+	https://pygraphviz.github.io/
+	https://github.com/pygraphviz/pygraphviz/
+	https://pypi.org/project/pygraphviz/
+"
+
+LICENSE="BSD"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~x86 ~x86-linux ~ppc-macos ~x64-macos"
+
+# Note: only C API of graphviz is used, PYTHON_USEDEP unnecessary.
+DEPEND="
+	media-gfx/graphviz
+"
+RDEPEND="
+	${DEPEND}
+"
+BDEPEND="
+	dev-lang/swig:0
+"
+
+distutils_enable_tests pytest
+
+PATCHES=(
+	"${FILESDIR}"/${P}-swig-4.2.0.patch
+)
+
+src_configure() {
+	swig -python pygraphviz/graphviz.i || die
+}
+
+python_test() {
+	cd "${BUILD_DIR}"/install || die
+	epytest
+}
+
+python_install_all() {
+	dodoc -r examples
+	docompress -x /usr/share/doc/${PF}/examples
+
+	distutils-r1_python_install_all
+}


             reply	other threads:[~2024-02-06  5:18 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-06  5:18 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-05-25  6:21 [gentoo-commits] repo/gentoo:master commit in: dev-python/pygraphviz/, dev-python/pygraphviz/files/ Michał Górny
2021-08-18 17:08 Michał Górny
2020-02-05  5:50 Michał Górny

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1707196598.3e56c3670c1c691007f710416d0b9d6c86658842.sam@gentoo \
    --to=sam@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox