commit:     14a30e74032de0399de3e8ffefbf04c2316070a5
Author:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
AuthorDate: Sat Oct 24 16:15:53 2020 +0000
Commit:     Andreas Sturmlechner <asturm <AT> gentoo <DOT> org>
CommitDate: Sun Oct 25 00:27:39 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=14a30e74

app-admin/system-config-printer: python3_9 w/ required fixes

Package-Manager: Portage-3.0.8, Repoman-3.0.2
Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org>

 ...config-printer-1.5.12-catch-urllib-errors.patch |  22 +++
 ...config-printer-1.5.12-fix-remember-passwd.patch | 121 +++++++++++++++++
 .../system-config-printer-1.5.12-py39-1.patch      |  45 +++++++
 .../system-config-printer-1.5.12-py39-2.patch      | 147 +++++++++++++++++++++
 .../system-config-printer-1.5.12-r2.ebuild         |  86 ++++++++++++
 5 files changed, 421 insertions(+)

diff --git 
a/app-admin/system-config-printer/files/system-config-printer-1.5.12-catch-urllib-errors.patch
 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-catch-urllib-errors.patch
new file mode 100644
index 00000000000..fbae8442615
--- /dev/null
+++ 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-catch-urllib-errors.patch
@@ -0,0 +1,22 @@
+From feed693225cc0c26464bfc0adef21da72581e811 Mon Sep 17 00:00:00 2001
+From: Zdenek Dohnal <[email protected]>
+Date: Thu, 28 Nov 2019 15:45:22 +0100
+Subject: [PATCH] Catch errors from urllib too
+
+---
+ newprinter.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/newprinter.py b/newprinter.py
+index 8b9298887..6c71ec578 100644
+--- a/newprinter.py
++++ b/newprinter.py
+@@ -4183,7 +4183,7 @@ def getNPPPD(self):
+                                 tmpf.flush ()
+                                 ppd = cups.PPD(tmpf.name)
+ 
+-        except RuntimeError as e:
++        except (RuntimeError, urllib.error.HTTPError) as e:
+             debugprint ("RuntimeError: " + repr (e))
+             if self.rbtnNPFoomatic.get_active():
+                 # Foomatic database problem of some sort.

diff --git 
a/app-admin/system-config-printer/files/system-config-printer-1.5.12-fix-remember-passwd.patch
 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-fix-remember-passwd.patch
new file mode 100644
index 00000000000..980d1e03154
--- /dev/null
+++ 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-fix-remember-passwd.patch
@@ -0,0 +1,121 @@
+From b74c701feb52a1d2865fe1d33c393f71ae3ac47a Mon Sep 17 00:00:00 2001
+From: Ave Ozkal <[email protected]>
+Date: Thu, 19 Mar 2020 13:30:23 +0300
+Subject: [PATCH 1/3] jobviewer: Use sync methods for secret.service
+
+---
+ jobviewer.py | 28 +++++++++-------------------
+ 1 file changed, 9 insertions(+), 19 deletions(-)
+
+diff --git a/jobviewer.py b/jobviewer.py
+index b95bf6c58..ba8abd06f 100644
+--- a/jobviewer.py
++++ b/jobviewer.py
+@@ -91,36 +91,26 @@
+     class ServiceGet:
+         service = Secret.Service()
+     
+-        def on_get_service(self, source, result, unused):
+-            service = Secret.Service.get_finish(result)
+-    
+         def __init__(self):
+-            Secret.Service.get(0,
+-                               None,
+-                               self.on_get_service,
+-                               None)
++            self.service = Secret.Service.get(0,
++                                              None)
+     
+         def get_service(self):
+-            return ServiceGet.service
++            return self.service
+     
+     
+     class ItemSearch:
+         items = list()
+     
+-        def on_search_item(self, source, result, unused):
+-            items = Secret.Service.search_finish(None, result)
+-    
+         def __init__(self, service, attrs):
+-            Secret.Service.search(service,
+-                                  NETWORK_PASSWORD,
+-                                  attrs,
+-                                  Secret.SearchFlags.LOAD_SECRETS,
+-                                  None,
+-                                  self.on_search_item,
+-                                  None)
++            self.items = Secret.Service.search_sync(service,
++                                                    NETWORK_PASSWORD,
++                                                    attrs,
++                                                    
Secret.SearchFlags.LOAD_SECRETS,
++                                                    None)
+     
+         def get_items(self):
+-            return ItemSearch.items
++            return self.items
+     
+     
+     class PasswordStore:
+
+From 152b617f511cd44757d2db4d730067aca8cf69a9 Mon Sep 17 00:00:00 2001
+From: Ave Ozkal <[email protected]>
+Date: Thu, 19 Mar 2020 14:39:21 +0300
+Subject: [PATCH 2/3] jobviewer: properly use sync
+
+---
+ jobviewer.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/jobviewer.py b/jobviewer.py
+index ba8abd06f..761673b49 100644
+--- a/jobviewer.py
++++ b/jobviewer.py
+@@ -92,8 +92,8 @@ class ServiceGet:
+         service = Secret.Service()
+     
+         def __init__(self):
+-            self.service = Secret.Service.get(0,
+-                                              None)
++            self.service = Secret.Service.get_sync(0,
++                                                   None)
+     
+         def get_service(self):
+             return self.service
+
+From 00177768ca1464c694acde4cdbabc1a18420c176 Mon Sep 17 00:00:00 2001
+From: Ave Ozkal <[email protected]>
+Date: Thu, 19 Mar 2020 14:40:55 +0300
+Subject: [PATCH 3/3] jobviewer: Properly fetch username and password
+
+---
+ jobviewer.py | 14 ++------------
+ 1 file changed, 2 insertions(+), 12 deletions(-)
+
+diff --git a/jobviewer.py b/jobviewer.py
+index 761673b49..5376a7e88 100644
+--- a/jobviewer.py
++++ b/jobviewer.py
+@@ -1049,20 +1049,10 @@ def get_authentication (self, job, device_uri, 
printer_uri,
+                     if items:
+                         auth_info = ['' for x in auth_info_required]
+                         ind = auth_info_required.index ('username')
+-
+-                        for attr in items[0].attributes:
+-                            # It might be safe to assume here that the
+-                            # user element is always the second item in a
+-                            # NETWORK_PASSWORD element but lets make sure.
+-                            if attr.name == 'user':
+-                                auth_info[ind] = attr.get_string()
+-                                break
+-                        else:
+-                            debugprint ("Did not find username keyring "
+-                                        "attributes.")
++                        auth_info[ind] = items[0].get_attributes().get("user")
+ 
+                         ind = auth_info_required.index ('password')
+-                        auth_info[ind] = items[0].secret
++                        auth_info[ind] = items[0].get_secret().get().decode()
+                         break
+                 else:
+                     debugprint ("Failed to find secret in keyring.")

diff --git 
a/app-admin/system-config-printer/files/system-config-printer-1.5.12-py39-1.patch
 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-py39-1.patch
new file mode 100644
index 00000000000..658a63d65c7
--- /dev/null
+++ 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-py39-1.patch
@@ -0,0 +1,45 @@
+From cf7a74217558b19aff7c21a724878bcc15dc4e38 Mon Sep 17 00:00:00 2001
+From: Zdenek Dohnal <[email protected]>
+Date: Mon, 5 Oct 2020 09:26:40 +0200
+Subject: [PATCH] isAlive() is removed, use is_alive()
+
+---
+ asyncipp.py | 2 +-
+ timedops.py | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/asyncipp.py b/asyncipp.py
+index 5bc160e0f..61cd72136 100644
+--- a/asyncipp.py
++++ b/asyncipp.py
+@@ -269,7 +269,7 @@ def destroy (self):
+         for binding in self.bindings:
+             delattr (self, binding)
+ 
+-        if self.thread.isAlive ():
++        if self.thread.is_alive ():
+             debugprint ("Stopping worker thread")
+             self.thread.stop ()
+             GLib.timeout_add_seconds (1, self._reap_thread)
+diff --git a/timedops.py b/timedops.py
+index 8a8741c82..111d575f6 100644
+--- a/timedops.py
++++ b/timedops.py
+@@ -157,7 +157,7 @@ def run (self):
+             self.exception = e
+ 
+     def collect_result (self):
+-        if self.isAlive ():
++        if self.is_alive ():
+             # We've been canceled.
+             raise OperationCanceled()
+ 
+@@ -212,7 +212,7 @@ def run (self):
+         return self.thread.collect_result ()
+ 
+     def _check_thread (self):
+-        if self.thread.isAlive ():
++        if self.thread.is_alive ():
+             # Thread still running.
+             return True
+ 

diff --git 
a/app-admin/system-config-printer/files/system-config-printer-1.5.12-py39-2.patch
 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-py39-2.patch
new file mode 100644
index 00000000000..eccb3939e0d
--- /dev/null
+++ 
b/app-admin/system-config-printer/files/system-config-printer-1.5.12-py39-2.patch
@@ -0,0 +1,147 @@
+From 63eccd5603e19cd35d6d44af65443665a3c63f38 Mon Sep 17 00:00:00 2001
+From: Zdenek Dohnal <[email protected]>
+Date: Wed, 22 Jul 2020 13:57:13 +0200
+Subject: [PATCH] python3.9 - xml module removed elem.getchildren() method, use
+ list(elem)
+
+---
+ cupshelpers/openprinting.py   |  6 +++---
+ cupshelpers/xmldriverprefs.py | 20 ++++++++++----------
+ xml/validate.py               | 10 +++++-----
+ 3 files changed, 18 insertions(+), 18 deletions(-)
+
+diff --git a/cupshelpers/openprinting.py b/cupshelpers/openprinting.py
+index c616d913c..9bb4764c9 100755
+--- a/cupshelpers/openprinting.py
++++ b/cupshelpers/openprinting.py
+@@ -338,7 +338,7 @@ def parse_result (status, data, result):
+                     packages = {}
+                     container = driver.find ('packages')
+                     if container is not None:
+-                        for arch in container.getchildren ():
++                        for arch in list(container):
+                             rpms = {}
+                             for package in arch.findall ('package'):
+                                 rpm = {}
+@@ -351,7 +351,7 @@ def parse_result (status, data, result):
+ 
+                                 repositories = package.find ('repositories')
+                                 if repositories is not None:
+-                                    for pkgsys in repositories.getchildren ():
++                                    for pkgsys in list(repositories):
+                                         rpm.setdefault('repositories', 
{})[pkgsys.tag] = pkgsys.text
+ 
+                                 rpms[package.attrib['file']] = rpm
+@@ -363,7 +363,7 @@ def parse_result (status, data, result):
+                     ppds = []
+                     container = driver.find ('ppds')
+                     if container is not None:
+-                        for each in container.getchildren ():
++                        for each in list(container):
+                             ppds.append (each.text)
+ 
+                     if ppds:
+diff --git a/cupshelpers/xmldriverprefs.py b/cupshelpers/xmldriverprefs.py
+index 4177e1c0f..0d02950f4 100644
+--- a/cupshelpers/xmldriverprefs.py
++++ b/cupshelpers/xmldriverprefs.py
+@@ -27,7 +27,7 @@
+ 
+ def PreferredDrivers (filename):
+     preferreddrivers = xml.etree.ElementTree.XML (open (filename).read ())
+-    return preferreddrivers.getchildren()
++    return list(preferreddrivers)
+ 
+ class DeviceIDMatch:
+     """
+@@ -227,10 +227,10 @@ def load (self, drivertypes):
+         """
+ 
+         types = []
+-        for drivertype in drivertypes.getchildren ():
++        for drivertype in list(drivertypes):
+             t = DriverType (drivertype.attrib["name"])
+ 
+-            for child in drivertype.getchildren ():
++            for child in list(drivertype):
+                 if child.tag == "ppdname":
+                     t.add_ppd_name (child.attrib["match"])
+                 elif child.tag == "attribute":
+@@ -238,7 +238,7 @@ def load (self, drivertypes):
+                                      child.attrib["match"])
+                 elif child.tag == "deviceid":
+                     deviceid_match = DeviceIDMatch ()
+-                    for field in child.getchildren ():
++                    for field in list(child):
+                         if field.tag == "field":
+                             deviceid_match.add_field (field.attrib["name"],
+                                                       field.attrib["match"])
+@@ -414,29 +414,29 @@ def load (self, preferreddrivers):
+         Load the policy from an XML file.
+         """
+ 
+-        for printer in preferreddrivers.getchildren ():
++        for printer in list(preferreddrivers):
+             ptype = PrinterType ()
+-            for child in printer.getchildren ():
++            for child in list(printer):
+                 if child.tag == "make-and-model":
+                     ptype.add_make_and_model (child.attrib["match"])
+                 elif child.tag == "deviceid":
+                     deviceid_match = DeviceIDMatch ()
+-                    for field in child.getchildren ():
++                    for field in list(child):
+                         if field.tag == "field":
+                             deviceid_match.add_field (field.attrib["name"],
+                                                       field.attrib["match"])
+                     ptype.add_deviceid_match (deviceid_match)
+ 
+                 elif child.tag == "drivers":
+-                    for drivertype in child.getchildren ():
++                    for drivertype in list(child):
+                         ptype.add_drivertype_pattern (drivertype.text)
+ 
+                 elif child.tag == "avoid":
+-                    for drivertype in child.getchildren ():
++                    for drivertype in list(child):
+                         ptype.add_avoidtype_pattern (drivertype.text)
+ 
+                 elif child.tag == "blacklist":
+-                    for drivertype in child.getchildren ():
++                    for drivertype in list(child):
+                         ptype.add_blacklisted (drivertype.text)
+ 
+             self.ptypes.append (ptype)
+diff --git a/xml/validate.py b/xml/validate.py
+index 8fc201ecf..ba16766dc 100644
+--- a/xml/validate.py
++++ b/xml/validate.py
+@@ -35,23 +35,23 @@ def validate (self):
+         filename = self._filename
+         print ("Validating %s" % filename)
+         preferreddrivers = xml.etree.ElementTree.XML (open (filename).read ())
+-        (drivertypes, preferenceorder) = preferreddrivers.getchildren ()
++        (drivertypes, preferenceorder) = list(preferreddrivers)
+         validates = True
+ 
+         names = set()
+-        for drivertype in drivertypes.getchildren ():
++        for drivertype in list(drivertypes):
+             name = drivertype.get ("name")
+             names.add (name)
+ 
+-        for printer in preferenceorder.getchildren ():
++        for printer in list(preferenceorder):
+             types = []
+             drivers = printer.find ("drivers")
+             if drivers is not None:
+-                types.extend (drivers.getchildren ())
++                types.extend (list(drivers))
+ 
+             blacklist = printer.find ("blacklist")
+             if blacklist is not None:
+-                types.extend (blacklist.getchildren ())
++                types.extend (list(blacklist))
+ 
+             for drivertype in types:
+                 pattern = drivertype.text.strip ()

diff --git 
a/app-admin/system-config-printer/system-config-printer-1.5.12-r2.ebuild 
b/app-admin/system-config-printer/system-config-printer-1.5.12-r2.ebuild
new file mode 100644
index 00000000000..c97eaf9b4f2
--- /dev/null
+++ b/app-admin/system-config-printer/system-config-printer-1.5.12-r2.ebuild
@@ -0,0 +1,86 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python3_{7,8,9} )
+PYTHON_REQ_USE="xml"
+inherit gnome2 python-single-r1 systemd
+
+DESCRIPTION="Graphical user interface for CUPS administration"
+HOMEPAGE="https://github.com/OpenPrinting/system-config-printer";
+SRC_URI="https://github.com/OpenPrinting/${PN}/releases/download/${PV}/${P}.tar.xz";
+
+LICENSE="GPL-2+"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~ia64 ~ppc ~ppc64 ~sparc ~x86"
+SLOT="0"
+IUSE="gnome-keyring policykit"
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+# Needs cups running, bug 284005
+RESTRICT="test"
+
+# Additional unhandled dependencies
+# gnome-extra/gnome-packagekit[${PYTHON_USEDEP}] with pygobject:2 ?
+# python samba client: smbc
+# selinux: needed for troubleshooting
+COMMON_DEPEND="${PYTHON_DEPS}
+       dev-libs/glib:2
+       net-print/cups[dbus]
+       virtual/libusb:1
+       >=virtual/udev-172
+       x11-libs/gtk+:3[introspection]
+       x11-libs/libnotify[introspection]
+       x11-libs/pango[introspection]
+"
+DEPEND="${COMMON_DEPEND}
+       app-text/docbook-xml-dtd:4.1.2
+       >=app-text/xmlto-0.0.22
+       dev-perl/XML-Parser
+       dev-util/desktop-file-utils
+       dev-util/intltool
+       sys-devel/gettext
+       virtual/pkgconfig
+"
+RDEPEND="${COMMON_DEPEND}
+       $(python_gen_cond_dep '
+               dev-python/dbus-python[${PYTHON_MULTI_USEDEP}]
+               dev-python/pycairo[${PYTHON_MULTI_USEDEP}]
+               dev-python/pycups[${PYTHON_MULTI_USEDEP}]
+               dev-python/pygobject:3[${PYTHON_MULTI_USEDEP}]
+               dev-python/requests[${PYTHON_MULTI_USEDEP}]
+               dev-python/urllib3[${PYTHON_MULTI_USEDEP}]
+       ')
+       gnome-keyring? ( app-crypt/libsecret[introspection] )
+       policykit? ( net-print/cups-pk-helper )
+"
+
+PATCHES=(
+       "${FILESDIR}"/${P}-check-for-null.patch
+       "${FILESDIR}"/${P}-fix-abrt-in-udev-configure-printer.patch
+       "${FILESDIR}"/${P}-catch-urllib-errors.patch
+       "${FILESDIR}"/${P}-fix-remember-passwd.patch
+       "${FILESDIR}"/${P}-py39-{1,2}.patch
+)
+
+pkg_setup() {
+       python-single-r1_pkg_setup
+}
+
+src_configure() {
+       gnome2_src_configure \
+               --enable-nls \
+               --with-desktop-vendor=Gentoo \
+               --with-udev-rules \
+               --with-systemdsystemunitdir=$(systemd_get_systemunitdir)
+}
+
+src_compile() {
+       gnome2_src_compile
+}
+
+src_install() {
+       gnome2_src_install
+       python_fix_shebang "${ED}"
+       python_optimize
+}

Reply via email to