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: media-gfx/xdot/, media-gfx/xdot/files/
Date: Sun, 30 Oct 2022 09:35:02 +0000 (UTC)	[thread overview]
Message-ID: <1667122408.7c03e29ee878fea8283373764506032386552d19.sam@gentoo> (raw)

commit:     7c03e29ee878fea8283373764506032386552d19
Author:     Matoro Mahri <matoro <AT> users <DOT> noreply <DOT> github <DOT> com>
AuthorDate: Thu Oct  6 02:58:53 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun Oct 30 09:33:28 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=7c03e29e

media-gfx/xdot: add tests

Bug: https://bugs.gentoo.org/873490
Signed-off-by: Matoro Mahri <matoro <AT> users.noreply.github.com>
Closes: https://github.com/gentoo/gentoo/pull/27653
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../xdot/files/backport-2ace1a1-issue-92.patch     | 151 +++++++++++++++++++++
 .../xdot/{xdot-9999.ebuild => xdot-1.2-r1.ebuild}  |  17 ++-
 media-gfx/xdot/xdot-9999.ebuild                    |  12 +-
 3 files changed, 176 insertions(+), 4 deletions(-)

diff --git a/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch b/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch
new file mode 100644
index 000000000000..8cb76a43fe55
--- /dev/null
+++ b/media-gfx/xdot/files/backport-2ace1a1-issue-92.patch
@@ -0,0 +1,151 @@
+https://github.com/jrfonseca/xdot.py/issues/92
+https://bugs.gentoo.org/873490
+
+From 2ace1a12d78423d9e7af20fdb0bca34827010408 Mon Sep 17 00:00:00 2001
+From: Jose Fonseca <jose.r.fonseca@gmail.com>
+Date: Tue, 28 Sep 2021 13:19:49 +0100
+Subject: [PATCH] Handle xdot backslashes correctly.
+
+Irrespectively of graphviz version.
+
+Fixes https://github.com/jrfonseca/xdot.py/issues/92
+---
+ tests/issue_92_a.dot |  3 +++
+ tests/issue_92_b.dot |  3 +++
+ xdot/dot/parser.py   | 26 +++++++++++++++++++++-----
+ xdot/ui/window.py    | 11 ++++++++++-
+ 4 files changed, 37 insertions(+), 6 deletions(-)
+ create mode 100644 tests/issue_92_a.dot
+ create mode 100644 tests/issue_92_b.dot
+
+diff --git a/tests/issue_92_a.dot b/tests/issue_92_a.dot
+new file mode 100644
+index 0000000..ea486b0
+--- /dev/null
++++ b/tests/issue_92_a.dot
+@@ -0,0 +1,3 @@
++digraph {
++   1 [label="a\\00"]
++}
+diff --git a/tests/issue_92_b.dot b/tests/issue_92_b.dot
+new file mode 100644
+index 0000000..ba90566
+--- /dev/null
++++ b/tests/issue_92_b.dot
+@@ -0,0 +1,3 @@
++digraph {
++   1 [label="a\\b"]
++}
+diff --git a/xdot/dot/parser.py b/xdot/dot/parser.py
+index 4244e03..6578c23 100644
+--- a/xdot/dot/parser.py
++++ b/xdot/dot/parser.py
+@@ -14,8 +14,11 @@
+ # along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ #
+ import colorsys
++import re
+ import sys
+ 
++from distutils.version import LooseVersion
++
+ from .lexer import ParseError, DotLexer
+ 
+ from ..ui.colors import lookup_color
+@@ -85,7 +88,14 @@ class XDotAttrParser:
+     - http://www.graphviz.org/doc/info/output.html#d:xdot
+     """
+ 
+-    def __init__(self, parser, buf):
++    def __init__(self, parser, buf, broken_backslashes):
++
++        # `\` should be escaped as `\\`, but older versions of graphviz xdot
++        # output failed to properly escape it.  See also
++        # https://github.com/jrfonseca/xdot.py/issues/92
++        if not broken_backslashes:
++            buf = re.sub(br'\\(.)', br'\1', buf)
++
+         self.parser = parser
+         self.buf = buf
+         self.pos = 0
+@@ -427,10 +437,16 @@ class XDotParser(DotParser):
+ 
+     XDOTVERSION = '1.7'
+ 
+-    def __init__(self, xdotcode):
++    def __init__(self, xdotcode, graphviz_version=None):
+         lexer = DotLexer(buf=xdotcode)
+         DotParser.__init__(self, lexer)
+ 
++        # https://github.com/jrfonseca/xdot.py/issues/92
++        self.broken_backslashes = False
++        if graphviz_version is not None and \
++                LooseVersion(graphviz_version) < LooseVersion("2.46.0"):
++            self.broken_backslashes = True
++
+         self.nodes = []
+         self.edges = []
+         self.shapes = []
+@@ -480,7 +496,7 @@ def handle_graph(self, attrs):
+ 
+         for attr in ("_draw_", "_ldraw_", "_hdraw_", "_tdraw_", "_hldraw_", "_tldraw_"):
+             if attr in attrs:
+-                parser = XDotAttrParser(self, attrs[attr])
++                parser = XDotAttrParser(self, attrs[attr], self.broken_backslashes)
+                 self.shapes.extend(parser.parse())
+ 
+     def handle_node(self, id, attrs):
+@@ -502,7 +518,7 @@ def handle_node(self, id, attrs):
+         shapes = []
+         for attr in ("_draw_", "_ldraw_"):
+             if attr in attrs:
+-                parser = XDotAttrParser(self, attrs[attr])
++                parser = XDotAttrParser(self, attrs[attr], self.broken_backslashes)
+                 shapes.extend(parser.parse())
+         try:
+             url = attrs['URL']
+@@ -525,7 +541,7 @@ def handle_edge(self, src_id, dst_id, attrs):
+         shapes = []
+         for attr in ("_draw_", "_ldraw_", "_hdraw_", "_tdraw_", "_hldraw_", "_tldraw_"):
+             if attr in attrs:
+-                parser = XDotAttrParser(self, attrs[attr])
++                parser = XDotAttrParser(self, attrs[attr], self.broken_backslashes)
+                 shapes.extend(parser.parse())
+         if shapes:
+             src = self.node_by_name[src_id]
+diff --git a/xdot/ui/window.py b/xdot/ui/window.py
+index 893bd1d..e27f000 100644
+--- a/xdot/ui/window.py
++++ b/xdot/ui/window.py
+@@ -56,6 +56,7 @@ class DotWidget(Gtk.DrawingArea):
+     }
+ 
+     filter = 'dot'
++    graphviz_version = None
+ 
+     def __init__(self):
+         Gtk.DrawingArea.__init__(self)
+@@ -100,6 +101,7 @@ def error_dialog(self, message):
+ 
+     def set_filter(self, filter):
+         self.filter = filter
++        self.graphviz_version = None
+ 
+     def run_filter(self, dotcode):
+         if not self.filter:
+@@ -153,7 +155,14 @@ def set_dotcode(self, dotcode, filename=None, center=True):
+ 
+     def set_xdotcode(self, xdotcode, center=True):
+         assert isinstance(xdotcode, bytes)
+-        parser = XDotParser(xdotcode)
++        if self.graphviz_version is None:
++            stdout = subprocess.check_output([self.filter, '-V'], stderr=subprocess.STDOUT)
++            stdout = stdout.rstrip()
++            mo = re.match(br'^.* - .* version (?P<version>.*) \(.*\)$', stdout)
++            assert mo
++            self.graphviz_version = mo.group('version').decode('ascii')
++
++        parser = XDotParser(xdotcode, graphviz_version=self.graphviz_version)
+         self.graph = parser.parse()
+         self.zoom_image(self.zoom_ratio, center=center)
+ 

diff --git a/media-gfx/xdot/xdot-9999.ebuild b/media-gfx/xdot/xdot-1.2-r1.ebuild
similarity index 66%
copy from media-gfx/xdot/xdot-9999.ebuild
copy to media-gfx/xdot/xdot-1.2-r1.ebuild
index 646fd464d2bd..579a8e03216a 100644
--- a/media-gfx/xdot/xdot-9999.ebuild
+++ b/media-gfx/xdot/xdot-1.2-r1.ebuild
@@ -2,7 +2,7 @@
 # Distributed under the terms of the GNU General Public License v2
 
 EAPI=7
-PYTHON_COMPAT=( python3_{8..11} )
+PYTHON_COMPAT=( python3_{8..10} )
 
 MY_PN=xdot.py
 EGIT_REPO_URI="https://github.com/jrfonseca/${MY_PN}"
@@ -11,24 +11,35 @@ if [[ ${PV} = 9999* ]]; then
 	GIT_ECLASS="git-r3"
 	SRC_URI=""
 else
-	KEYWORDS="~amd64 ~arm ~arm64 ~ia64 ~ppc ~ppc64 ~x86"
+	KEYWORDS="amd64 arm arm64 ~hppa ~ia64 ppc ~ppc64 ~riscv ~sparc x86"
 	MY_P="${MY_PN}-${PV}"
 	S="${WORKDIR}/${MY_P}"
 	SRC_URI="https://github.com/jrfonseca/${MY_PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
 fi
 
-inherit ${GIT_ECLASS} distutils-r1
+inherit ${GIT_ECLASS} distutils-r1 virtualx
 
 DESCRIPTION="Interactive viewer for Graphviz dot files"
 HOMEPAGE="https://github.com/jrfonseca/xdot.py"
 
 LICENSE="LGPL-2+"
 SLOT="0"
+PATCHES=( "${FILESDIR}/backport-2ace1a1-issue-92.patch" )
 
 DEPEND="
 	dev-python/numpy[${PYTHON_USEDEP}]
 	dev-python/pycairo[${PYTHON_USEDEP}]
 	dev-python/pygobject:3[${PYTHON_USEDEP}]
 	media-gfx/graphviz
+	test? ( x11-libs/gtk+:3 )
 "
 RDEPEND="${DEPEND}"
+
+run_test() {
+	cd tests && "${EPYTHON}" ../test.py *.dot graphs/*.gv
+	return "${?}"
+}
+
+python_test() {
+	virtx run_test
+}

diff --git a/media-gfx/xdot/xdot-9999.ebuild b/media-gfx/xdot/xdot-9999.ebuild
index 646fd464d2bd..b0e3b6d5c63e 100644
--- a/media-gfx/xdot/xdot-9999.ebuild
+++ b/media-gfx/xdot/xdot-9999.ebuild
@@ -17,7 +17,7 @@ else
 	SRC_URI="https://github.com/jrfonseca/${MY_PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
 fi
 
-inherit ${GIT_ECLASS} distutils-r1
+inherit ${GIT_ECLASS} distutils-r1 virtualx
 
 DESCRIPTION="Interactive viewer for Graphviz dot files"
 HOMEPAGE="https://github.com/jrfonseca/xdot.py"
@@ -30,5 +30,15 @@ DEPEND="
 	dev-python/pycairo[${PYTHON_USEDEP}]
 	dev-python/pygobject:3[${PYTHON_USEDEP}]
 	media-gfx/graphviz
+	test? ( x11-libs/gtk+:3 )
 "
 RDEPEND="${DEPEND}"
+
+run_test() {
+	cd tests && "${EPYTHON}" ../test.py *.dot graphs/*.gv
+	return "${?}"
+}
+
+python_test() {
+	virtx run_test
+}


             reply	other threads:[~2022-10-30  9:35 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-30  9:35 Sam James [this message]
  -- strict thread matches above, loose matches on Subject: below --
2023-11-08 18:49 [gentoo-commits] repo/gentoo:master commit in: media-gfx/xdot/, media-gfx/xdot/files/ Matt Turner

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=1667122408.7c03e29ee878fea8283373764506032386552d19.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