commit:     95b8c676dfeb51f8f54e008a058436b6e5832ab1
Author:     Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Thu Aug 20 22:10:27 2020 +0000
Commit:     Joonas Niilola <juippis <AT> gentoo <DOT> org>
CommitDate: Wed Sep 16 08:04:11 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=95b8c676

app-doc/gimp-help: 2.10.0, fix build using python3

Closes: https://bugs.gentoo.org/725940

Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
Signed-off-by: Joonas Niilola <juippis <AT> gentoo.org>

 .../gimp-help/files/gimp-help-2.10.0-python3.patch | 297 +++++++++++++++++++++
 app-doc/gimp-help/gimp-help-2.10.0-r1.ebuild       |  36 +++
 2 files changed, 333 insertions(+)

diff --git a/app-doc/gimp-help/files/gimp-help-2.10.0-python3.patch 
b/app-doc/gimp-help/files/gimp-help-2.10.0-python3.patch
new file mode 100644
index 00000000000..e42214a0f82
--- /dev/null
+++ b/app-doc/gimp-help/files/gimp-help-2.10.0-python3.patch
@@ -0,0 +1,297 @@
+diff -urNp a/tools/xml2po/__init__.py b/tools/xml2po/__init__.py
+--- a/tools/xml2po/__init__.py 2019-11-28 11:45:00.889048989 +0100
++++ b/tools/xml2po/__init__.py 2020-01-06 13:24:24.715787902 +0100
+@@ -166,7 +166,7 @@ class XMLDocument(object):
+         elif node.isText():
+             if node.isBlankNode():
+                 if self.app.options.get('expand_entities') or \
+-                  (not (node.prev and not node.prev.isBlankNode() and 
node.next and not node.next.isBlankNode()) ):
++                  (not (node.prev and not node.prev.isBlankNode() and 
node.nextElementSibling() and not node.next.isBlankNode()) ):
+                     #print >>sys.stderr, "BLANK"
+                     node.setContent('')
+             else:
+@@ -200,7 +200,7 @@ class XMLDocument(object):
+             tree = ctxt.doc()
+             newnode = tree.getRootElement()
+         except:
+-            print >> sys.stderr, """Error while normalizing string as 
XML:\n"%s"\n""" % (text)
++            print("""Error while normalizing string as XML:\n"%s"\n""" % 
(text), file=sys.stderr)
+             return text
+ 
+         self.normalizeNode(newnode)
+@@ -259,7 +259,7 @@ class XMLDocument(object):
+                     if not self.expand_entities:
+                         result += '&' + child.name + ';'
+                     else:
+-                        result += child.content.decode('utf-8')
++                        result += child.content
+                 else:
+                     result += self.myAttributeSerialize(child)
+                 child = child.next
+@@ -326,7 +326,7 @@ class XMLDocument(object):
+                 pass
+ 
+             content = '<%s>%s</%s>' % (starttag, text, endtag)
+-            tmp = tmp + content.encode('utf-8')
++            tmp = tmp + content
+ 
+             newnode = None
+             try:
+@@ -338,7 +338,7 @@ class XMLDocument(object):
+                 pass
+ 
+             if not newnode:
+-                print >> sys.stderr, """Error while parsing translation as 
XML:\n"%s"\n""" % (text.encode('utf-8'))
++                print("""Error while parsing translation as XML:\n"%s"\n""" % 
(text), file=sys.stderr)
+                 return
+ 
+             newelem = newnode.getRootElement()
+@@ -354,7 +354,7 @@ class XMLDocument(object):
+                     copy = newelem.copyNodeList()
+                     next = node.next
+                     node.replaceNode(newelem.copyNodeList())
+-                    node.next = next
++                    node.__next__ = next
+ 
+             else:
+                 # In practice, this happens with tags such as "<para>    
</para>" (only whitespace in between)
+@@ -406,7 +406,7 @@ class XMLDocument(object):
+             translation = self.app.getTranslation(outtxt)  # unicode or None
+             if translation is not None:
+                 self.replaceAttributeContentsWithText(attr,
+-                                                      
translation.encode('utf-8'))
++                                                      translation)
+         else:
+             self.app.msg.outputMessage(outtxt, node.lineNo(),  "", 
spacepreserve=False,
+                               tag = node.name + ":" + attr.name)
+@@ -447,14 +447,14 @@ class XMLDocument(object):
+             norm_outtxt = self.normalizeString(outtxt, 
self.app.isSpacePreserveNode(node))
+             translation = self.app.getTranslation(norm_outtxt)
+         else:
+-            translation = outtxt.decode('utf-8')
++            translation = outtxt
+ 
+         starttag = self.startTagForNode(node)
+         endtag = self.endTagForNode(node)
+ 
+         worth = self.worthOutputting(node)
+         if not translation:
+-            translation = outtxt.decode('utf-8')
++            translation = outtxt
+             if worth and self.app.options.get('mark_untranslated'):
+                 node.setLang('C')
+ 
+@@ -463,7 +463,7 @@ class XMLDocument(object):
+                 # repl[0] may contain translated attributes with
+                 # non-ASCII chars, so implicit conversion to <str> may fail
+                 replacement = '<%s>%s</%s>' % \
+-                              (repl[0].decode('utf-8'), repl[3], repl[2])
++                              (repl[0], repl[3], repl[2])
+                 translation = translation.replace('<placeholder-%d/>' % 
(i+1), replacement)
+ 
+             if worth:
+@@ -542,7 +542,7 @@ class Main(object):
+         elif output == '-':
+             self.out = sys.stdout
+         else:
+-            self.out = file(output, 'w')
++            self.out = open(output, 'w')
+ 
+     def load_mode(self, modename):
+         try:
+@@ -565,7 +565,7 @@ class Main(object):
+             try:
+                 doc = XMLDocument(xmlfile, self)
+             except Exception as e:
+-                print >> sys.stderr, "Unable to parse XML file '%s': %s" % 
(xmlfile, str(e))
++                print("Unable to parse XML file '%s': %s" % (xmlfile, 
str(e)), file=sys.stderr)
+                 sys.exit(1)
+             self.current_mode.preProcessXml(doc.doc, self.msg)
+             doc.generate_messages()
+@@ -578,13 +578,13 @@ class Main(object):
+         try:
+             doc = XMLDocument(xmlfile, self)
+         except Exception as e:
+-            print >> sys.stderr, str(e)
++            print(str(e), file=sys.stderr)
+             sys.exit(1)
+ 
+         try:
+             mfile = open(mofile, "rb")
+         except:
+-            print >> sys.stderr, "Can't open MO file '%s'." % (mofile)
++            print("Can't open MO file '%s'." % (mofile), file=sys.stderr)
+         self.gt = gettext.GNUTranslations(mfile)
+         self.gt.add_fallback(NoneTranslations())
+         # Has preProcessXml use cases for merge?
+@@ -607,7 +607,7 @@ class Main(object):
+         try:
+             doc = XMLDocument(xmlfile, self)
+         except Exception as e:
+-            print >> sys.stderr, str(e)
++            print(str(e), file=sys.stderr)
+             sys.exit(1)
+         doc.generate_messages()
+ 
+@@ -615,7 +615,7 @@ class Main(object):
+         try:
+             doc = XMLDocument(origxml, self)
+         except Exception as e:
+-            print >> sys.stderr, str(e)
++            print(str(e), file=sys.stderr)
+             sys.exit(1)
+         doc.generate_messages()
+         self.output_po()
+@@ -646,11 +646,11 @@ class Main(object):
+ 
+         text should be a string to look for.
+         """
+-        #print >>sys.stderr,"getTranslation('%s')" % (text.encode('utf-8'))
++        #print >>sys.stderr,"getTranslation('%s')" % (text)
+         if not text or text.strip() == '':
+             return text
+         if self.gt:
+-            res = self.gt.ugettext(text.decode('utf-8'))
++            res = self.gt.gettext(text)
+             return res
+ 
+         return text
+diff -urNp a/tools/xml2po/modes/docbook.py b/tools/xml2po/modes/docbook.py
+--- a/tools/xml2po/modes/docbook.py    2019-11-28 11:45:00.889048989 +0100
++++ b/tools/xml2po/modes/docbook.py    2020-01-06 13:10:18.324679751 +0100
+@@ -43,7 +43,7 @@ try:
+ except ImportError:
+     from md5 import new as md5_new
+ 
+-from basic import basicXmlMode
++from .basic import basicXmlMode
+ 
+ class docbookXmlMode(basicXmlMode):
+     """Class for special handling of DocBook document types.
+@@ -131,7 +131,7 @@ class docbookXmlMode(basicXmlMode):
+                     hash = self._md5_for_file(fullpath)
+                 else:
+                     hash = "THIS FILE DOESN'T EXIST"
+-                    print >>sys.stderr, "Warning: image file '%s' not found." 
% fullpath
++                    print("Warning: image file '%s' not found." % fullpath, 
file=sys.stderr)
+ 
+                 msg.outputMessage("@@image: '%s'; md5=%s" % (attr, hash), 
node.lineNo(),
+                                   "When image changes, this message will be 
marked fuzzy or untranslated for you.\n"+
+@@ -184,7 +184,7 @@ class docbookXmlMode(basicXmlMode):
+                     else:
+                         ai.addChild(copy)
+                     if match.group(3):
+-                        copy.newChild(None, "year", 
match.group(3).encode('utf-8'))
++                        copy.newChild(None, "year", match.group(3))
+                     if match.group(1) and match.group(2):
+                         holder = match.group(1)+"(%s)" % match.group(2)
+                     elif match.group(1):
+@@ -193,15 +193,15 @@ class docbookXmlMode(basicXmlMode):
+                         holder = match.group(2)
+                     else:
+                         holder = "???"
+-                    copy.newChild(None, "holder", holder.encode('utf-8'))
++                    copy.newChild(None, "holder", holder)
+ 
+ # Perform some tests when ran standalone
+ if __name__ == '__main__':
+     test = docbookXmlMode()
+-    print "Ignored tags       : " + repr(test.getIgnoredTags())
+-    print "Final tags         : " + repr(test.getFinalTags())
+-    print "Space-preserve tags: " + repr(test.getSpacePreserveTags())
++    print("Ignored tags       : " + repr(test.getIgnoredTags()))
++    print("Final tags         : " + repr(test.getFinalTags()))
++    print("Space-preserve tags: " + repr(test.getSpacePreserveTags()))
+ 
+-    print "Credits from string: '%s'" % test.getStringForTranslators()
+-    print "Explanation for credits:\n\t'%s'" % test.getCommentForTranslators()
++    print("Credits from string: '%s'" % test.getStringForTranslators())
++    print("Explanation for credits:\n\t'%s'" % 
test.getCommentForTranslators())
+ 
+diff -urNp a/tools/xml2po/modes/gimphelp.py b/tools/xml2po/modes/gimphelp.py
+--- a/tools/xml2po/modes/gimphelp.py   2019-11-28 11:45:00.889048989 +0100
++++ b/tools/xml2po/modes/gimphelp.py   2020-01-06 11:59:17.387855373 +0100
+@@ -31,7 +31,7 @@ try:
+ except ImportError:
+     from md5 import new as md5_new
+ 
+-from docbook import docbookXmlMode
++from .docbook import docbookXmlMode
+ 
+ class gimphelpXmlMode(docbookXmlMode):
+     """Class for special handling of gimp-help DocBook document types.
+@@ -91,10 +91,10 @@ class gimphelpXmlMode(docbookXmlMode):
+ # Perform some tests when ran standalone
+ if __name__ == '__main__':
+     test = gimphelpXmlMode()
+-    print "Ignored tags       : " + repr(test.getIgnoredTags())
+-    print "Final tags         : " + repr(test.getFinalTags())
+-    print "Space-preserve tags: " + repr(test.getSpacePreserveTags())
++    print("Ignored tags       : " + repr(test.getIgnoredTags()))
++    print("Final tags         : " + repr(test.getFinalTags()))
++    print("Space-preserve tags: " + repr(test.getSpacePreserveTags()))
+ 
+-    print "Credits from string: '%s'" % test.getStringForTranslators()
+-    print "Explanation for credits:\n\t'%s'" % test.getCommentForTranslators()
++    print("Credits from string: '%s'" % test.getStringForTranslators())
++    print("Explanation for credits:\n\t'%s'" % 
test.getCommentForTranslators())
+ 
+diff -urNp a/tools/xml2po.py b/tools/xml2po.py
+--- a/tools/xml2po.py  2019-11-28 11:45:00.889048989 +0100
++++ b/tools/xml2po.py  2020-01-06 11:59:17.387855373 +0100
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ # -*- encoding: utf-8 -*-
+ # Copyright (c) 2004, 2005, 2006 Danilo Ĺ egan <dan...@gnome.org>.
+ # Copyright (c) 2009 Claude Paroz <cla...@2xlibre.net>.
+@@ -41,9 +41,9 @@ NULL_STRING = '/dev/null'
+ if not os.path.exists('/dev/null'): NULL_STRING = 'NUL'
+ 
+ def usage (with_help = False):
+-    print >> sys.stderr, "Usage:  %s [OPTIONS] [XMLFILE]..." % (sys.argv[0])
++    print("Usage:  %s [OPTIONS] [XMLFILE]..." % (sys.argv[0]), 
file=sys.stderr)
+     if with_help:
+-        print >> sys.stderr, """
++        print("""
+ OPTIONS may be some of:
+     -a    --automatic-tags     Automatically decides if tags are to be 
considered
+                                  "final" or not
+@@ -72,7 +72,7 @@ EXAMPLES:
+     using -p option for each XML file:
+         %(command)s -p de.po chapter1.xml > chapter1.de.xml
+         %(command)s -p de.po chapter2.xml > chapter2.de.xml
+-""" % {'command': sys.argv[0]}
++""" % {'command': sys.argv[0]}, file=sys.stderr)
+ 
+ 
+ def main(argv):
+@@ -148,7 +148,7 @@ def main(argv):
+             sys.exit(0)
+ 
+     if operation == 'update' and output != "-":
+-        print >> sys.stderr, "Option '-o' is not yet supported when updating 
translations directly. Ignoring this option."
++        print("Option '-o' is not yet supported when updating translations 
directly. Ignoring this option.", file=sys.stderr)
+ 
+     # Treat remaining arguments as XML files
+     filenames = []
+@@ -158,16 +158,16 @@ def main(argv):
+     try:
+         xml2po_main = Main(default_mode, operation, output, options)
+     except IOError:
+-        print >> sys.stderr, "Error: cannot open file %s for writing." % 
(output)
++        print("Error: cannot open file %s for writing." % (output), 
file=sys.stderr)
+         sys.exit(5)
+ 
+     if operation == 'merge':
+         if len(filenames) > 1:
+-            print  >> sys.stderr, "Error: You can merge translations with 
only one XML file at a time."
++            print("Error: You can merge translations with only one XML file 
at a time.", file=sys.stderr)
+             sys.exit(2)
+ 
+         if not mofile:
+-            print >> sys.stderr, "Error: You must specify MO file when 
merging translations."
++            print("Error: You must specify MO file when merging 
translations.", file=sys.stderr)
+             sys.exit(3)
+ 
+         xml2po_main.merge(mofile, filenames[0])

diff --git a/app-doc/gimp-help/gimp-help-2.10.0-r1.ebuild 
b/app-doc/gimp-help/gimp-help-2.10.0-r1.ebuild
new file mode 100644
index 00000000000..3dab2da02f4
--- /dev/null
+++ b/app-doc/gimp-help/gimp-help-2.10.0-r1.ebuild
@@ -0,0 +1,36 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6,7,8,9} )
+inherit python-any-r1
+
+DESCRIPTION="GNU Image Manipulation Program help files"
+HOMEPAGE="https://docs.gimp.org/";
+SRC_URI="mirror://gimp/help/${P}.tar.bz2"
+
+LICENSE="FDL-1.2"
+SLOT="2"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86"
+IUSE=""
+
+BDEPEND="${PYTHON_DEPS}
+       sys-devel/gettext
+"
+
+DEPEND="$(python_gen_any_dep 'dev-libs/libxml2[python,${PYTHON_USEDEP}]')
+       dev-libs/libxslt
+"
+
+# Adds python3 build support, bug 725940
+# patch is from https://gitlab.gnome.org/GNOME/gimp-help/-/issues/201
+PATCHES=( "${FILESDIR}/${P}-python3.patch" )
+
+python_check_deps() {
+       has_version "dev-libs/libxml2[${PYTHON_USEDEP}]"
+}
+
+src_configure() {
+       econf --without-gimp
+}

Reply via email to