Github messages for voidlinux
 help / color / mirror / Atom feed
* [PR PATCH] telepathy suite: python3ise everything
@ 2023-10-08  4:54 classabbyamp
  2023-10-08 12:56 ` Duncaen
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: classabbyamp @ 2023-10-08  4:54 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 792 bytes --]

There is a new pull request by classabbyamp against master on the void-packages repository

https://github.com/classabbyamp/void-packages telepathy
https://github.com/void-linux/void-packages/pull/46516

telepathy suite: python3ise everything
- telepathy-qt5: update to 0.9.8.
- telepathy-farstream: doesn't need python
- telepathy-logger: make codegen work with python3
- telepathy-haze: update to 0.8.1.
- telepathy-salut: make codegen work with python3
- telepathy-gabble: patch for python3

<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly** (builds)

cc @duncaen, a couple of these are yours


A patch file from https://github.com/void-linux/void-packages/pull/46516.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-telepathy-46516.patch --]
[-- Type: text/x-diff, Size: 74338 bytes --]

From 0267fd12b36de6499aecb155b17681c1176fad74 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 22:38:20 -0400
Subject: [PATCH 1/6] telepathy-qt5: update to 0.9.8.

---
 common/shlibs                  |  2 +-
 srcpkgs/telepathy-qt5/template | 26 +++++---------------------
 2 files changed, 6 insertions(+), 22 deletions(-)

diff --git a/common/shlibs b/common/shlibs
index 499e8f39052d2..e381972cabbf5 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -2238,7 +2238,7 @@ libqt5keychain.so.1 qtkeychain-qt5-0.7.0_1
 libphonon4qt5.so.4 phonon-qt5-4.8.3_1
 libphonon4qt5experimental.so.4 phonon-qt5-4.8.3_1
 libtelepathy-qt5.so.0 telepathy-qt5-0.9.5_1
-libtelepathy-qt5-service.so.0 telepathy-qt5-0.9.7_1
+libtelepathy-qt5-service.so.1 telepathy-qt5-0.9.8_1
 libtelepathy-qt5-farstream.so.0 telepathy-qt5-farstream-0.9.5_1
 libKF5Attica.so.5 attica-5.6.0_1
 liblastfm_fingerprint5.so.1 liblastfm-qt5-1.0.9_1
diff --git a/srcpkgs/telepathy-qt5/template b/srcpkgs/telepathy-qt5/template
index 4ee2a01f76170..a151edc7a329d 100644
--- a/srcpkgs/telepathy-qt5/template
+++ b/srcpkgs/telepathy-qt5/template
@@ -1,43 +1,27 @@
 # Template file for 'telepathy-qt5'
 pkgname=telepathy-qt5
-version=0.9.7
+version=0.9.8
 revision=1
 build_style=cmake
-configure_args="
- -DENABLE_EXAMPLES=OFF
- -DENABLE_TESTS=OFF
- -DDESIRED_QT_VERSION=5
- -DQT_QMAKE_EXECUTABLE=/usr/bin/qmake-qt5"
-hostmakedepends="python pkg-config"
+configure_args="-DENABLE_EXAMPLES=OFF -DENABLE_TESTS=OFF"
+hostmakedepends="python3 pkg-config"
 makedepends="qt5-devel telepathy-farstream-devel telepathy-glib-devel
  gstreamer1-devel libxml2-devel"
 short_desc="Qt5 bindings for the Telepathy D-Bus protocol"
 maintainer="Duncaen <duncaen@voidlinux.org>"
-license="LGPL-2.1"
+license="LGPL-2.1-or-later"
 homepage="http://telepathy.freedesktop.org/"
 distfiles="http://telepathy.freedesktop.org/releases/${pkgname//5/}/${pkgname//5/}-${version}.tar.gz"
-checksum=21bad30be7ebc4ba667d53d92cd1cec1be23114103f2149404d9740721693d4f
+checksum=bf8e2a09060addb80475a4938105b9b41d9e6837999b7a00e5351783857e18ad
 
 if [ -n "$CROSS_BUILD" ]; then
 	hostmakedepends+=" qt5-host-tools qt5-devel"
-	configure_args+=" -DPYTHON_SHORT_VERSION=2.7"
-	configure_args+=" -DPYTHON_LONG_VERSION=2.7.3"
-	configure_args+=" -DPYTHON_SITE_PACKAGES_DIR=${XBPS_CROSS_BASE}/usr/lib/python2.7/site-packages"
-	configure_args+=" -DPYTHON_INCLUDE_PATH=${XBPS_CROSS_BASE}/usr/include/python2.7"
-	configure_args+=" -DCMAKE_PYTHON_LIBRARIES=${XBPS_CROSS_BASE}/usr/lib"
 fi
 
 CXXFLAGS="-D_DEFAULT_SOURCE"
 
 subpackages="telepathy-qt5-farstream telepathy-qt5-devel"
 
-post_extract() {
-	if [ -n "$CROSS_BUILD" ]; then
-		# cmake/FindPythonLibrary.cmake fails when cross compiling
-		sed -i CMakeLists.txt -e "/find_package(PythonLibrary ${REQUIRED_PY} REQUIRED)/d"
-	fi
-}
-
 telepathy-qt5-farstream_package() {
 	short_desc+=" - farstream component"
 	depends="telepathy-qt5>=${version}_${revision}"

From 4749834a1e5b36f106f344d2364ee21d8baccb5b Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 22:44:34 -0400
Subject: [PATCH 2/6] telepathy-farstream: doesn't need python

---
 srcpkgs/telepathy-farstream/template | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/srcpkgs/telepathy-farstream/template b/srcpkgs/telepathy-farstream/template
index de114e7aaec6c..d2b00c26e99c5 100644
--- a/srcpkgs/telepathy-farstream/template
+++ b/srcpkgs/telepathy-farstream/template
@@ -6,13 +6,12 @@ build_style=gnu-configure
 build_helper="gir"
 configure_args="--disable-static $(vopt_enable gir introspection)"
 hostmakedepends="pkg-config intltool libxslt $(vopt_if gir gobject-introspection)"
-makedepends="dbus-glib-devel telepathy-glib-devel farstream-devel
- python-devel vala-devel"
+makedepends="dbus-glib-devel telepathy-glib-devel farstream-devel vala-devel"
 short_desc="Telepathy library that uses Farstream to handle Call channels"
 maintainer="Orphaned <orphan@voidlinux.org>"
 license="LGPL-2.1-or-later"
-homepage="http://telepathy.freedesktop.org"
-distfiles="$homepage/releases/$pkgname/$pkgname-$version.tar.gz"
+homepage="https://telepathy.freedesktop.org"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-farstream/telepathy-farstream-$version.tar.gz"
 checksum=6fa099f22d13a2a49240445a13e918928aef097675d76e5cc9f98ab496087e0a
 replaces="telepathy-farsight>=0"
 

From b9ceb33f60d46a5a1bc95f58d54f32ffc9e598bb Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 23:28:25 -0400
Subject: [PATCH 3/6] telepathy-logger: make codegen work with python3

---
 .../telepathy-logger/patches/python3.patch    | 653 ++++++++++++++++++
 srcpkgs/telepathy-logger/template             |   6 +-
 2 files changed, 654 insertions(+), 5 deletions(-)
 create mode 100644 srcpkgs/telepathy-logger/patches/python3.patch

diff --git a/srcpkgs/telepathy-logger/patches/python3.patch b/srcpkgs/telepathy-logger/patches/python3.patch
new file mode 100644
index 0000000000000..dbafd9cc80218
--- /dev/null
+++ b/srcpkgs/telepathy-logger/patches/python3.patch
@@ -0,0 +1,653 @@
+From f4634b2caf1f92f27a507207ff181d3a7927871f Mon Sep 17 00:00:00 2001
+From: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Date: Thu, 3 Jan 2013 12:33:09 +0000
+Subject: [PATCH] Make the code generation tools work under either Python 2 or
+ 3
+
+They have been verified to produce identical output in _gen.
+
+Bug: https://bugs.freedesktop.org/show_bug.cgi?id=56758
+Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Reviewed-by: Xavier Claessens <xavier.claessens@collabora.co.uk>
+---
+ tools/c-constants-gen.py            | 12 +++---
+ tools/glib-client-gen.py            | 18 +++------
+ tools/glib-client-marshaller-gen.py | 20 +++++-----
+ tools/glib-errors-check-gen.py      | 62 ++++++++++++++---------------
+ tools/glib-errors-str-gen.py        | 14 ++-----
+ tools/glib-ginterface-gen.py        | 22 ++++------
+ tools/glib-gtypes-generator.py      | 14 +++----
+ tools/glib-interfaces-gen.py        | 14 +++----
+ tools/gobject-foo.py                |  2 +-
+ tools/libglibcodegen.py             |  4 +-
+ tools/libtpcodegen.py               | 22 +++++++++-
+ tools/make-version-script.py        | 32 +++++++--------
+ tools/xincludator.py                | 13 ++++--
+ 13 files changed, 129 insertions(+), 120 deletions(-)
+
+diff --git a/tools/c-constants-gen.py b/tools/c-constants-gen.py
+index c7a93d371..a08afee06 100644
+--- a/tools/c-constants-gen.py
++++ b/tools/c-constants-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -12,7 +12,7 @@ def __init__(self, prefix, dom, output_base):
+         self.prefix = prefix + '_'
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+-	self.output_base = output_base
++        self.output_base = output_base
+         self.__header = []
+         self.__docs = []
+ 
+@@ -21,14 +21,14 @@ def __call__(self):
+         self.do_body()
+         self.do_footer()
+ 
+-        file_set_contents(self.output_base + '.h', ''.join(self.__header))
+-        file_set_contents(self.output_base + '-gtk-doc.h', ''.join(self.__docs))
++        file_set_contents(self.output_base + '.h', u('').join(self.__header).encode('utf-8'))
++        file_set_contents(self.output_base + '-gtk-doc.h', u('').join(self.__docs).encode('utf-8'))
+ 
+     def write(self, code):
+-        self.__header.append(code.encode('utf-8'))
++        self.__header.append(code)
+ 
+     def d(self, code):
+-        self.__docs.append(code.encode('utf-8'))
++        self.__docs.append(code)
+ 
+     # Header
+     def do_header(self):
+diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py
+index f8465a62b..e68e1a575 100644
+--- a/tools/glib-client-gen.py
++++ b/tools/glib-client-gen.py
+@@ -27,8 +27,8 @@
+ import xml.dom.minidom
+ from getopt import gnu_getopt
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import Signature, type_to_gtype, \
+         get_docstring, xml_escape, get_deprecated
+ 
+ 
+@@ -74,18 +74,12 @@ def __init__(self, dom, prefix, basename, opts):
+         self.guard = opts.get('--guard', None)
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def get_iface_quark(self):
+@@ -1191,7 +1185,7 @@ def __call__(self):
+         self.b('')
+ 
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         for node in nodes:
+             self.do_interface(node)
+@@ -1244,9 +1238,9 @@ def __call__(self):
+             self.h('#endif /* defined (%s) */' % self.guard)
+             self.h('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '-body.h', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '-body.h', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def types_to_gtypes(types):
+     return [type_to_gtype(t)[1] for t in types]
+diff --git a/tools/glib-client-marshaller-gen.py b/tools/glib-client-marshaller-gen.py
+index cb27d638a..cd9823bdf 100644
+--- a/tools/glib-client-marshaller-gen.py
++++ b/tools/glib-client-marshaller-gen.py
+@@ -31,23 +31,23 @@ def __call__(self):
+         for signal in signals:
+             self.do_signal(signal)
+ 
+-        print 'void'
+-        print '%s_register_dbus_glib_marshallers (void)' % self.prefix
+-        print '{'
++        print('void')
++        print('%s_register_dbus_glib_marshallers (void)' % self.prefix)
++        print('{')
+ 
+-        all = self.marshallers.keys()
++        all = list(self.marshallers.keys())
+         all.sort()
+         for marshaller in all:
+             rhs = self.marshallers[marshaller]
+ 
+-            print '  dbus_g_object_register_marshaller ('
+-            print '      g_cclosure_marshal_generic,'
+-            print '      G_TYPE_NONE,       /* return */'
++            print('  dbus_g_object_register_marshaller (')
++            print('      g_cclosure_marshal_generic,')
++            print('      G_TYPE_NONE,       /* return */')
+             for type in rhs:
+-                print '      G_TYPE_%s,' % type.replace('VOID', 'NONE')
+-            print '      G_TYPE_INVALID);'
++                print('      G_TYPE_%s,' % type.replace('VOID', 'NONE'))
++            print('      G_TYPE_INVALID);')
+ 
+-        print '}'
++        print('}')
+ 
+ 
+ def types_to_gtypes(types):
+diff --git a/tools/glib-errors-check-gen.py b/tools/glib-errors-check-gen.py
+index 553fc9caf..fad261ece 100644
+--- a/tools/glib-errors-check-gen.py
++++ b/tools/glib-errors-check-gen.py
+@@ -12,13 +12,13 @@ def __init__(self, dom):
+ 
+     def __call__(self):
+ 
+-        print '{'
+-        print '  GEnumClass *klass;'
+-        print '  GEnumValue *value_by_name;'
+-        print '  GEnumValue *value_by_nick;'
+-        print ''
+-        print '  g_type_init ();'
+-        print '  klass = g_type_class_ref (TP_TYPE_ERROR);'
++        print('{')
++        print('  GEnumClass *klass;')
++        print('  GEnumValue *value_by_name;')
++        print('  GEnumValue *value_by_nick;')
++        print('')
++        print('  g_type_init ();')
++        print('  klass = g_type_class_ref (TP_TYPE_ERROR);')
+ 
+         for error in self.errors.getElementsByTagNameNS(NS_TP, 'error'):
+             ns = error.parentNode.getAttribute('namespace')
+@@ -28,30 +28,30 @@ def __call__(self):
+             s = ('TP_ERROR_STR_' +
+                  error.getAttribute('name').replace(' ', '_').replace('.', '_').upper())
+ 
+-            print ''
+-            print '  /* %s.%s */' % (ns, nick)
+-            print ('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
+-                    % enum)
+-            print ('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
+-                    % nick)
+-            print ('  g_assert (value_by_name != NULL);')
+-            print ('  g_assert (value_by_nick != NULL);')
+-            print ('  g_assert_cmpint (value_by_name->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpint (value_by_nick->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
+-                    % (s, nick))
+-
+-        print '}'
++            print('')
++            print('  /* %s.%s */' % (ns, nick))
++            print('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
++                   % enum)
++            print('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
++                   % nick)
++            print('  g_assert (value_by_name != NULL);')
++            print('  g_assert (value_by_nick != NULL);')
++            print('  g_assert_cmpint (value_by_name->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpint (value_by_nick->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
++                   % (s, nick))
++
++        print('}')
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-errors-str-gen.py b/tools/glib-errors-str-gen.py
+index b2cf520bd..ddb1e16b7 100644
+--- a/tools/glib-errors-str-gen.py
++++ b/tools/glib-errors-str-gen.py
+@@ -3,7 +3,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, xml_escape
+ 
+ class Generator(object):
+@@ -17,18 +17,12 @@ def __init__(self, dom, basename):
+         self.__docs = []
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def __call__(self):
+@@ -72,9 +66,9 @@ def __call__(self):
+         self.h('')
+         self.b('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-ginterface-gen.py b/tools/glib-ginterface-gen.py
+index 6fec0d3c4..c0ce20ddc 100644
+--- a/tools/glib-ginterface-gen.py
++++ b/tools/glib-ginterface-gen.py
+@@ -26,8 +26,8 @@
+ import os.path
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import Signature, type_to_gtype, \
+         NS_TP, dbus_gutils_wincaps_to_uscore
+ 
+ 
+@@ -85,18 +85,12 @@ def __init__(self, dom, prefix, basename, signal_marshal_prefix,
+         self.allow_havoc = allow_havoc
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def do_node(self, node):
+@@ -733,7 +727,7 @@ def have_properties(self, nodes):
+ 
+     def __call__(self):
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         self.h('#include <glib-object.h>')
+         self.h('#include <dbus/dbus-glib.h>')
+@@ -761,12 +755,12 @@ def __call__(self):
+ 
+         self.h('')
+         self.b('')
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def cmdline_error():
+-    print """\
++    print("""\
+ usage:
+     gen-ginterface [OPTIONS] xmlfile Prefix_
+ options:
+@@ -786,7 +780,7 @@ def cmdline_error():
+             void symbol (DBusGMethodInvocation *context)
+         and return some sort of "not implemented" error via
+             dbus_g_method_return_error (context, ...)
+-"""
++""")
+     sys.exit(1)
+ 
+ 
+diff --git a/tools/glib-gtypes-generator.py b/tools/glib-gtypes-generator.py
+index 21dfc6aa7..1477bd37b 100644
+--- a/tools/glib-gtypes-generator.py
++++ b/tools/glib-gtypes-generator.py
+@@ -23,7 +23,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import escape_as_identifier, \
+                            get_docstring, \
+                            NS_TP, \
+@@ -68,13 +68,13 @@ def __init__(self, dom, output, mixed_case_prefix):
+         self.need_other_arrays = {}
+ 
+     def h(self, code):
+-        self.header.append(code.encode("utf-8"))
++        self.header.append(code)
+ 
+     def c(self, code):
+-        self.body.append(code.encode("utf-8"))
++        self.body.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def do_mapping_header(self, mapping):
+         members = mapping.getElementsByTagNameNS(NS_TP, 'member')
+@@ -292,9 +292,9 @@ def __call__(self):
+             self.c('  return t;\n')
+             self.c('}\n\n')
+ 
+-        file_set_contents(self.output + '.h', ''.join(self.header))
+-        file_set_contents(self.output + '-body.h', ''.join(self.body))
+-        file_set_contents(self.output + '-gtk-doc.h', ''.join(self.docs))
++        file_set_contents(self.output + '.h', u('').join(self.header).encode('utf-8'))
++        file_set_contents(self.output + '-body.h', u('').join(self.body).encode('utf-8'))
++        file_set_contents(self.output + '-gtk-doc.h', u('').join(self.docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-interfaces-gen.py b/tools/glib-interfaces-gen.py
+index 410762cde..b67d7b4f0 100644
+--- a/tools/glib-interfaces-gen.py
++++ b/tools/glib-interfaces-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -24,22 +24,22 @@ def __init__(self, prefix, implfile, declfile, dom):
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+     def h(self, code):
+-        self.decls.append(code.encode('utf-8'))
++        self.decls.append(code)
+ 
+     def c(self, code):
+-        self.impls.append(code.encode('utf-8'))
++        self.impls.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def __call__(self):
+         for f in self.h, self.c:
+             self.do_header(f)
+         self.do_body()
+ 
+-        file_set_contents(self.implfile, ''.join(self.impls))
+-        file_set_contents(self.declfile, ''.join(self.decls))
+-        file_set_contents(self.docfile, ''.join(self.docs))
++        file_set_contents(self.implfile, u('').join(self.impls).encode('utf-8'))
++        file_set_contents(self.declfile, u('').join(self.decls).encode('utf-8'))
++        file_set_contents(self.docfile, u('').join(self.docs).encode('utf-8'))
+ 
+     # Header
+     def do_header(self, f):
+diff --git a/tools/gobject-foo.py b/tools/gobject-foo.py
+index 002a290ba..a2abd7667 100644
+--- a/tools/gobject-foo.py
++++ b/tools/gobject-foo.py
+@@ -87,4 +87,4 @@ def gobject_header(head, tail, as_interface=False):
+ 
+     head, tail = argv
+ 
+-    print '\n'.join(gobject_header(head, tail, as_interface=as_interface))
++    print('\n'.join(gobject_header(head, tail, as_interface=as_interface)))
+diff --git a/tools/libglibcodegen.py b/tools/libglibcodegen.py
+index 6a9d21485..6cd1a6277 100644
+--- a/tools/libglibcodegen.py
++++ b/tools/libglibcodegen.py
+@@ -154,7 +154,7 @@ def type_to_gtype(s):
+         return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False)
+     elif s[:2] == 'a{':  #some arbitrary hash tables
+         if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'):
+-            raise Exception, "can't index a hashtable off non-basic type " + s
++            raise Exception("can't index a hashtable off non-basic type " + s)
+         first = type_to_gtype(s[2])
+         second = type_to_gtype(s[3:-1])
+         return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False)
+@@ -169,4 +169,4 @@ def type_to_gtype(s):
+         return ("GValueArray *", gtype, "BOXED", True)
+ 
+     # we just don't know ..
+-    raise Exception, "don't know the GType for " + s
++    raise Exception("don't know the GType for " + s)
+diff --git a/tools/libtpcodegen.py b/tools/libtpcodegen.py
+index 7e9eb9a50..99de66340 100644
+--- a/tools/libtpcodegen.py
++++ b/tools/libtpcodegen.py
+@@ -21,6 +21,7 @@
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ 
+ import os
++import sys
+ from string import ascii_letters, digits
+ 
+ 
+@@ -28,6 +29,20 @@
+ 
+ _ASCII_ALNUM = ascii_letters + digits
+ 
++if sys.version_info[0] >= 3:
++    def u(s):
++        """Return s, which must be a str literal with no non-ASCII characters.
++        This is like a more restricted form of the Python 2 u'' syntax.
++        """
++        return s.encode('ascii').decode('ascii')
++else:
++    def u(s):
++        """Return a Unicode version of s, which must be a str literal
++        (a bytestring) in which each byte is an ASCII character.
++        This is like a more restricted form of the u'' syntax.
++        """
++        return s.decode('ascii')
++
+ def file_set_contents(filename, contents):
+     try:
+         os.remove(filename)
+@@ -38,13 +53,15 @@ def file_set_contents(filename, contents):
+     except OSError:
+         pass
+ 
+-    open(filename + '.tmp', 'w').write(contents)
++    open(filename + '.tmp', 'wb').write(contents)
+     os.rename(filename + '.tmp', filename)
+ 
+ def cmp_by_name(node1, node2):
+     return cmp(node1.getAttributeNode("name").nodeValue,
+                node2.getAttributeNode("name").nodeValue)
+ 
++def key_by_name(node):
++    return node.getAttributeNode("name").nodeValue
+ 
+ def escape_as_identifier(identifier):
+     """Escape the given string to be a valid D-Bus object path or service
+@@ -168,6 +185,9 @@ def __init__(self, string):
+         self.remaining = string
+ 
+     def next(self):
++        return self.__next__()
++
++    def __next__(self):
+         if self.remaining == '':
+             raise StopIteration
+ 
+diff --git a/tools/make-version-script.py b/tools/make-version-script.py
+index 0d30aa323..4ced849fe 100644
+--- a/tools/make-version-script.py
++++ b/tools/make-version-script.py
+@@ -63,9 +63,9 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+     if dpkg:
+         assert dpkg_first_line is not None
+-        print dpkg_first_line
++        print(dpkg_first_line)
+         if dpkg_build_depends_package is not None:
+-            print "* Build-Depends-Package: %s" % dpkg_build_depends_package
++            print("* Build-Depends-Package: %s" % dpkg_build_depends_package)
+ 
+     for filename in abifiles:
+         lines = open(filename, 'r').readlines()
+@@ -120,8 +120,8 @@ def main(abifiles, symbols=None, unreleased_version=None,
+         lines = lines[cut:]
+ 
+         if gnuld:
+-            print "%s {" % version
+-            print "    global:"
++            print("%s {" % version)
++            print("    global:")
+ 
+         for symbol in lines:
+             symbol = symbol.strip()
+@@ -130,7 +130,7 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 continue
+ 
+             if gnuld:
+-                print "        %s;" % symbol
++                print("        %s;" % symbol)
+             elif dpkg:
+                 dpkg_symbols.append('%s@%s %s' % (symbol, version, release))
+ 
+@@ -142,22 +142,22 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+         if gnuld:
+             if extends == '-':
+-                print "    local:"
+-                print "        *;"
+-                print "};"
++                print("    local:")
++                print("        *;")
++                print("};")
+             else:
+-                print "} %s;" % extends
+-                print
++                print("} %s;" % extends)
++                print("")
+ 
+     if dpkg:
+         dpkg_symbols.sort()
+         dpkg_versions.sort()
+ 
+         for x in dpkg_versions:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+         for x in dpkg_symbols:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+     if symbol_set is not None:
+         missing = versioned_symbols - symbol_set
+@@ -182,13 +182,13 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 raise SystemExit(1)
+ 
+             if gnuld:
+-                print "%s {" % unreleased_version
+-                print "    global:"
++                print("%s {" % unreleased_version)
++                print("    global:")
+ 
+                 for symbol in unreleased:
+-                    print "        %s;" % symbol
++                    print("        %s;" % symbol)
+ 
+-                print "} %s;" % version
++                print("} %s;" % version)
+ 
+ 
+ if __name__ == '__main__':
+diff --git a/tools/xincludator.py b/tools/xincludator.py
+index 63e106ace..f9ed49ce4 100644
+--- a/tools/xincludator.py
++++ b/tools/xincludator.py
+@@ -1,17 +1,19 @@
+ #!/usr/bin/python
+ 
++import sys
+ from sys import argv, stdout, stderr
+ import codecs, locale
+ import os
+ import xml.dom.minidom
+ 
+-stdout = codecs.getwriter('utf-8')(stdout)
++if sys.version_info[0] < 3:
++    stdout = codecs.getwriter('utf-8')(stdout)
+ 
+ NS_XI = 'http://www.w3.org/2001/XInclude'
+ 
+ def xincludate(dom, base, dropns = []):
+     remove_attrs = []
+-    for i in xrange(dom.documentElement.attributes.length):
++    for i in range(dom.documentElement.attributes.length):
+         attr = dom.documentElement.attributes.item(i)
+         if attr.prefix == 'xmlns':
+             if attr.localName in dropns:
+@@ -34,6 +36,11 @@ def xincludate(dom, base, dropns = []):
+     argv = argv[1:]
+     dom = xml.dom.minidom.parse(argv[0])
+     xincludate(dom, argv[0])
+-    xml = dom.toxml()
++
++    if sys.version_info[0] >= 3:
++        xml = dom.toxml(encoding=None)
++    else:
++        xml = dom.toxml()
++
+     stdout.write(xml)
+     stdout.write('\n')
diff --git a/srcpkgs/telepathy-logger/template b/srcpkgs/telepathy-logger/template
index 528a561804b48..fd126f9108ffb 100644
--- a/srcpkgs/telepathy-logger/template
+++ b/srcpkgs/telepathy-logger/template
@@ -5,7 +5,7 @@ revision=3
 build_style=gnu-configure
 build_helper="gir"
 configure_args="--disable-static --disable-schemas-compile $(vopt_enable gir introspection)"
-hostmakedepends="pkg-config intltool libxslt glib-devel python $(vopt_if gir gobject-introspection)"
+hostmakedepends="pkg-config intltool libxslt glib-devel python3 $(vopt_if gir gobject-introspection)"
 makedepends="dbus-glib-devel libxml2-devel sqlite-devel telepathy-glib-devel"
 short_desc="Telepathy framework logging daemon"
 maintainer="Orphaned <orphan@voidlinux.org>"
@@ -18,10 +18,6 @@ checksum=8fcad534d653b1b365132c5b158adae947810ffbae9843f72dd1797966415dae
 build_options="gir"
 build_options_default="gir"
 
-pre_configure() {
-	export PYTHON=python2
-}
-
 telepathy-logger-devel_package() {
 	depends="libxml2-devel telepathy-glib-devel ${sourcepkg}-${version}_${revision}"
 	short_desc+=" - development files"

From 816207e1ce90d3f90d5fb8e54ac6ab9d68da69ed Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 23:34:58 -0400
Subject: [PATCH 4/6] telepathy-haze: update to 0.8.1.

---
 .../patches/purple-2.0.12.patch               | 25 -------------------
 srcpkgs/telepathy-haze/template               | 12 ++++-----
 2 files changed, 6 insertions(+), 31 deletions(-)
 delete mode 100644 srcpkgs/telepathy-haze/patches/purple-2.0.12.patch

diff --git a/srcpkgs/telepathy-haze/patches/purple-2.0.12.patch b/srcpkgs/telepathy-haze/patches/purple-2.0.12.patch
deleted file mode 100644
index 3558e53abdbd5..0000000000000
--- a/srcpkgs/telepathy-haze/patches/purple-2.0.12.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Koop Mast <kwm freebsd org>
-Date: Mon, 11 Jan 2016 11:53:23 +0100
-Subject: Fix the build with libpurple 2.0.12
-
-http://pidgin.im/pipermail/devel/2015-March/023639.html
-Replaces the old emu with the _PASSIVE.
-
-Origin: vendor, FreeBSD, https://lists.freebsd.org/pipermail/svn-ports-head/2016-January/111612.html
----
- src/media-stream.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/media-stream.c b/src/media-stream.c
-index 7b4f29f..da088d1 100644
---- a/src/media-stream.c
-+++ b/src/media-stream.c
-@@ -1076,7 +1076,7 @@ haze_media_stream_new_native_candidate (TpSvcMediaStreamHandler *iface,
-       if (proto == TP_MEDIA_STREAM_BASE_PROTO_UDP)
-         protocol = PURPLE_MEDIA_NETWORK_PROTOCOL_UDP;
-       else if (proto == TP_MEDIA_STREAM_BASE_PROTO_TCP)
--        protocol = PURPLE_MEDIA_NETWORK_PROTOCOL_TCP;
-+        protocol = PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_PASSIVE;
-       else
-         DEBUG ("Unknown network protocol");
- 
diff --git a/srcpkgs/telepathy-haze/template b/srcpkgs/telepathy-haze/template
index 60b65b83eced4..938f651d083b8 100644
--- a/srcpkgs/telepathy-haze/template
+++ b/srcpkgs/telepathy-haze/template
@@ -1,13 +1,13 @@
 # Template file for 'telepathy-haze'
 pkgname=telepathy-haze
-version=0.8.0
-revision=2
+version=0.8.1
+revision=1
 build_style=gnu-configure
-hostmakedepends="pkg-config python libxslt glib-devel"
+hostmakedepends="pkg-config python3 libxslt glib-devel"
 makedepends="glib-devel libpurple-devel telepathy-glib-devel"
 short_desc="Backend for telepathy to use libpurple (Pidgin) protocols"
 maintainer="Orphaned <orphan@voidlinux.org>"
 license="GPL-2.0-or-later"
-homepage="http://telepathy.freedesktop.org"
-distfiles="${homepage}/releases/$pkgname/$pkgname-$version.tar.gz"
-checksum=3e76049c05f2cd5900c5c0c1cfebdf7ae79eec987a599f1090946673c5b8f9c9
+homepage="https://telepathy.freedesktop.org"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-haze/telepathy-haze-$version.tar.gz"
+checksum=704befa42eec2173eca4bac01ffd004014665f2bad46dc8948e5423364cde30a

From 6696b4775c04d0d3bbaf5a6cd7c9bba8c97ffbd1 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sun, 8 Oct 2023 00:15:59 -0400
Subject: [PATCH 5/6] telepathy-salut: make codegen work with python3

---
 srcpkgs/telepathy-salut/patches/python3.patch | 97 +++++++++++++++++++
 srcpkgs/telepathy-salut/template              | 11 +--
 2 files changed, 102 insertions(+), 6 deletions(-)
 create mode 100644 srcpkgs/telepathy-salut/patches/python3.patch

diff --git a/srcpkgs/telepathy-salut/patches/python3.patch b/srcpkgs/telepathy-salut/patches/python3.patch
new file mode 100644
index 0000000000000..fa6fb6253c466
--- /dev/null
+++ b/srcpkgs/telepathy-salut/patches/python3.patch
@@ -0,0 +1,97 @@
+--- a/tools/libglibcodegen.py
++++ b/tools/libglibcodegen.py
+@@ -55,9 +55,8 @@
+     return camelcase_to_lower(s).upper()
+ 
+ 
+-def cmp_by_name(node1, node2):
+-    return cmp(node1.getAttributeNode("name").nodeValue,
+-               node2.getAttributeNode("name").nodeValue)
++def key_by_name(node):
++    return node.getAttributeNode("name").nodeValue
+ 
+ 
+ def dbus_gutils_wincaps_to_uscore(s):
+@@ -191,6 +191,9 @@
+         self.remaining = string
+ 
+     def next(self):
++        return self.__next__()
++
++    def __next__(self):
+         if self.remaining == '':
+             raise StopIteration
+ 
+@@ -297,7 +297,7 @@
+         return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False)
+     elif s[:2] == 'a{':  #some arbitrary hash tables
+         if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'):
+-            raise Exception, "can't index a hashtable off non-basic type " + s
++            raise Exception("can't index a hashtable off non-basic type " + s)
+         first = type_to_gtype(s[2])
+         second = type_to_gtype(s[3:-1])
+         return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False)
+@@ -312,7 +312,7 @@
+         return ("GValueArray *", gtype, "BOXED", True)
+ 
+     # we just don't know ..
+-    raise Exception, "don't know the GType for " + s
++    raise Exception("don't know the GType for " + s)
+ 
+ 
+ def xml_escape(s):
+--- a/tools/glib-signals-marshal-gen.py
++++ b/tools/glib-signals-marshal-gen.py
+@@ -41,12 +41,12 @@
+         for signal in signals:
+             self.do_signal(signal)
+ 
+-        all = self.marshallers.keys()
++        all = list(self.marshallers.keys())
+         all.sort()
+         for marshaller in all:
+             rhs = self.marshallers[marshaller]
+             if not marshaller.startswith('g_cclosure'):
+-                print 'VOID:' + ','.join(rhs)
++                print('VOID:' + ','.join(rhs))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+--- a/tools/glib-ginterface-gen.py
++++ b/tools/glib-ginterface-gen.py
+@@ -26,7 +26,7 @@
+ import os.path
+ import xml.dom.minidom
+ 
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libglibcodegen import Signature, type_to_gtype, key_by_name, \
+         camelcase_to_lower, NS_TP, dbus_gutils_wincaps_to_uscore, \
+         signal_to_marshal_name, method_to_glue_marshal_name
+ 
+@@ -620,7 +620,7 @@
+         self.b('')
+ 
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         for node in nodes:
+             self.do_node(node)
+@@ -639,7 +639,7 @@
+ 
+ 
+ def cmdline_error():
+-    print """\
++    print("""\
+ usage:
+     gen-ginterface [OPTIONS] xmlfile Prefix_
+ options:
+@@ -659,7 +659,7 @@
+             void symbol (DBusGMethodInvocation *context)
+         and return some sort of "not implemented" error via
+             dbus_g_method_return_error (context, ...)
+-"""
++""")
+     sys.exit(1)
+ 
+ 
diff --git a/srcpkgs/telepathy-salut/template b/srcpkgs/telepathy-salut/template
index 8c3d2dace29ae..badc020f1b697 100644
--- a/srcpkgs/telepathy-salut/template
+++ b/srcpkgs/telepathy-salut/template
@@ -2,19 +2,18 @@
 pkgname=telepathy-salut
 version=0.8.1
 revision=20
-lib32disabled=yes
 build_style=gnu-configure
 configure_args="--disable-tests --disable-plugins --with-tls=gnutls
  --disable-avahi-tests --disable-static"
-hostmakedepends="pkg-config python xmldiff glib-devel"
+hostmakedepends="pkg-config python3 xmldiff glib-devel"
 makedepends="glib-devel avahi-glib-libs-devel libsoup-devel telepathy-glib-devel
  gnutls-devel libuuid-devel sqlite-devel"
 depends="avahi"
 short_desc="Link-local XMPP connection manager for Telepathy"
 maintainer="Orphaned <orphan@voidlinux.org>"
-homepage="http://telepathy.freedesktop.org"
 license="LGPL-2.1-or-later"
-distfiles="http://telepathy.freedesktop.org/releases/$pkgname/$pkgname-$version.tar.gz"
+homepage="https://telepathy.freedesktop.org"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-salut/telepathy-salut-$version.tar.gz"
 checksum=70b9108ac8b511b7688e1b580de4ddb8981603c3cbde01f287ef8f9cb708618e
-
-nocross="http://build.voidlinux.org/builders/armv7l_builder/builds/16213/steps/shell_3/logs/stdio"
+lib32disabled=yes
+nocross="can't find wocky.h"

From 68081b7bebc6941fae06e75ad0a456071857cb30 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sun, 8 Oct 2023 00:51:15 -0400
Subject: [PATCH 6/6] telepathy-gabble: patch for python3

---
 .../telepathy-gabble/patches/python3.patch    | 871 ++++++++++++++++++
 srcpkgs/telepathy-gabble/template             |   8 +-
 2 files changed, 875 insertions(+), 4 deletions(-)
 create mode 100644 srcpkgs/telepathy-gabble/patches/python3.patch

diff --git a/srcpkgs/telepathy-gabble/patches/python3.patch b/srcpkgs/telepathy-gabble/patches/python3.patch
new file mode 100644
index 0000000000000..205c9940a58fe
--- /dev/null
+++ b/srcpkgs/telepathy-gabble/patches/python3.patch
@@ -0,0 +1,871 @@
+From 1aeffdb74a1d7ce8b93587ded4f5a434cd1dfc06 Mon Sep 17 00:00:00 2001
+From: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Date: Fri, 1 Nov 2013 14:12:06 +0000
+Subject: [PATCH] Update Python tools from telepathy-glib (avoid deprecations,
+ etc.)
+
+Bug: https://bugs.freedesktop.org/show_bug.cgi?id=26609
+Reviewed-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+---
+ tools/c-constants-gen.py            | 12 ++--
+ tools/glib-client-gen.py            | 94 +++++++----------------------
+ tools/glib-client-marshaller-gen.py | 20 +++---
+ tools/glib-errors-check-gen.py      | 62 +++++++++----------
+ tools/glib-errors-str-gen.py        | 14 ++---
+ tools/glib-ginterface-gen.py        | 22 +++----
+ tools/glib-gtypes-generator.py      | 14 ++---
+ tools/glib-interfaces-gen.py        | 14 ++---
+ tools/gobject-foo.py                |  2 +-
+ tools/libglibcodegen.py             | 27 ++++++++-
+ tools/libtpcodegen.py               | 22 ++++++-
+ tools/make-version-script.py        | 32 +++++-----
+ tools/xincludator.py                | 13 +++-
+ 13 files changed, 167 insertions(+), 181 deletions(-)
+
+diff --git a/tools/c-constants-gen.py b/tools/c-constants-gen.py
+index c7a93d371..a08afee06 100644
+--- a/tools/c-constants-gen.py
++++ b/tools/c-constants-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -12,7 +12,7 @@ def __init__(self, prefix, dom, output_base):
+         self.prefix = prefix + '_'
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+-	self.output_base = output_base
++        self.output_base = output_base
+         self.__header = []
+         self.__docs = []
+ 
+@@ -21,14 +21,14 @@ def __call__(self):
+         self.do_body()
+         self.do_footer()
+ 
+-        file_set_contents(self.output_base + '.h', ''.join(self.__header))
+-        file_set_contents(self.output_base + '-gtk-doc.h', ''.join(self.__docs))
++        file_set_contents(self.output_base + '.h', u('').join(self.__header).encode('utf-8'))
++        file_set_contents(self.output_base + '-gtk-doc.h', u('').join(self.__docs).encode('utf-8'))
+ 
+     def write(self, code):
+-        self.__header.append(code.encode('utf-8'))
++        self.__header.append(code)
+ 
+     def d(self, code):
+-        self.__docs.append(code.encode('utf-8'))
++        self.__docs.append(code)
+ 
+     # Header
+     def do_header(self):
+diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py
+index f8465a62b..a0fecf083 100644
+--- a/tools/glib-client-gen.py
++++ b/tools/glib-client-gen.py
+@@ -27,9 +27,9 @@
+ import xml.dom.minidom
+ from getopt import gnu_getopt
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
+-        get_docstring, xml_escape, get_deprecated
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import (Signature, type_to_gtype,
++        get_docstring, xml_escape, get_deprecated, copy_into_gvalue)
+ 
+ 
+ NS_TP = "http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"
+@@ -74,18 +74,12 @@ def __init__(self, dom, prefix, basename, opts):
+         self.guard = opts.get('--guard', None)
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def get_iface_quark(self):
+@@ -192,6 +186,7 @@ def do_signal(self, iface, signal):
+ 
+             self.b('    TpProxySignalConnection *sc)')
+             self.b('{')
++            self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+             self.b('  GValueArray *args = g_value_array_new (%d);' % len(args))
+             self.b('  GValue blank = { 0 };')
+             self.b('  guint i;')
+@@ -200,6 +195,7 @@ def do_signal(self, iface, signal):
+             self.b('')
+             self.b('  for (i = 0; i < %d; i++)' % len(args))
+             self.b('    g_value_array_append (args, &blank);')
++            self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+             self.b('')
+ 
+             for i, arg in enumerate(args):
+@@ -209,36 +205,8 @@ def do_signal(self, iface, signal):
+                 self.b('  g_value_unset (args->values + %d);' % i)
+                 self.b('  g_value_init (args->values + %d, %s);' % (i, gtype))
+ 
+-                if gtype == 'G_TYPE_STRING':
+-                    self.b('  g_value_set_string (args->values + %d, %s);'
+-                           % (i, name))
+-                elif marshaller == 'BOXED':
+-                    self.b('  g_value_set_boxed (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_UCHAR':
+-                    self.b('  g_value_set_uchar (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_BOOLEAN':
+-                    self.b('  g_value_set_boolean (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_INT':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_UINT':
+-                    self.b('  g_value_set_uint (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_INT64':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_UINT64':
+-                    self.b('  g_value_set_uint64 (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_DOUBLE':
+-                    self.b('  g_value_set_double (args->values + %d, %s);'
+-                           % (i, name))
+-                else:
+-                    assert False, ("Don't know how to put %s in a GValue"
+-                                   % gtype)
++                self.b('  ' + copy_into_gvalue('args->values + %d' % i,
++                    gtype, marshaller, name))
+                 self.b('')
+ 
+             self.b('  tp_proxy_signal_connection_v0_take_results (sc, args);')
+@@ -288,12 +256,14 @@ def do_signal(self, iface, signal):
+         self.b('      weak_object);')
+         self.b('')
+ 
++        self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+         if len(args) > 0:
+             self.b('  g_value_array_free (args);')
+         else:
+             self.b('  if (args != NULL)')
+             self.b('    g_value_array_free (args);')
+             self.b('')
++        self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+         self.b('  g_object_unref (tpproxy);')
+         self.b('}')
+@@ -559,11 +529,13 @@ def do_method(self, iface, method):
+             self.b('      return;')
+             self.b('    }')
+             self.b('')
++            self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+             self.b('  args = g_value_array_new (%d);' % len(out_args))
+             self.b('  g_value_init (&blank, G_TYPE_INT);')
+             self.b('')
+             self.b('  for (i = 0; i < %d; i++)' % len(out_args))
+             self.b('    g_value_array_append (args, &blank);')
++            self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+             for i, arg in enumerate(out_args):
+                 name, info, tp_type, elt = arg
+@@ -573,36 +545,8 @@ def do_method(self, iface, method):
+                 self.b('  g_value_unset (args->values + %d);' % i)
+                 self.b('  g_value_init (args->values + %d, %s);' % (i, gtype))
+ 
+-                if gtype == 'G_TYPE_STRING':
+-                    self.b('  g_value_take_string (args->values + %d, %s);'
+-                           % (i, name))
+-                elif marshaller == 'BOXED':
+-                    self.b('  g_value_take_boxed (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_UCHAR':
+-                    self.b('  g_value_set_uchar (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_BOOLEAN':
+-                    self.b('  g_value_set_boolean (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_INT':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_UINT':
+-                    self.b('  g_value_set_uint (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_INT64':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_UINT64':
+-                    self.b('  g_value_set_uint (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_DOUBLE':
+-                    self.b('  g_value_set_double (args->values + %d, %s);'
+-                            % (i, name))
+-                else:
+-                    assert False, ("Don't know how to put %s in a GValue"
+-                                   % gtype)
++                self.b('  ' + copy_into_gvalue('args->values + %d' % i,
++                    gtype, marshaller, name))
+ 
+             self.b('  tp_proxy_pending_call_v0_take_results (user_data, '
+                    'NULL, args);')
+@@ -671,11 +615,13 @@ def do_method(self, iface, method):
+         self.b('      error, user_data, weak_object);')
+         self.b('')
+ 
++        self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+         if len(out_args) > 0:
+             self.b('  g_value_array_free (args);')
+         else:
+             self.b('  if (args != NULL)')
+             self.b('    g_value_array_free (args);')
++        self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+         self.b('}')
+         self.b('')
+@@ -948,11 +894,13 @@ def do_method_reentrant(self, method, iface_lc, member, member_lc, in_args,
+ 
+             self.b('')
+ 
++        self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+         if len(out_args) > 0:
+             self.b('  g_value_array_free (args);')
+         else:
+             self.b('  if (args != NULL)')
+             self.b('    g_value_array_free (args);')
++        self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+         self.b('}')
+         self.b('')
+@@ -1191,7 +1139,7 @@ def __call__(self):
+         self.b('')
+ 
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         for node in nodes:
+             self.do_interface(node)
+@@ -1244,9 +1192,9 @@ def __call__(self):
+             self.h('#endif /* defined (%s) */' % self.guard)
+             self.h('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '-body.h', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '-body.h', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def types_to_gtypes(types):
+     return [type_to_gtype(t)[1] for t in types]
+diff --git a/tools/glib-client-marshaller-gen.py b/tools/glib-client-marshaller-gen.py
+index cb27d638a..cd9823bdf 100644
+--- a/tools/glib-client-marshaller-gen.py
++++ b/tools/glib-client-marshaller-gen.py
+@@ -31,23 +31,23 @@ def __call__(self):
+         for signal in signals:
+             self.do_signal(signal)
+ 
+-        print 'void'
+-        print '%s_register_dbus_glib_marshallers (void)' % self.prefix
+-        print '{'
++        print('void')
++        print('%s_register_dbus_glib_marshallers (void)' % self.prefix)
++        print('{')
+ 
+-        all = self.marshallers.keys()
++        all = list(self.marshallers.keys())
+         all.sort()
+         for marshaller in all:
+             rhs = self.marshallers[marshaller]
+ 
+-            print '  dbus_g_object_register_marshaller ('
+-            print '      g_cclosure_marshal_generic,'
+-            print '      G_TYPE_NONE,       /* return */'
++            print('  dbus_g_object_register_marshaller (')
++            print('      g_cclosure_marshal_generic,')
++            print('      G_TYPE_NONE,       /* return */')
+             for type in rhs:
+-                print '      G_TYPE_%s,' % type.replace('VOID', 'NONE')
+-            print '      G_TYPE_INVALID);'
++                print('      G_TYPE_%s,' % type.replace('VOID', 'NONE'))
++            print('      G_TYPE_INVALID);')
+ 
+-        print '}'
++        print('}')
+ 
+ 
+ def types_to_gtypes(types):
+diff --git a/tools/glib-errors-check-gen.py b/tools/glib-errors-check-gen.py
+index 553fc9caf..fad261ece 100644
+--- a/tools/glib-errors-check-gen.py
++++ b/tools/glib-errors-check-gen.py
+@@ -12,13 +12,13 @@ def __init__(self, dom):
+ 
+     def __call__(self):
+ 
+-        print '{'
+-        print '  GEnumClass *klass;'
+-        print '  GEnumValue *value_by_name;'
+-        print '  GEnumValue *value_by_nick;'
+-        print ''
+-        print '  g_type_init ();'
+-        print '  klass = g_type_class_ref (TP_TYPE_ERROR);'
++        print('{')
++        print('  GEnumClass *klass;')
++        print('  GEnumValue *value_by_name;')
++        print('  GEnumValue *value_by_nick;')
++        print('')
++        print('  g_type_init ();')
++        print('  klass = g_type_class_ref (TP_TYPE_ERROR);')
+ 
+         for error in self.errors.getElementsByTagNameNS(NS_TP, 'error'):
+             ns = error.parentNode.getAttribute('namespace')
+@@ -28,30 +28,30 @@ def __call__(self):
+             s = ('TP_ERROR_STR_' +
+                  error.getAttribute('name').replace(' ', '_').replace('.', '_').upper())
+ 
+-            print ''
+-            print '  /* %s.%s */' % (ns, nick)
+-            print ('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
+-                    % enum)
+-            print ('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
+-                    % nick)
+-            print ('  g_assert (value_by_name != NULL);')
+-            print ('  g_assert (value_by_nick != NULL);')
+-            print ('  g_assert_cmpint (value_by_name->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpint (value_by_nick->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
+-                    % (s, nick))
+-
+-        print '}'
++            print('')
++            print('  /* %s.%s */' % (ns, nick))
++            print('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
++                   % enum)
++            print('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
++                   % nick)
++            print('  g_assert (value_by_name != NULL);')
++            print('  g_assert (value_by_nick != NULL);')
++            print('  g_assert_cmpint (value_by_name->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpint (value_by_nick->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
++                   % (s, nick))
++
++        print('}')
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-errors-str-gen.py b/tools/glib-errors-str-gen.py
+index b2cf520bd..ddb1e16b7 100644
+--- a/tools/glib-errors-str-gen.py
++++ b/tools/glib-errors-str-gen.py
+@@ -3,7 +3,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, xml_escape
+ 
+ class Generator(object):
+@@ -17,18 +17,12 @@ def __init__(self, dom, basename):
+         self.__docs = []
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def __call__(self):
+@@ -72,9 +66,9 @@ def __call__(self):
+         self.h('')
+         self.b('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-ginterface-gen.py b/tools/glib-ginterface-gen.py
+index 6fec0d3c4..c0ce20ddc 100644
+--- a/tools/glib-ginterface-gen.py
++++ b/tools/glib-ginterface-gen.py
+@@ -26,8 +26,8 @@
+ import os.path
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import Signature, type_to_gtype, \
+         NS_TP, dbus_gutils_wincaps_to_uscore
+ 
+ 
+@@ -85,18 +85,12 @@ def __init__(self, dom, prefix, basename, signal_marshal_prefix,
+         self.allow_havoc = allow_havoc
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def do_node(self, node):
+@@ -733,7 +727,7 @@ def have_properties(self, nodes):
+ 
+     def __call__(self):
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         self.h('#include <glib-object.h>')
+         self.h('#include <dbus/dbus-glib.h>')
+@@ -761,12 +755,12 @@ def __call__(self):
+ 
+         self.h('')
+         self.b('')
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def cmdline_error():
+-    print """\
++    print("""\
+ usage:
+     gen-ginterface [OPTIONS] xmlfile Prefix_
+ options:
+@@ -786,7 +780,7 @@ def cmdline_error():
+             void symbol (DBusGMethodInvocation *context)
+         and return some sort of "not implemented" error via
+             dbus_g_method_return_error (context, ...)
+-"""
++""")
+     sys.exit(1)
+ 
+ 
+diff --git a/tools/glib-gtypes-generator.py b/tools/glib-gtypes-generator.py
+index 21dfc6aa7..1477bd37b 100644
+--- a/tools/glib-gtypes-generator.py
++++ b/tools/glib-gtypes-generator.py
+@@ -23,7 +23,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import escape_as_identifier, \
+                            get_docstring, \
+                            NS_TP, \
+@@ -68,13 +68,13 @@ def __init__(self, dom, output, mixed_case_prefix):
+         self.need_other_arrays = {}
+ 
+     def h(self, code):
+-        self.header.append(code.encode("utf-8"))
++        self.header.append(code)
+ 
+     def c(self, code):
+-        self.body.append(code.encode("utf-8"))
++        self.body.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def do_mapping_header(self, mapping):
+         members = mapping.getElementsByTagNameNS(NS_TP, 'member')
+@@ -292,9 +292,9 @@ def __call__(self):
+             self.c('  return t;\n')
+             self.c('}\n\n')
+ 
+-        file_set_contents(self.output + '.h', ''.join(self.header))
+-        file_set_contents(self.output + '-body.h', ''.join(self.body))
+-        file_set_contents(self.output + '-gtk-doc.h', ''.join(self.docs))
++        file_set_contents(self.output + '.h', u('').join(self.header).encode('utf-8'))
++        file_set_contents(self.output + '-body.h', u('').join(self.body).encode('utf-8'))
++        file_set_contents(self.output + '-gtk-doc.h', u('').join(self.docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-interfaces-gen.py b/tools/glib-interfaces-gen.py
+index 410762cde..b67d7b4f0 100644
+--- a/tools/glib-interfaces-gen.py
++++ b/tools/glib-interfaces-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -24,22 +24,22 @@ def __init__(self, prefix, implfile, declfile, dom):
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+     def h(self, code):
+-        self.decls.append(code.encode('utf-8'))
++        self.decls.append(code)
+ 
+     def c(self, code):
+-        self.impls.append(code.encode('utf-8'))
++        self.impls.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def __call__(self):
+         for f in self.h, self.c:
+             self.do_header(f)
+         self.do_body()
+ 
+-        file_set_contents(self.implfile, ''.join(self.impls))
+-        file_set_contents(self.declfile, ''.join(self.decls))
+-        file_set_contents(self.docfile, ''.join(self.docs))
++        file_set_contents(self.implfile, u('').join(self.impls).encode('utf-8'))
++        file_set_contents(self.declfile, u('').join(self.decls).encode('utf-8'))
++        file_set_contents(self.docfile, u('').join(self.docs).encode('utf-8'))
+ 
+     # Header
+     def do_header(self, f):
+diff --git a/tools/gobject-foo.py b/tools/gobject-foo.py
+index 002a290ba..a2abd7667 100644
+--- a/tools/gobject-foo.py
++++ b/tools/gobject-foo.py
+@@ -87,4 +87,4 @@ def gobject_header(head, tail, as_interface=False):
+ 
+     head, tail = argv
+ 
+-    print '\n'.join(gobject_header(head, tail, as_interface=as_interface))
++    print('\n'.join(gobject_header(head, tail, as_interface=as_interface)))
+diff --git a/tools/libglibcodegen.py b/tools/libglibcodegen.py
+index 6a9d21485..0b703a5a8 100644
+--- a/tools/libglibcodegen.py
++++ b/tools/libglibcodegen.py
+@@ -154,7 +154,7 @@ def type_to_gtype(s):
+         return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False)
+     elif s[:2] == 'a{':  #some arbitrary hash tables
+         if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'):
+-            raise Exception, "can't index a hashtable off non-basic type " + s
++            raise Exception("can't index a hashtable off non-basic type " + s)
+         first = type_to_gtype(s[2])
+         second = type_to_gtype(s[3:-1])
+         return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False)
+@@ -169,4 +169,27 @@ def type_to_gtype(s):
+         return ("GValueArray *", gtype, "BOXED", True)
+ 
+     # we just don't know ..
+-    raise Exception, "don't know the GType for " + s
++    raise Exception("don't know the GType for " + s)
++
++
++def copy_into_gvalue(gvaluep, gtype, marshaller, name):
++    if gtype == 'G_TYPE_STRING':
++        return 'g_value_set_string (%s, %s);' % (gvaluep, name)
++    elif marshaller == 'BOXED':
++        return 'g_value_set_boxed (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_UCHAR':
++        return 'g_value_set_uchar (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_BOOLEAN':
++        return 'g_value_set_boolean (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_INT':
++        return 'g_value_set_int (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_UINT':
++        return 'g_value_set_uint (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_INT64':
++        return 'g_value_set_int (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_UINT64':
++        return 'g_value_set_uint64 (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_DOUBLE':
++        return 'g_value_set_double (%s, %s);' % (gvaluep, name)
++    else:
++        raise AssertionError("Don't know how to put %s in a GValue" % gtype)
+diff --git a/tools/libtpcodegen.py b/tools/libtpcodegen.py
+index 7e9eb9a50..99de66340 100644
+--- a/tools/libtpcodegen.py
++++ b/tools/libtpcodegen.py
+@@ -21,6 +21,7 @@
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ 
+ import os
++import sys
+ from string import ascii_letters, digits
+ 
+ 
+@@ -28,6 +29,20 @@
+ 
+ _ASCII_ALNUM = ascii_letters + digits
+ 
++if sys.version_info[0] >= 3:
++    def u(s):
++        """Return s, which must be a str literal with no non-ASCII characters.
++        This is like a more restricted form of the Python 2 u'' syntax.
++        """
++        return s.encode('ascii').decode('ascii')
++else:
++    def u(s):
++        """Return a Unicode version of s, which must be a str literal
++        (a bytestring) in which each byte is an ASCII character.
++        This is like a more restricted form of the u'' syntax.
++        """
++        return s.decode('ascii')
++
+ def file_set_contents(filename, contents):
+     try:
+         os.remove(filename)
+@@ -38,13 +53,15 @@ def file_set_contents(filename, contents):
+     except OSError:
+         pass
+ 
+-    open(filename + '.tmp', 'w').write(contents)
++    open(filename + '.tmp', 'wb').write(contents)
+     os.rename(filename + '.tmp', filename)
+ 
+ def cmp_by_name(node1, node2):
+     return cmp(node1.getAttributeNode("name").nodeValue,
+                node2.getAttributeNode("name").nodeValue)
+ 
++def key_by_name(node):
++    return node.getAttributeNode("name").nodeValue
+ 
+ def escape_as_identifier(identifier):
+     """Escape the given string to be a valid D-Bus object path or service
+@@ -168,6 +185,9 @@ def __init__(self, string):
+         self.remaining = string
+ 
+     def next(self):
++        return self.__next__()
++
++    def __next__(self):
+         if self.remaining == '':
+             raise StopIteration
+ 
+diff --git a/tools/make-version-script.py b/tools/make-version-script.py
+index 0d30aa323..4ced849fe 100644
+--- a/tools/make-version-script.py
++++ b/tools/make-version-script.py
+@@ -63,9 +63,9 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+     if dpkg:
+         assert dpkg_first_line is not None
+-        print dpkg_first_line
++        print(dpkg_first_line)
+         if dpkg_build_depends_package is not None:
+-            print "* Build-Depends-Package: %s" % dpkg_build_depends_package
++            print("* Build-Depends-Package: %s" % dpkg_build_depends_package)
+ 
+     for filename in abifiles:
+         lines = open(filename, 'r').readlines()
+@@ -120,8 +120,8 @@ def main(abifiles, symbols=None, unreleased_version=None,
+         lines = lines[cut:]
+ 
+         if gnuld:
+-            print "%s {" % version
+-            print "    global:"
++            print("%s {" % version)
++            print("    global:")
+ 
+         for symbol in lines:
+             symbol = symbol.strip()
+@@ -130,7 +130,7 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 continue
+ 
+             if gnuld:
+-                print "        %s;" % symbol
++                print("        %s;" % symbol)
+             elif dpkg:
+                 dpkg_symbols.append('%s@%s %s' % (symbol, version, release))
+ 
+@@ -142,22 +142,22 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+         if gnuld:
+             if extends == '-':
+-                print "    local:"
+-                print "        *;"
+-                print "};"
++                print("    local:")
++                print("        *;")
++                print("};")
+             else:
+-                print "} %s;" % extends
+-                print
++                print("} %s;" % extends)
++                print("")
+ 
+     if dpkg:
+         dpkg_symbols.sort()
+         dpkg_versions.sort()
+ 
+         for x in dpkg_versions:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+         for x in dpkg_symbols:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+     if symbol_set is not None:
+         missing = versioned_symbols - symbol_set
+@@ -182,13 +182,13 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 raise SystemExit(1)
+ 
+             if gnuld:
+-                print "%s {" % unreleased_version
+-                print "    global:"
++                print("%s {" % unreleased_version)
++                print("    global:")
+ 
+                 for symbol in unreleased:
+-                    print "        %s;" % symbol
++                    print("        %s;" % symbol)
+ 
+-                print "} %s;" % version
++                print("} %s;" % version)
+ 
+ 
+ if __name__ == '__main__':
+diff --git a/tools/xincludator.py b/tools/xincludator.py
+index 63e106ace..f9ed49ce4 100644
+--- a/tools/xincludator.py
++++ b/tools/xincludator.py
+@@ -1,17 +1,19 @@
+ #!/usr/bin/python
+ 
++import sys
+ from sys import argv, stdout, stderr
+ import codecs, locale
+ import os
+ import xml.dom.minidom
+ 
+-stdout = codecs.getwriter('utf-8')(stdout)
++if sys.version_info[0] < 3:
++    stdout = codecs.getwriter('utf-8')(stdout)
+ 
+ NS_XI = 'http://www.w3.org/2001/XInclude'
+ 
+ def xincludate(dom, base, dropns = []):
+     remove_attrs = []
+-    for i in xrange(dom.documentElement.attributes.length):
++    for i in range(dom.documentElement.attributes.length):
+         attr = dom.documentElement.attributes.item(i)
+         if attr.prefix == 'xmlns':
+             if attr.localName in dropns:
+@@ -34,6 +36,11 @@ def xincludate(dom, base, dropns = []):
+     argv = argv[1:]
+     dom = xml.dom.minidom.parse(argv[0])
+     xincludate(dom, argv[0])
+-    xml = dom.toxml()
++
++    if sys.version_info[0] >= 3:
++        xml = dom.toxml(encoding=None)
++    else:
++        xml = dom.toxml()
++
+     stdout.write(xml)
+     stdout.write('\n')
+--- a/plugins/telepathy-gabble-xmpp-console
++++ b/plugins/telepathy-gabble-xmpp-console
+@@ -313,12 +313,12 @@
+             CONN_FUTURE_IFACE, None)
+         try:
+             sidecar_path, _ = conn_future_proxy.EnsureSidecar('(s)', CONSOLE_IFACE)
+-        except Exception, e:
+-            print """
++        except Exception as e:
++            print("""
+ Couldn't connect to the XMPP console interface on '%(connection_bus_name)s':
+   %(e)s
+ Check that it's a running Jabber connection, and that you have the console
+-plugin installed.""" % locals()
++plugin installed.""" % locals())
+ 
+             raise SystemExit(2)
+ 
+@@ -357,7 +357,7 @@
+ ACCOUNT_IFACE = 'org.freedesktop.Telepathy.Account'
+ 
+ def usage():
+-    print """
++    print("""
+ Usage:
+ 
+   %(arg0)s gabble/jabber/blahblah
+@@ -367,7 +367,7 @@
+ List connection bus names using `qdbus | grep gabble`.
+ """ % { 'arg0': sys.argv[0],
+         'prefix': GABBLE_PREFIX,
+-      }
++      })
+     raise SystemExit(1)
+ 
+ if __name__ == '__main__':
+@@ -385,7 +385,7 @@
+             ACCOUNT_IFACE, None)
+         path = account_proxy.get_cached_property('Connection').get_string()
+         if path == '/':
+-            print "%s is not online" % thing
++            print("%s is not online" % thing)
+             raise SystemExit(1)
+         else:
+             thing = nameify(path)
diff --git a/srcpkgs/telepathy-gabble/template b/srcpkgs/telepathy-gabble/template
index 2bde648f265c4..b0b1aaed6e1b8 100644
--- a/srcpkgs/telepathy-gabble/template
+++ b/srcpkgs/telepathy-gabble/template
@@ -1,11 +1,11 @@
 # Template file for 'telepathy-gabble'
 pkgname=telepathy-gabble
 version=0.18.4
-revision=3
+revision=4
 build_style=gnu-configure
 configure_args="--with-ca-certificates=/etc/ssl/certs/ca-certificates.crt
  --enable-handle-leak-debug --disable-debug --disable-static"
-hostmakedepends="python pkg-config libxslt"
+hostmakedepends="python3 pkg-config libxslt"
 makedepends="glib-devel dbus-glib-devel libxml2-devel
  sqlite-devel gnutls-devel telepathy-glib-devel libsoup-devel
  libnice-devel ca-certificates"
@@ -14,8 +14,8 @@ short_desc="Jabber/XMPP connection manager for Telepathy"
 maintainer="Orphaned <orphan@voidlinux.org>"
 license="LGPL-2.1-or-later"
 homepage="https://telepathy.freedesktop.org"
-distfiles="$homepage/releases/$pkgname/$pkgname-$version.tar.gz"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-gabble/telepathy-gabble-$version.tar.gz"
 checksum=115c91572c72d4a40f0b25b606167b4f2f09441dc7bf1036ccbb1450f1a4969c
-python_version=2
+python_version=3
 nocross=yes
 lib32disabled=yes

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: telepathy suite: python3ise everything
  2023-10-08  4:54 [PR PATCH] telepathy suite: python3ise everything classabbyamp
@ 2023-10-08 12:56 ` Duncaen
  2023-10-08 18:53 ` classabbyamp
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Duncaen @ 2023-10-08 12:56 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 307 bytes --]

New comment by Duncaen on void-packages repository

https://github.com/void-linux/void-packages/pull/46516#issuecomment-1752021674

Comment:
Only packaged `telepathy-qt5` for use with a package that has been long removed. Looks like the only user of `telepathy-qt5` is `choqok` which also seems kinda dead.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: telepathy suite: python3ise everything
  2023-10-08  4:54 [PR PATCH] telepathy suite: python3ise everything classabbyamp
  2023-10-08 12:56 ` Duncaen
@ 2023-10-08 18:53 ` classabbyamp
  2023-10-08 19:05 ` classabbyamp
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2023-10-08 18:53 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 189 bytes --]

New comment by classabbyamp on void-packages repository

https://github.com/void-linux/void-packages/pull/46516#issuecomment-1752130285

Comment:
The whole telepathy suite seems kinda dead

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: telepathy suite: python3ise everything
  2023-10-08  4:54 [PR PATCH] telepathy suite: python3ise everything classabbyamp
  2023-10-08 12:56 ` Duncaen
  2023-10-08 18:53 ` classabbyamp
@ 2023-10-08 19:05 ` classabbyamp
  2023-10-09 23:36 ` [PR PATCH] [Updated] " classabbyamp
  2023-10-10  0:33 ` [PR PATCH] [Merged]: " classabbyamp
  4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2023-10-08 19:05 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 637 bytes --]

New comment by classabbyamp on void-packages repository

https://github.com/void-linux/void-packages/pull/46516#issuecomment-1752133638

Comment:
```
component        release  commit
rakia            2013     2013
hanging          ?        2015
farstream        2014     2016
logger           2015     2016
nonsense         ?        2018
salut            2012     2018
spec             2019     2019
haze             2020     2020
idle             2020     2020
morse            ?        2020
gabble           2016     2021
glib             2021     2021
mission-control  2020     2021
qt               2019     2022
```

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PR PATCH] [Updated] telepathy suite: python3ise everything
  2023-10-08  4:54 [PR PATCH] telepathy suite: python3ise everything classabbyamp
                   ` (2 preceding siblings ...)
  2023-10-08 19:05 ` classabbyamp
@ 2023-10-09 23:36 ` classabbyamp
  2023-10-10  0:33 ` [PR PATCH] [Merged]: " classabbyamp
  4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2023-10-09 23:36 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 797 bytes --]

There is an updated pull request by classabbyamp against master on the void-packages repository

https://github.com/classabbyamp/void-packages telepathy
https://github.com/void-linux/void-packages/pull/46516

telepathy suite: python3ise everything
- telepathy-qt5: update to 0.9.8.
- telepathy-farstream: doesn't need python
- telepathy-logger: make codegen work with python3
- telepathy-haze: update to 0.8.1.
- telepathy-salut: make codegen work with python3
- telepathy-gabble: patch for python3

<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly** (builds)

cc @duncaen, a couple of these are yours


A patch file from https://github.com/void-linux/void-packages/pull/46516.patch is attached

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-telepathy-46516.patch --]
[-- Type: text/x-diff, Size: 74338 bytes --]

From 41b233fb2a5656e2d33c28468156d91d91a7f829 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 22:38:20 -0400
Subject: [PATCH 1/6] telepathy-qt5: update to 0.9.8.

---
 common/shlibs                  |  2 +-
 srcpkgs/telepathy-qt5/template | 26 +++++---------------------
 2 files changed, 6 insertions(+), 22 deletions(-)

diff --git a/common/shlibs b/common/shlibs
index c2b72edb77cd2..4961a1e52bc62 100644
--- a/common/shlibs
+++ b/common/shlibs
@@ -2238,7 +2238,7 @@ libqt5keychain.so.1 qtkeychain-qt5-0.7.0_1
 libphonon4qt5.so.4 phonon-qt5-4.8.3_1
 libphonon4qt5experimental.so.4 phonon-qt5-4.8.3_1
 libtelepathy-qt5.so.0 telepathy-qt5-0.9.5_1
-libtelepathy-qt5-service.so.0 telepathy-qt5-0.9.7_1
+libtelepathy-qt5-service.so.1 telepathy-qt5-0.9.8_1
 libtelepathy-qt5-farstream.so.0 telepathy-qt5-farstream-0.9.5_1
 libKF5Attica.so.5 attica-5.6.0_1
 liblastfm_fingerprint5.so.1 liblastfm-qt5-1.0.9_1
diff --git a/srcpkgs/telepathy-qt5/template b/srcpkgs/telepathy-qt5/template
index 4ee2a01f76170..a151edc7a329d 100644
--- a/srcpkgs/telepathy-qt5/template
+++ b/srcpkgs/telepathy-qt5/template
@@ -1,43 +1,27 @@
 # Template file for 'telepathy-qt5'
 pkgname=telepathy-qt5
-version=0.9.7
+version=0.9.8
 revision=1
 build_style=cmake
-configure_args="
- -DENABLE_EXAMPLES=OFF
- -DENABLE_TESTS=OFF
- -DDESIRED_QT_VERSION=5
- -DQT_QMAKE_EXECUTABLE=/usr/bin/qmake-qt5"
-hostmakedepends="python pkg-config"
+configure_args="-DENABLE_EXAMPLES=OFF -DENABLE_TESTS=OFF"
+hostmakedepends="python3 pkg-config"
 makedepends="qt5-devel telepathy-farstream-devel telepathy-glib-devel
  gstreamer1-devel libxml2-devel"
 short_desc="Qt5 bindings for the Telepathy D-Bus protocol"
 maintainer="Duncaen <duncaen@voidlinux.org>"
-license="LGPL-2.1"
+license="LGPL-2.1-or-later"
 homepage="http://telepathy.freedesktop.org/"
 distfiles="http://telepathy.freedesktop.org/releases/${pkgname//5/}/${pkgname//5/}-${version}.tar.gz"
-checksum=21bad30be7ebc4ba667d53d92cd1cec1be23114103f2149404d9740721693d4f
+checksum=bf8e2a09060addb80475a4938105b9b41d9e6837999b7a00e5351783857e18ad
 
 if [ -n "$CROSS_BUILD" ]; then
 	hostmakedepends+=" qt5-host-tools qt5-devel"
-	configure_args+=" -DPYTHON_SHORT_VERSION=2.7"
-	configure_args+=" -DPYTHON_LONG_VERSION=2.7.3"
-	configure_args+=" -DPYTHON_SITE_PACKAGES_DIR=${XBPS_CROSS_BASE}/usr/lib/python2.7/site-packages"
-	configure_args+=" -DPYTHON_INCLUDE_PATH=${XBPS_CROSS_BASE}/usr/include/python2.7"
-	configure_args+=" -DCMAKE_PYTHON_LIBRARIES=${XBPS_CROSS_BASE}/usr/lib"
 fi
 
 CXXFLAGS="-D_DEFAULT_SOURCE"
 
 subpackages="telepathy-qt5-farstream telepathy-qt5-devel"
 
-post_extract() {
-	if [ -n "$CROSS_BUILD" ]; then
-		# cmake/FindPythonLibrary.cmake fails when cross compiling
-		sed -i CMakeLists.txt -e "/find_package(PythonLibrary ${REQUIRED_PY} REQUIRED)/d"
-	fi
-}
-
 telepathy-qt5-farstream_package() {
 	short_desc+=" - farstream component"
 	depends="telepathy-qt5>=${version}_${revision}"

From 5be98e121fb4a60e58b98af28e24755a79eb457d Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 22:44:34 -0400
Subject: [PATCH 2/6] telepathy-farstream: doesn't need python

---
 srcpkgs/telepathy-farstream/template | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/srcpkgs/telepathy-farstream/template b/srcpkgs/telepathy-farstream/template
index de114e7aaec6c..d2b00c26e99c5 100644
--- a/srcpkgs/telepathy-farstream/template
+++ b/srcpkgs/telepathy-farstream/template
@@ -6,13 +6,12 @@ build_style=gnu-configure
 build_helper="gir"
 configure_args="--disable-static $(vopt_enable gir introspection)"
 hostmakedepends="pkg-config intltool libxslt $(vopt_if gir gobject-introspection)"
-makedepends="dbus-glib-devel telepathy-glib-devel farstream-devel
- python-devel vala-devel"
+makedepends="dbus-glib-devel telepathy-glib-devel farstream-devel vala-devel"
 short_desc="Telepathy library that uses Farstream to handle Call channels"
 maintainer="Orphaned <orphan@voidlinux.org>"
 license="LGPL-2.1-or-later"
-homepage="http://telepathy.freedesktop.org"
-distfiles="$homepage/releases/$pkgname/$pkgname-$version.tar.gz"
+homepage="https://telepathy.freedesktop.org"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-farstream/telepathy-farstream-$version.tar.gz"
 checksum=6fa099f22d13a2a49240445a13e918928aef097675d76e5cc9f98ab496087e0a
 replaces="telepathy-farsight>=0"
 

From b46f9bfbebc7bba1c484b5cc0c61ac44ed95f9fc Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 23:28:25 -0400
Subject: [PATCH 3/6] telepathy-logger: make codegen work with python3

---
 .../telepathy-logger/patches/python3.patch    | 653 ++++++++++++++++++
 srcpkgs/telepathy-logger/template             |   6 +-
 2 files changed, 654 insertions(+), 5 deletions(-)
 create mode 100644 srcpkgs/telepathy-logger/patches/python3.patch

diff --git a/srcpkgs/telepathy-logger/patches/python3.patch b/srcpkgs/telepathy-logger/patches/python3.patch
new file mode 100644
index 0000000000000..dbafd9cc80218
--- /dev/null
+++ b/srcpkgs/telepathy-logger/patches/python3.patch
@@ -0,0 +1,653 @@
+From f4634b2caf1f92f27a507207ff181d3a7927871f Mon Sep 17 00:00:00 2001
+From: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Date: Thu, 3 Jan 2013 12:33:09 +0000
+Subject: [PATCH] Make the code generation tools work under either Python 2 or
+ 3
+
+They have been verified to produce identical output in _gen.
+
+Bug: https://bugs.freedesktop.org/show_bug.cgi?id=56758
+Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Reviewed-by: Xavier Claessens <xavier.claessens@collabora.co.uk>
+---
+ tools/c-constants-gen.py            | 12 +++---
+ tools/glib-client-gen.py            | 18 +++------
+ tools/glib-client-marshaller-gen.py | 20 +++++-----
+ tools/glib-errors-check-gen.py      | 62 ++++++++++++++---------------
+ tools/glib-errors-str-gen.py        | 14 ++-----
+ tools/glib-ginterface-gen.py        | 22 ++++------
+ tools/glib-gtypes-generator.py      | 14 +++----
+ tools/glib-interfaces-gen.py        | 14 +++----
+ tools/gobject-foo.py                |  2 +-
+ tools/libglibcodegen.py             |  4 +-
+ tools/libtpcodegen.py               | 22 +++++++++-
+ tools/make-version-script.py        | 32 +++++++--------
+ tools/xincludator.py                | 13 ++++--
+ 13 files changed, 129 insertions(+), 120 deletions(-)
+
+diff --git a/tools/c-constants-gen.py b/tools/c-constants-gen.py
+index c7a93d371..a08afee06 100644
+--- a/tools/c-constants-gen.py
++++ b/tools/c-constants-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -12,7 +12,7 @@ def __init__(self, prefix, dom, output_base):
+         self.prefix = prefix + '_'
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+-	self.output_base = output_base
++        self.output_base = output_base
+         self.__header = []
+         self.__docs = []
+ 
+@@ -21,14 +21,14 @@ def __call__(self):
+         self.do_body()
+         self.do_footer()
+ 
+-        file_set_contents(self.output_base + '.h', ''.join(self.__header))
+-        file_set_contents(self.output_base + '-gtk-doc.h', ''.join(self.__docs))
++        file_set_contents(self.output_base + '.h', u('').join(self.__header).encode('utf-8'))
++        file_set_contents(self.output_base + '-gtk-doc.h', u('').join(self.__docs).encode('utf-8'))
+ 
+     def write(self, code):
+-        self.__header.append(code.encode('utf-8'))
++        self.__header.append(code)
+ 
+     def d(self, code):
+-        self.__docs.append(code.encode('utf-8'))
++        self.__docs.append(code)
+ 
+     # Header
+     def do_header(self):
+diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py
+index f8465a62b..e68e1a575 100644
+--- a/tools/glib-client-gen.py
++++ b/tools/glib-client-gen.py
+@@ -27,8 +27,8 @@
+ import xml.dom.minidom
+ from getopt import gnu_getopt
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import Signature, type_to_gtype, \
+         get_docstring, xml_escape, get_deprecated
+ 
+ 
+@@ -74,18 +74,12 @@ def __init__(self, dom, prefix, basename, opts):
+         self.guard = opts.get('--guard', None)
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def get_iface_quark(self):
+@@ -1191,7 +1185,7 @@ def __call__(self):
+         self.b('')
+ 
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         for node in nodes:
+             self.do_interface(node)
+@@ -1244,9 +1238,9 @@ def __call__(self):
+             self.h('#endif /* defined (%s) */' % self.guard)
+             self.h('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '-body.h', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '-body.h', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def types_to_gtypes(types):
+     return [type_to_gtype(t)[1] for t in types]
+diff --git a/tools/glib-client-marshaller-gen.py b/tools/glib-client-marshaller-gen.py
+index cb27d638a..cd9823bdf 100644
+--- a/tools/glib-client-marshaller-gen.py
++++ b/tools/glib-client-marshaller-gen.py
+@@ -31,23 +31,23 @@ def __call__(self):
+         for signal in signals:
+             self.do_signal(signal)
+ 
+-        print 'void'
+-        print '%s_register_dbus_glib_marshallers (void)' % self.prefix
+-        print '{'
++        print('void')
++        print('%s_register_dbus_glib_marshallers (void)' % self.prefix)
++        print('{')
+ 
+-        all = self.marshallers.keys()
++        all = list(self.marshallers.keys())
+         all.sort()
+         for marshaller in all:
+             rhs = self.marshallers[marshaller]
+ 
+-            print '  dbus_g_object_register_marshaller ('
+-            print '      g_cclosure_marshal_generic,'
+-            print '      G_TYPE_NONE,       /* return */'
++            print('  dbus_g_object_register_marshaller (')
++            print('      g_cclosure_marshal_generic,')
++            print('      G_TYPE_NONE,       /* return */')
+             for type in rhs:
+-                print '      G_TYPE_%s,' % type.replace('VOID', 'NONE')
+-            print '      G_TYPE_INVALID);'
++                print('      G_TYPE_%s,' % type.replace('VOID', 'NONE'))
++            print('      G_TYPE_INVALID);')
+ 
+-        print '}'
++        print('}')
+ 
+ 
+ def types_to_gtypes(types):
+diff --git a/tools/glib-errors-check-gen.py b/tools/glib-errors-check-gen.py
+index 553fc9caf..fad261ece 100644
+--- a/tools/glib-errors-check-gen.py
++++ b/tools/glib-errors-check-gen.py
+@@ -12,13 +12,13 @@ def __init__(self, dom):
+ 
+     def __call__(self):
+ 
+-        print '{'
+-        print '  GEnumClass *klass;'
+-        print '  GEnumValue *value_by_name;'
+-        print '  GEnumValue *value_by_nick;'
+-        print ''
+-        print '  g_type_init ();'
+-        print '  klass = g_type_class_ref (TP_TYPE_ERROR);'
++        print('{')
++        print('  GEnumClass *klass;')
++        print('  GEnumValue *value_by_name;')
++        print('  GEnumValue *value_by_nick;')
++        print('')
++        print('  g_type_init ();')
++        print('  klass = g_type_class_ref (TP_TYPE_ERROR);')
+ 
+         for error in self.errors.getElementsByTagNameNS(NS_TP, 'error'):
+             ns = error.parentNode.getAttribute('namespace')
+@@ -28,30 +28,30 @@ def __call__(self):
+             s = ('TP_ERROR_STR_' +
+                  error.getAttribute('name').replace(' ', '_').replace('.', '_').upper())
+ 
+-            print ''
+-            print '  /* %s.%s */' % (ns, nick)
+-            print ('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
+-                    % enum)
+-            print ('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
+-                    % nick)
+-            print ('  g_assert (value_by_name != NULL);')
+-            print ('  g_assert (value_by_nick != NULL);')
+-            print ('  g_assert_cmpint (value_by_name->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpint (value_by_nick->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
+-                    % (s, nick))
+-
+-        print '}'
++            print('')
++            print('  /* %s.%s */' % (ns, nick))
++            print('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
++                   % enum)
++            print('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
++                   % nick)
++            print('  g_assert (value_by_name != NULL);')
++            print('  g_assert (value_by_nick != NULL);')
++            print('  g_assert_cmpint (value_by_name->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpint (value_by_nick->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
++                   % (s, nick))
++
++        print('}')
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-errors-str-gen.py b/tools/glib-errors-str-gen.py
+index b2cf520bd..ddb1e16b7 100644
+--- a/tools/glib-errors-str-gen.py
++++ b/tools/glib-errors-str-gen.py
+@@ -3,7 +3,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, xml_escape
+ 
+ class Generator(object):
+@@ -17,18 +17,12 @@ def __init__(self, dom, basename):
+         self.__docs = []
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def __call__(self):
+@@ -72,9 +66,9 @@ def __call__(self):
+         self.h('')
+         self.b('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-ginterface-gen.py b/tools/glib-ginterface-gen.py
+index 6fec0d3c4..c0ce20ddc 100644
+--- a/tools/glib-ginterface-gen.py
++++ b/tools/glib-ginterface-gen.py
+@@ -26,8 +26,8 @@
+ import os.path
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import Signature, type_to_gtype, \
+         NS_TP, dbus_gutils_wincaps_to_uscore
+ 
+ 
+@@ -85,18 +85,12 @@ def __init__(self, dom, prefix, basename, signal_marshal_prefix,
+         self.allow_havoc = allow_havoc
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def do_node(self, node):
+@@ -733,7 +727,7 @@ def have_properties(self, nodes):
+ 
+     def __call__(self):
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         self.h('#include <glib-object.h>')
+         self.h('#include <dbus/dbus-glib.h>')
+@@ -761,12 +755,12 @@ def __call__(self):
+ 
+         self.h('')
+         self.b('')
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def cmdline_error():
+-    print """\
++    print("""\
+ usage:
+     gen-ginterface [OPTIONS] xmlfile Prefix_
+ options:
+@@ -786,7 +780,7 @@ def cmdline_error():
+             void symbol (DBusGMethodInvocation *context)
+         and return some sort of "not implemented" error via
+             dbus_g_method_return_error (context, ...)
+-"""
++""")
+     sys.exit(1)
+ 
+ 
+diff --git a/tools/glib-gtypes-generator.py b/tools/glib-gtypes-generator.py
+index 21dfc6aa7..1477bd37b 100644
+--- a/tools/glib-gtypes-generator.py
++++ b/tools/glib-gtypes-generator.py
+@@ -23,7 +23,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import escape_as_identifier, \
+                            get_docstring, \
+                            NS_TP, \
+@@ -68,13 +68,13 @@ def __init__(self, dom, output, mixed_case_prefix):
+         self.need_other_arrays = {}
+ 
+     def h(self, code):
+-        self.header.append(code.encode("utf-8"))
++        self.header.append(code)
+ 
+     def c(self, code):
+-        self.body.append(code.encode("utf-8"))
++        self.body.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def do_mapping_header(self, mapping):
+         members = mapping.getElementsByTagNameNS(NS_TP, 'member')
+@@ -292,9 +292,9 @@ def __call__(self):
+             self.c('  return t;\n')
+             self.c('}\n\n')
+ 
+-        file_set_contents(self.output + '.h', ''.join(self.header))
+-        file_set_contents(self.output + '-body.h', ''.join(self.body))
+-        file_set_contents(self.output + '-gtk-doc.h', ''.join(self.docs))
++        file_set_contents(self.output + '.h', u('').join(self.header).encode('utf-8'))
++        file_set_contents(self.output + '-body.h', u('').join(self.body).encode('utf-8'))
++        file_set_contents(self.output + '-gtk-doc.h', u('').join(self.docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-interfaces-gen.py b/tools/glib-interfaces-gen.py
+index 410762cde..b67d7b4f0 100644
+--- a/tools/glib-interfaces-gen.py
++++ b/tools/glib-interfaces-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -24,22 +24,22 @@ def __init__(self, prefix, implfile, declfile, dom):
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+     def h(self, code):
+-        self.decls.append(code.encode('utf-8'))
++        self.decls.append(code)
+ 
+     def c(self, code):
+-        self.impls.append(code.encode('utf-8'))
++        self.impls.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def __call__(self):
+         for f in self.h, self.c:
+             self.do_header(f)
+         self.do_body()
+ 
+-        file_set_contents(self.implfile, ''.join(self.impls))
+-        file_set_contents(self.declfile, ''.join(self.decls))
+-        file_set_contents(self.docfile, ''.join(self.docs))
++        file_set_contents(self.implfile, u('').join(self.impls).encode('utf-8'))
++        file_set_contents(self.declfile, u('').join(self.decls).encode('utf-8'))
++        file_set_contents(self.docfile, u('').join(self.docs).encode('utf-8'))
+ 
+     # Header
+     def do_header(self, f):
+diff --git a/tools/gobject-foo.py b/tools/gobject-foo.py
+index 002a290ba..a2abd7667 100644
+--- a/tools/gobject-foo.py
++++ b/tools/gobject-foo.py
+@@ -87,4 +87,4 @@ def gobject_header(head, tail, as_interface=False):
+ 
+     head, tail = argv
+ 
+-    print '\n'.join(gobject_header(head, tail, as_interface=as_interface))
++    print('\n'.join(gobject_header(head, tail, as_interface=as_interface)))
+diff --git a/tools/libglibcodegen.py b/tools/libglibcodegen.py
+index 6a9d21485..6cd1a6277 100644
+--- a/tools/libglibcodegen.py
++++ b/tools/libglibcodegen.py
+@@ -154,7 +154,7 @@ def type_to_gtype(s):
+         return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False)
+     elif s[:2] == 'a{':  #some arbitrary hash tables
+         if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'):
+-            raise Exception, "can't index a hashtable off non-basic type " + s
++            raise Exception("can't index a hashtable off non-basic type " + s)
+         first = type_to_gtype(s[2])
+         second = type_to_gtype(s[3:-1])
+         return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False)
+@@ -169,4 +169,4 @@ def type_to_gtype(s):
+         return ("GValueArray *", gtype, "BOXED", True)
+ 
+     # we just don't know ..
+-    raise Exception, "don't know the GType for " + s
++    raise Exception("don't know the GType for " + s)
+diff --git a/tools/libtpcodegen.py b/tools/libtpcodegen.py
+index 7e9eb9a50..99de66340 100644
+--- a/tools/libtpcodegen.py
++++ b/tools/libtpcodegen.py
+@@ -21,6 +21,7 @@
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ 
+ import os
++import sys
+ from string import ascii_letters, digits
+ 
+ 
+@@ -28,6 +29,20 @@
+ 
+ _ASCII_ALNUM = ascii_letters + digits
+ 
++if sys.version_info[0] >= 3:
++    def u(s):
++        """Return s, which must be a str literal with no non-ASCII characters.
++        This is like a more restricted form of the Python 2 u'' syntax.
++        """
++        return s.encode('ascii').decode('ascii')
++else:
++    def u(s):
++        """Return a Unicode version of s, which must be a str literal
++        (a bytestring) in which each byte is an ASCII character.
++        This is like a more restricted form of the u'' syntax.
++        """
++        return s.decode('ascii')
++
+ def file_set_contents(filename, contents):
+     try:
+         os.remove(filename)
+@@ -38,13 +53,15 @@ def file_set_contents(filename, contents):
+     except OSError:
+         pass
+ 
+-    open(filename + '.tmp', 'w').write(contents)
++    open(filename + '.tmp', 'wb').write(contents)
+     os.rename(filename + '.tmp', filename)
+ 
+ def cmp_by_name(node1, node2):
+     return cmp(node1.getAttributeNode("name").nodeValue,
+                node2.getAttributeNode("name").nodeValue)
+ 
++def key_by_name(node):
++    return node.getAttributeNode("name").nodeValue
+ 
+ def escape_as_identifier(identifier):
+     """Escape the given string to be a valid D-Bus object path or service
+@@ -168,6 +185,9 @@ def __init__(self, string):
+         self.remaining = string
+ 
+     def next(self):
++        return self.__next__()
++
++    def __next__(self):
+         if self.remaining == '':
+             raise StopIteration
+ 
+diff --git a/tools/make-version-script.py b/tools/make-version-script.py
+index 0d30aa323..4ced849fe 100644
+--- a/tools/make-version-script.py
++++ b/tools/make-version-script.py
+@@ -63,9 +63,9 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+     if dpkg:
+         assert dpkg_first_line is not None
+-        print dpkg_first_line
++        print(dpkg_first_line)
+         if dpkg_build_depends_package is not None:
+-            print "* Build-Depends-Package: %s" % dpkg_build_depends_package
++            print("* Build-Depends-Package: %s" % dpkg_build_depends_package)
+ 
+     for filename in abifiles:
+         lines = open(filename, 'r').readlines()
+@@ -120,8 +120,8 @@ def main(abifiles, symbols=None, unreleased_version=None,
+         lines = lines[cut:]
+ 
+         if gnuld:
+-            print "%s {" % version
+-            print "    global:"
++            print("%s {" % version)
++            print("    global:")
+ 
+         for symbol in lines:
+             symbol = symbol.strip()
+@@ -130,7 +130,7 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 continue
+ 
+             if gnuld:
+-                print "        %s;" % symbol
++                print("        %s;" % symbol)
+             elif dpkg:
+                 dpkg_symbols.append('%s@%s %s' % (symbol, version, release))
+ 
+@@ -142,22 +142,22 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+         if gnuld:
+             if extends == '-':
+-                print "    local:"
+-                print "        *;"
+-                print "};"
++                print("    local:")
++                print("        *;")
++                print("};")
+             else:
+-                print "} %s;" % extends
+-                print
++                print("} %s;" % extends)
++                print("")
+ 
+     if dpkg:
+         dpkg_symbols.sort()
+         dpkg_versions.sort()
+ 
+         for x in dpkg_versions:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+         for x in dpkg_symbols:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+     if symbol_set is not None:
+         missing = versioned_symbols - symbol_set
+@@ -182,13 +182,13 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 raise SystemExit(1)
+ 
+             if gnuld:
+-                print "%s {" % unreleased_version
+-                print "    global:"
++                print("%s {" % unreleased_version)
++                print("    global:")
+ 
+                 for symbol in unreleased:
+-                    print "        %s;" % symbol
++                    print("        %s;" % symbol)
+ 
+-                print "} %s;" % version
++                print("} %s;" % version)
+ 
+ 
+ if __name__ == '__main__':
+diff --git a/tools/xincludator.py b/tools/xincludator.py
+index 63e106ace..f9ed49ce4 100644
+--- a/tools/xincludator.py
++++ b/tools/xincludator.py
+@@ -1,17 +1,19 @@
+ #!/usr/bin/python
+ 
++import sys
+ from sys import argv, stdout, stderr
+ import codecs, locale
+ import os
+ import xml.dom.minidom
+ 
+-stdout = codecs.getwriter('utf-8')(stdout)
++if sys.version_info[0] < 3:
++    stdout = codecs.getwriter('utf-8')(stdout)
+ 
+ NS_XI = 'http://www.w3.org/2001/XInclude'
+ 
+ def xincludate(dom, base, dropns = []):
+     remove_attrs = []
+-    for i in xrange(dom.documentElement.attributes.length):
++    for i in range(dom.documentElement.attributes.length):
+         attr = dom.documentElement.attributes.item(i)
+         if attr.prefix == 'xmlns':
+             if attr.localName in dropns:
+@@ -34,6 +36,11 @@ def xincludate(dom, base, dropns = []):
+     argv = argv[1:]
+     dom = xml.dom.minidom.parse(argv[0])
+     xincludate(dom, argv[0])
+-    xml = dom.toxml()
++
++    if sys.version_info[0] >= 3:
++        xml = dom.toxml(encoding=None)
++    else:
++        xml = dom.toxml()
++
+     stdout.write(xml)
+     stdout.write('\n')
diff --git a/srcpkgs/telepathy-logger/template b/srcpkgs/telepathy-logger/template
index 528a561804b48..fd126f9108ffb 100644
--- a/srcpkgs/telepathy-logger/template
+++ b/srcpkgs/telepathy-logger/template
@@ -5,7 +5,7 @@ revision=3
 build_style=gnu-configure
 build_helper="gir"
 configure_args="--disable-static --disable-schemas-compile $(vopt_enable gir introspection)"
-hostmakedepends="pkg-config intltool libxslt glib-devel python $(vopt_if gir gobject-introspection)"
+hostmakedepends="pkg-config intltool libxslt glib-devel python3 $(vopt_if gir gobject-introspection)"
 makedepends="dbus-glib-devel libxml2-devel sqlite-devel telepathy-glib-devel"
 short_desc="Telepathy framework logging daemon"
 maintainer="Orphaned <orphan@voidlinux.org>"
@@ -18,10 +18,6 @@ checksum=8fcad534d653b1b365132c5b158adae947810ffbae9843f72dd1797966415dae
 build_options="gir"
 build_options_default="gir"
 
-pre_configure() {
-	export PYTHON=python2
-}
-
 telepathy-logger-devel_package() {
 	depends="libxml2-devel telepathy-glib-devel ${sourcepkg}-${version}_${revision}"
 	short_desc+=" - development files"

From a532f990189c2ce445cee3e1ca3ca7f4947cb30a Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sat, 7 Oct 2023 23:34:58 -0400
Subject: [PATCH 4/6] telepathy-haze: update to 0.8.1.

---
 .../patches/purple-2.0.12.patch               | 25 -------------------
 srcpkgs/telepathy-haze/template               | 12 ++++-----
 2 files changed, 6 insertions(+), 31 deletions(-)
 delete mode 100644 srcpkgs/telepathy-haze/patches/purple-2.0.12.patch

diff --git a/srcpkgs/telepathy-haze/patches/purple-2.0.12.patch b/srcpkgs/telepathy-haze/patches/purple-2.0.12.patch
deleted file mode 100644
index 3558e53abdbd5..0000000000000
--- a/srcpkgs/telepathy-haze/patches/purple-2.0.12.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Koop Mast <kwm freebsd org>
-Date: Mon, 11 Jan 2016 11:53:23 +0100
-Subject: Fix the build with libpurple 2.0.12
-
-http://pidgin.im/pipermail/devel/2015-March/023639.html
-Replaces the old emu with the _PASSIVE.
-
-Origin: vendor, FreeBSD, https://lists.freebsd.org/pipermail/svn-ports-head/2016-January/111612.html
----
- src/media-stream.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/media-stream.c b/src/media-stream.c
-index 7b4f29f..da088d1 100644
---- a/src/media-stream.c
-+++ b/src/media-stream.c
-@@ -1076,7 +1076,7 @@ haze_media_stream_new_native_candidate (TpSvcMediaStreamHandler *iface,
-       if (proto == TP_MEDIA_STREAM_BASE_PROTO_UDP)
-         protocol = PURPLE_MEDIA_NETWORK_PROTOCOL_UDP;
-       else if (proto == TP_MEDIA_STREAM_BASE_PROTO_TCP)
--        protocol = PURPLE_MEDIA_NETWORK_PROTOCOL_TCP;
-+        protocol = PURPLE_MEDIA_NETWORK_PROTOCOL_TCP_PASSIVE;
-       else
-         DEBUG ("Unknown network protocol");
- 
diff --git a/srcpkgs/telepathy-haze/template b/srcpkgs/telepathy-haze/template
index 60b65b83eced4..938f651d083b8 100644
--- a/srcpkgs/telepathy-haze/template
+++ b/srcpkgs/telepathy-haze/template
@@ -1,13 +1,13 @@
 # Template file for 'telepathy-haze'
 pkgname=telepathy-haze
-version=0.8.0
-revision=2
+version=0.8.1
+revision=1
 build_style=gnu-configure
-hostmakedepends="pkg-config python libxslt glib-devel"
+hostmakedepends="pkg-config python3 libxslt glib-devel"
 makedepends="glib-devel libpurple-devel telepathy-glib-devel"
 short_desc="Backend for telepathy to use libpurple (Pidgin) protocols"
 maintainer="Orphaned <orphan@voidlinux.org>"
 license="GPL-2.0-or-later"
-homepage="http://telepathy.freedesktop.org"
-distfiles="${homepage}/releases/$pkgname/$pkgname-$version.tar.gz"
-checksum=3e76049c05f2cd5900c5c0c1cfebdf7ae79eec987a599f1090946673c5b8f9c9
+homepage="https://telepathy.freedesktop.org"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-haze/telepathy-haze-$version.tar.gz"
+checksum=704befa42eec2173eca4bac01ffd004014665f2bad46dc8948e5423364cde30a

From 593016d67b33926fce9392bf997f9c3d6db1cd3f Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sun, 8 Oct 2023 00:15:59 -0400
Subject: [PATCH 5/6] telepathy-salut: make codegen work with python3

---
 srcpkgs/telepathy-salut/patches/python3.patch | 97 +++++++++++++++++++
 srcpkgs/telepathy-salut/template              | 11 +--
 2 files changed, 102 insertions(+), 6 deletions(-)
 create mode 100644 srcpkgs/telepathy-salut/patches/python3.patch

diff --git a/srcpkgs/telepathy-salut/patches/python3.patch b/srcpkgs/telepathy-salut/patches/python3.patch
new file mode 100644
index 0000000000000..fa6fb6253c466
--- /dev/null
+++ b/srcpkgs/telepathy-salut/patches/python3.patch
@@ -0,0 +1,97 @@
+--- a/tools/libglibcodegen.py
++++ b/tools/libglibcodegen.py
+@@ -55,9 +55,8 @@
+     return camelcase_to_lower(s).upper()
+ 
+ 
+-def cmp_by_name(node1, node2):
+-    return cmp(node1.getAttributeNode("name").nodeValue,
+-               node2.getAttributeNode("name").nodeValue)
++def key_by_name(node):
++    return node.getAttributeNode("name").nodeValue
+ 
+ 
+ def dbus_gutils_wincaps_to_uscore(s):
+@@ -191,6 +191,9 @@
+         self.remaining = string
+ 
+     def next(self):
++        return self.__next__()
++
++    def __next__(self):
+         if self.remaining == '':
+             raise StopIteration
+ 
+@@ -297,7 +297,7 @@
+         return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False)
+     elif s[:2] == 'a{':  #some arbitrary hash tables
+         if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'):
+-            raise Exception, "can't index a hashtable off non-basic type " + s
++            raise Exception("can't index a hashtable off non-basic type " + s)
+         first = type_to_gtype(s[2])
+         second = type_to_gtype(s[3:-1])
+         return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False)
+@@ -312,7 +312,7 @@
+         return ("GValueArray *", gtype, "BOXED", True)
+ 
+     # we just don't know ..
+-    raise Exception, "don't know the GType for " + s
++    raise Exception("don't know the GType for " + s)
+ 
+ 
+ def xml_escape(s):
+--- a/tools/glib-signals-marshal-gen.py
++++ b/tools/glib-signals-marshal-gen.py
+@@ -41,12 +41,12 @@
+         for signal in signals:
+             self.do_signal(signal)
+ 
+-        all = self.marshallers.keys()
++        all = list(self.marshallers.keys())
+         all.sort()
+         for marshaller in all:
+             rhs = self.marshallers[marshaller]
+             if not marshaller.startswith('g_cclosure'):
+-                print 'VOID:' + ','.join(rhs)
++                print('VOID:' + ','.join(rhs))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+--- a/tools/glib-ginterface-gen.py
++++ b/tools/glib-ginterface-gen.py
+@@ -26,7 +26,7 @@
+ import os.path
+ import xml.dom.minidom
+ 
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libglibcodegen import Signature, type_to_gtype, key_by_name, \
+         camelcase_to_lower, NS_TP, dbus_gutils_wincaps_to_uscore, \
+         signal_to_marshal_name, method_to_glue_marshal_name
+ 
+@@ -620,7 +620,7 @@
+         self.b('')
+ 
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         for node in nodes:
+             self.do_node(node)
+@@ -639,7 +639,7 @@
+ 
+ 
+ def cmdline_error():
+-    print """\
++    print("""\
+ usage:
+     gen-ginterface [OPTIONS] xmlfile Prefix_
+ options:
+@@ -659,7 +659,7 @@
+             void symbol (DBusGMethodInvocation *context)
+         and return some sort of "not implemented" error via
+             dbus_g_method_return_error (context, ...)
+-"""
++""")
+     sys.exit(1)
+ 
+ 
diff --git a/srcpkgs/telepathy-salut/template b/srcpkgs/telepathy-salut/template
index 8c3d2dace29ae..badc020f1b697 100644
--- a/srcpkgs/telepathy-salut/template
+++ b/srcpkgs/telepathy-salut/template
@@ -2,19 +2,18 @@
 pkgname=telepathy-salut
 version=0.8.1
 revision=20
-lib32disabled=yes
 build_style=gnu-configure
 configure_args="--disable-tests --disable-plugins --with-tls=gnutls
  --disable-avahi-tests --disable-static"
-hostmakedepends="pkg-config python xmldiff glib-devel"
+hostmakedepends="pkg-config python3 xmldiff glib-devel"
 makedepends="glib-devel avahi-glib-libs-devel libsoup-devel telepathy-glib-devel
  gnutls-devel libuuid-devel sqlite-devel"
 depends="avahi"
 short_desc="Link-local XMPP connection manager for Telepathy"
 maintainer="Orphaned <orphan@voidlinux.org>"
-homepage="http://telepathy.freedesktop.org"
 license="LGPL-2.1-or-later"
-distfiles="http://telepathy.freedesktop.org/releases/$pkgname/$pkgname-$version.tar.gz"
+homepage="https://telepathy.freedesktop.org"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-salut/telepathy-salut-$version.tar.gz"
 checksum=70b9108ac8b511b7688e1b580de4ddb8981603c3cbde01f287ef8f9cb708618e
-
-nocross="http://build.voidlinux.org/builders/armv7l_builder/builds/16213/steps/shell_3/logs/stdio"
+lib32disabled=yes
+nocross="can't find wocky.h"

From fdebc46b6db1ec08ce1afcf87ba6956ec94d58a2 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sun, 8 Oct 2023 00:51:15 -0400
Subject: [PATCH 6/6] telepathy-gabble: patch for python3

---
 .../telepathy-gabble/patches/python3.patch    | 871 ++++++++++++++++++
 srcpkgs/telepathy-gabble/template             |   8 +-
 2 files changed, 875 insertions(+), 4 deletions(-)
 create mode 100644 srcpkgs/telepathy-gabble/patches/python3.patch

diff --git a/srcpkgs/telepathy-gabble/patches/python3.patch b/srcpkgs/telepathy-gabble/patches/python3.patch
new file mode 100644
index 0000000000000..205c9940a58fe
--- /dev/null
+++ b/srcpkgs/telepathy-gabble/patches/python3.patch
@@ -0,0 +1,871 @@
+From 1aeffdb74a1d7ce8b93587ded4f5a434cd1dfc06 Mon Sep 17 00:00:00 2001
+From: Simon McVittie <simon.mcvittie@collabora.co.uk>
+Date: Fri, 1 Nov 2013 14:12:06 +0000
+Subject: [PATCH] Update Python tools from telepathy-glib (avoid deprecations,
+ etc.)
+
+Bug: https://bugs.freedesktop.org/show_bug.cgi?id=26609
+Reviewed-by: Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+---
+ tools/c-constants-gen.py            | 12 ++--
+ tools/glib-client-gen.py            | 94 +++++++----------------------
+ tools/glib-client-marshaller-gen.py | 20 +++---
+ tools/glib-errors-check-gen.py      | 62 +++++++++----------
+ tools/glib-errors-str-gen.py        | 14 ++---
+ tools/glib-ginterface-gen.py        | 22 +++----
+ tools/glib-gtypes-generator.py      | 14 ++---
+ tools/glib-interfaces-gen.py        | 14 ++---
+ tools/gobject-foo.py                |  2 +-
+ tools/libglibcodegen.py             | 27 ++++++++-
+ tools/libtpcodegen.py               | 22 ++++++-
+ tools/make-version-script.py        | 32 +++++-----
+ tools/xincludator.py                | 13 +++-
+ 13 files changed, 167 insertions(+), 181 deletions(-)
+
+diff --git a/tools/c-constants-gen.py b/tools/c-constants-gen.py
+index c7a93d371..a08afee06 100644
+--- a/tools/c-constants-gen.py
++++ b/tools/c-constants-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -12,7 +12,7 @@ def __init__(self, prefix, dom, output_base):
+         self.prefix = prefix + '_'
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+-	self.output_base = output_base
++        self.output_base = output_base
+         self.__header = []
+         self.__docs = []
+ 
+@@ -21,14 +21,14 @@ def __call__(self):
+         self.do_body()
+         self.do_footer()
+ 
+-        file_set_contents(self.output_base + '.h', ''.join(self.__header))
+-        file_set_contents(self.output_base + '-gtk-doc.h', ''.join(self.__docs))
++        file_set_contents(self.output_base + '.h', u('').join(self.__header).encode('utf-8'))
++        file_set_contents(self.output_base + '-gtk-doc.h', u('').join(self.__docs).encode('utf-8'))
+ 
+     def write(self, code):
+-        self.__header.append(code.encode('utf-8'))
++        self.__header.append(code)
+ 
+     def d(self, code):
+-        self.__docs.append(code.encode('utf-8'))
++        self.__docs.append(code)
+ 
+     # Header
+     def do_header(self):
+diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py
+index f8465a62b..a0fecf083 100644
+--- a/tools/glib-client-gen.py
++++ b/tools/glib-client-gen.py
+@@ -27,9 +27,9 @@
+ import xml.dom.minidom
+ from getopt import gnu_getopt
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
+-        get_docstring, xml_escape, get_deprecated
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import (Signature, type_to_gtype,
++        get_docstring, xml_escape, get_deprecated, copy_into_gvalue)
+ 
+ 
+ NS_TP = "http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"
+@@ -74,18 +74,12 @@ def __init__(self, dom, prefix, basename, opts):
+         self.guard = opts.get('--guard', None)
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def get_iface_quark(self):
+@@ -192,6 +186,7 @@ def do_signal(self, iface, signal):
+ 
+             self.b('    TpProxySignalConnection *sc)')
+             self.b('{')
++            self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+             self.b('  GValueArray *args = g_value_array_new (%d);' % len(args))
+             self.b('  GValue blank = { 0 };')
+             self.b('  guint i;')
+@@ -200,6 +195,7 @@ def do_signal(self, iface, signal):
+             self.b('')
+             self.b('  for (i = 0; i < %d; i++)' % len(args))
+             self.b('    g_value_array_append (args, &blank);')
++            self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+             self.b('')
+ 
+             for i, arg in enumerate(args):
+@@ -209,36 +205,8 @@ def do_signal(self, iface, signal):
+                 self.b('  g_value_unset (args->values + %d);' % i)
+                 self.b('  g_value_init (args->values + %d, %s);' % (i, gtype))
+ 
+-                if gtype == 'G_TYPE_STRING':
+-                    self.b('  g_value_set_string (args->values + %d, %s);'
+-                           % (i, name))
+-                elif marshaller == 'BOXED':
+-                    self.b('  g_value_set_boxed (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_UCHAR':
+-                    self.b('  g_value_set_uchar (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_BOOLEAN':
+-                    self.b('  g_value_set_boolean (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_INT':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_UINT':
+-                    self.b('  g_value_set_uint (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_INT64':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_UINT64':
+-                    self.b('  g_value_set_uint64 (args->values + %d, %s);'
+-                           % (i, name))
+-                elif gtype == 'G_TYPE_DOUBLE':
+-                    self.b('  g_value_set_double (args->values + %d, %s);'
+-                           % (i, name))
+-                else:
+-                    assert False, ("Don't know how to put %s in a GValue"
+-                                   % gtype)
++                self.b('  ' + copy_into_gvalue('args->values + %d' % i,
++                    gtype, marshaller, name))
+                 self.b('')
+ 
+             self.b('  tp_proxy_signal_connection_v0_take_results (sc, args);')
+@@ -288,12 +256,14 @@ def do_signal(self, iface, signal):
+         self.b('      weak_object);')
+         self.b('')
+ 
++        self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+         if len(args) > 0:
+             self.b('  g_value_array_free (args);')
+         else:
+             self.b('  if (args != NULL)')
+             self.b('    g_value_array_free (args);')
+             self.b('')
++        self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+         self.b('  g_object_unref (tpproxy);')
+         self.b('}')
+@@ -559,11 +529,13 @@ def do_method(self, iface, method):
+             self.b('      return;')
+             self.b('    }')
+             self.b('')
++            self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+             self.b('  args = g_value_array_new (%d);' % len(out_args))
+             self.b('  g_value_init (&blank, G_TYPE_INT);')
+             self.b('')
+             self.b('  for (i = 0; i < %d; i++)' % len(out_args))
+             self.b('    g_value_array_append (args, &blank);')
++            self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+             for i, arg in enumerate(out_args):
+                 name, info, tp_type, elt = arg
+@@ -573,36 +545,8 @@ def do_method(self, iface, method):
+                 self.b('  g_value_unset (args->values + %d);' % i)
+                 self.b('  g_value_init (args->values + %d, %s);' % (i, gtype))
+ 
+-                if gtype == 'G_TYPE_STRING':
+-                    self.b('  g_value_take_string (args->values + %d, %s);'
+-                           % (i, name))
+-                elif marshaller == 'BOXED':
+-                    self.b('  g_value_take_boxed (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_UCHAR':
+-                    self.b('  g_value_set_uchar (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_BOOLEAN':
+-                    self.b('  g_value_set_boolean (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_INT':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_UINT':
+-                    self.b('  g_value_set_uint (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_INT64':
+-                    self.b('  g_value_set_int (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_UINT64':
+-                    self.b('  g_value_set_uint (args->values + %d, %s);'
+-                            % (i, name))
+-                elif gtype == 'G_TYPE_DOUBLE':
+-                    self.b('  g_value_set_double (args->values + %d, %s);'
+-                            % (i, name))
+-                else:
+-                    assert False, ("Don't know how to put %s in a GValue"
+-                                   % gtype)
++                self.b('  ' + copy_into_gvalue('args->values + %d' % i,
++                    gtype, marshaller, name))
+ 
+             self.b('  tp_proxy_pending_call_v0_take_results (user_data, '
+                    'NULL, args);')
+@@ -671,11 +615,13 @@ def do_method(self, iface, method):
+         self.b('      error, user_data, weak_object);')
+         self.b('')
+ 
++        self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+         if len(out_args) > 0:
+             self.b('  g_value_array_free (args);')
+         else:
+             self.b('  if (args != NULL)')
+             self.b('    g_value_array_free (args);')
++        self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+         self.b('}')
+         self.b('')
+@@ -948,11 +894,13 @@ def do_method_reentrant(self, method, iface_lc, member, member_lc, in_args,
+ 
+             self.b('')
+ 
++        self.b('  G_GNUC_BEGIN_IGNORE_DEPRECATIONS')
+         if len(out_args) > 0:
+             self.b('  g_value_array_free (args);')
+         else:
+             self.b('  if (args != NULL)')
+             self.b('    g_value_array_free (args);')
++        self.b('  G_GNUC_END_IGNORE_DEPRECATIONS')
+ 
+         self.b('}')
+         self.b('')
+@@ -1191,7 +1139,7 @@ def __call__(self):
+         self.b('')
+ 
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         for node in nodes:
+             self.do_interface(node)
+@@ -1244,9 +1192,9 @@ def __call__(self):
+             self.h('#endif /* defined (%s) */' % self.guard)
+             self.h('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '-body.h', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '-body.h', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def types_to_gtypes(types):
+     return [type_to_gtype(t)[1] for t in types]
+diff --git a/tools/glib-client-marshaller-gen.py b/tools/glib-client-marshaller-gen.py
+index cb27d638a..cd9823bdf 100644
+--- a/tools/glib-client-marshaller-gen.py
++++ b/tools/glib-client-marshaller-gen.py
+@@ -31,23 +31,23 @@ def __call__(self):
+         for signal in signals:
+             self.do_signal(signal)
+ 
+-        print 'void'
+-        print '%s_register_dbus_glib_marshallers (void)' % self.prefix
+-        print '{'
++        print('void')
++        print('%s_register_dbus_glib_marshallers (void)' % self.prefix)
++        print('{')
+ 
+-        all = self.marshallers.keys()
++        all = list(self.marshallers.keys())
+         all.sort()
+         for marshaller in all:
+             rhs = self.marshallers[marshaller]
+ 
+-            print '  dbus_g_object_register_marshaller ('
+-            print '      g_cclosure_marshal_generic,'
+-            print '      G_TYPE_NONE,       /* return */'
++            print('  dbus_g_object_register_marshaller (')
++            print('      g_cclosure_marshal_generic,')
++            print('      G_TYPE_NONE,       /* return */')
+             for type in rhs:
+-                print '      G_TYPE_%s,' % type.replace('VOID', 'NONE')
+-            print '      G_TYPE_INVALID);'
++                print('      G_TYPE_%s,' % type.replace('VOID', 'NONE'))
++            print('      G_TYPE_INVALID);')
+ 
+-        print '}'
++        print('}')
+ 
+ 
+ def types_to_gtypes(types):
+diff --git a/tools/glib-errors-check-gen.py b/tools/glib-errors-check-gen.py
+index 553fc9caf..fad261ece 100644
+--- a/tools/glib-errors-check-gen.py
++++ b/tools/glib-errors-check-gen.py
+@@ -12,13 +12,13 @@ def __init__(self, dom):
+ 
+     def __call__(self):
+ 
+-        print '{'
+-        print '  GEnumClass *klass;'
+-        print '  GEnumValue *value_by_name;'
+-        print '  GEnumValue *value_by_nick;'
+-        print ''
+-        print '  g_type_init ();'
+-        print '  klass = g_type_class_ref (TP_TYPE_ERROR);'
++        print('{')
++        print('  GEnumClass *klass;')
++        print('  GEnumValue *value_by_name;')
++        print('  GEnumValue *value_by_nick;')
++        print('')
++        print('  g_type_init ();')
++        print('  klass = g_type_class_ref (TP_TYPE_ERROR);')
+ 
+         for error in self.errors.getElementsByTagNameNS(NS_TP, 'error'):
+             ns = error.parentNode.getAttribute('namespace')
+@@ -28,30 +28,30 @@ def __call__(self):
+             s = ('TP_ERROR_STR_' +
+                  error.getAttribute('name').replace(' ', '_').replace('.', '_').upper())
+ 
+-            print ''
+-            print '  /* %s.%s */' % (ns, nick)
+-            print ('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
+-                    % enum)
+-            print ('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
+-                    % nick)
+-            print ('  g_assert (value_by_name != NULL);')
+-            print ('  g_assert (value_by_nick != NULL);')
+-            print ('  g_assert_cmpint (value_by_name->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpint (value_by_nick->value, ==, %s);'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
+-                    % enum)
+-            print ('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
+-                    % nick)
+-            print ('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
+-                    % (s, nick))
+-
+-        print '}'
++            print('')
++            print('  /* %s.%s */' % (ns, nick))
++            print('  value_by_name = g_enum_get_value_by_name (klass, "%s");'
++                   % enum)
++            print('  value_by_nick = g_enum_get_value_by_nick (klass, "%s");'
++                   % nick)
++            print('  g_assert (value_by_name != NULL);')
++            print('  g_assert (value_by_nick != NULL);')
++            print('  g_assert_cmpint (value_by_name->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpint (value_by_nick->value, ==, %s);'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_nick->value_name, ==, "%s");'
++                   % enum)
++            print('  g_assert_cmpstr (value_by_name->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (value_by_nick->value_nick, ==, "%s");'
++                   % nick)
++            print('  g_assert_cmpstr (%s, ==, TP_ERROR_PREFIX ".%s");'
++                   % (s, nick))
++
++        print('}')
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-errors-str-gen.py b/tools/glib-errors-str-gen.py
+index b2cf520bd..ddb1e16b7 100644
+--- a/tools/glib-errors-str-gen.py
++++ b/tools/glib-errors-str-gen.py
+@@ -3,7 +3,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, xml_escape
+ 
+ class Generator(object):
+@@ -17,18 +17,12 @@ def __init__(self, dom, basename):
+         self.__docs = []
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def __call__(self):
+@@ -72,9 +66,9 @@ def __call__(self):
+         self.h('')
+         self.b('')
+ 
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-ginterface-gen.py b/tools/glib-ginterface-gen.py
+index 6fec0d3c4..c0ce20ddc 100644
+--- a/tools/glib-ginterface-gen.py
++++ b/tools/glib-ginterface-gen.py
+@@ -26,8 +26,8 @@
+ import os.path
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
+-from libglibcodegen import Signature, type_to_gtype, cmp_by_name, \
++from libtpcodegen import file_set_contents, key_by_name, u
++from libglibcodegen import Signature, type_to_gtype, \
+         NS_TP, dbus_gutils_wincaps_to_uscore
+ 
+ 
+@@ -85,18 +85,12 @@ def __init__(self, dom, prefix, basename, signal_marshal_prefix,
+         self.allow_havoc = allow_havoc
+ 
+     def h(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__header.append(s)
+ 
+     def b(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__body.append(s)
+ 
+     def d(self, s):
+-        if isinstance(s, unicode):
+-            s = s.encode('utf-8')
+         self.__docs.append(s)
+ 
+     def do_node(self, node):
+@@ -733,7 +727,7 @@ def have_properties(self, nodes):
+ 
+     def __call__(self):
+         nodes = self.dom.getElementsByTagName('node')
+-        nodes.sort(cmp_by_name)
++        nodes.sort(key=key_by_name)
+ 
+         self.h('#include <glib-object.h>')
+         self.h('#include <dbus/dbus-glib.h>')
+@@ -761,12 +755,12 @@ def __call__(self):
+ 
+         self.h('')
+         self.b('')
+-        file_set_contents(self.basename + '.h', '\n'.join(self.__header))
+-        file_set_contents(self.basename + '.c', '\n'.join(self.__body))
+-        file_set_contents(self.basename + '-gtk-doc.h', '\n'.join(self.__docs))
++        file_set_contents(self.basename + '.h', u('\n').join(self.__header).encode('utf-8'))
++        file_set_contents(self.basename + '.c', u('\n').join(self.__body).encode('utf-8'))
++        file_set_contents(self.basename + '-gtk-doc.h', u('\n').join(self.__docs).encode('utf-8'))
+ 
+ def cmdline_error():
+-    print """\
++    print("""\
+ usage:
+     gen-ginterface [OPTIONS] xmlfile Prefix_
+ options:
+@@ -786,7 +780,7 @@ def cmdline_error():
+             void symbol (DBusGMethodInvocation *context)
+         and return some sort of "not implemented" error via
+             dbus_g_method_return_error (context, ...)
+-"""
++""")
+     sys.exit(1)
+ 
+ 
+diff --git a/tools/glib-gtypes-generator.py b/tools/glib-gtypes-generator.py
+index 21dfc6aa7..1477bd37b 100644
+--- a/tools/glib-gtypes-generator.py
++++ b/tools/glib-gtypes-generator.py
+@@ -23,7 +23,7 @@
+ import sys
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import escape_as_identifier, \
+                            get_docstring, \
+                            NS_TP, \
+@@ -68,13 +68,13 @@ def __init__(self, dom, output, mixed_case_prefix):
+         self.need_other_arrays = {}
+ 
+     def h(self, code):
+-        self.header.append(code.encode("utf-8"))
++        self.header.append(code)
+ 
+     def c(self, code):
+-        self.body.append(code.encode("utf-8"))
++        self.body.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def do_mapping_header(self, mapping):
+         members = mapping.getElementsByTagNameNS(NS_TP, 'member')
+@@ -292,9 +292,9 @@ def __call__(self):
+             self.c('  return t;\n')
+             self.c('}\n\n')
+ 
+-        file_set_contents(self.output + '.h', ''.join(self.header))
+-        file_set_contents(self.output + '-body.h', ''.join(self.body))
+-        file_set_contents(self.output + '-gtk-doc.h', ''.join(self.docs))
++        file_set_contents(self.output + '.h', u('').join(self.header).encode('utf-8'))
++        file_set_contents(self.output + '-body.h', u('').join(self.body).encode('utf-8'))
++        file_set_contents(self.output + '-gtk-doc.h', u('').join(self.docs).encode('utf-8'))
+ 
+ if __name__ == '__main__':
+     argv = sys.argv[1:]
+diff --git a/tools/glib-interfaces-gen.py b/tools/glib-interfaces-gen.py
+index 410762cde..b67d7b4f0 100644
+--- a/tools/glib-interfaces-gen.py
++++ b/tools/glib-interfaces-gen.py
+@@ -3,7 +3,7 @@
+ from sys import argv, stdout, stderr
+ import xml.dom.minidom
+ 
+-from libtpcodegen import file_set_contents
++from libtpcodegen import file_set_contents, u
+ from libglibcodegen import NS_TP, get_docstring, \
+         get_descendant_text, get_by_path
+ 
+@@ -24,22 +24,22 @@ def __init__(self, prefix, implfile, declfile, dom):
+         self.spec = get_by_path(dom, "spec")[0]
+ 
+     def h(self, code):
+-        self.decls.append(code.encode('utf-8'))
++        self.decls.append(code)
+ 
+     def c(self, code):
+-        self.impls.append(code.encode('utf-8'))
++        self.impls.append(code)
+ 
+     def d(self, code):
+-        self.docs.append(code.encode('utf-8'))
++        self.docs.append(code)
+ 
+     def __call__(self):
+         for f in self.h, self.c:
+             self.do_header(f)
+         self.do_body()
+ 
+-        file_set_contents(self.implfile, ''.join(self.impls))
+-        file_set_contents(self.declfile, ''.join(self.decls))
+-        file_set_contents(self.docfile, ''.join(self.docs))
++        file_set_contents(self.implfile, u('').join(self.impls).encode('utf-8'))
++        file_set_contents(self.declfile, u('').join(self.decls).encode('utf-8'))
++        file_set_contents(self.docfile, u('').join(self.docs).encode('utf-8'))
+ 
+     # Header
+     def do_header(self, f):
+diff --git a/tools/gobject-foo.py b/tools/gobject-foo.py
+index 002a290ba..a2abd7667 100644
+--- a/tools/gobject-foo.py
++++ b/tools/gobject-foo.py
+@@ -87,4 +87,4 @@ def gobject_header(head, tail, as_interface=False):
+ 
+     head, tail = argv
+ 
+-    print '\n'.join(gobject_header(head, tail, as_interface=as_interface))
++    print('\n'.join(gobject_header(head, tail, as_interface=as_interface)))
+diff --git a/tools/libglibcodegen.py b/tools/libglibcodegen.py
+index 6a9d21485..0b703a5a8 100644
+--- a/tools/libglibcodegen.py
++++ b/tools/libglibcodegen.py
+@@ -154,7 +154,7 @@ def type_to_gtype(s):
+         return ("GHashTable *", "DBUS_TYPE_G_STRING_STRING_HASHTABLE", "BOXED", False)
+     elif s[:2] == 'a{':  #some arbitrary hash tables
+         if s[2] not in ('y', 'b', 'n', 'q', 'i', 'u', 's', 'o', 'g'):
+-            raise Exception, "can't index a hashtable off non-basic type " + s
++            raise Exception("can't index a hashtable off non-basic type " + s)
+         first = type_to_gtype(s[2])
+         second = type_to_gtype(s[3:-1])
+         return ("GHashTable *", "(dbus_g_type_get_map (\"GHashTable\", " + first[1] + ", " + second[1] + "))", "BOXED", False)
+@@ -169,4 +169,27 @@ def type_to_gtype(s):
+         return ("GValueArray *", gtype, "BOXED", True)
+ 
+     # we just don't know ..
+-    raise Exception, "don't know the GType for " + s
++    raise Exception("don't know the GType for " + s)
++
++
++def copy_into_gvalue(gvaluep, gtype, marshaller, name):
++    if gtype == 'G_TYPE_STRING':
++        return 'g_value_set_string (%s, %s);' % (gvaluep, name)
++    elif marshaller == 'BOXED':
++        return 'g_value_set_boxed (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_UCHAR':
++        return 'g_value_set_uchar (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_BOOLEAN':
++        return 'g_value_set_boolean (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_INT':
++        return 'g_value_set_int (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_UINT':
++        return 'g_value_set_uint (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_INT64':
++        return 'g_value_set_int (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_UINT64':
++        return 'g_value_set_uint64 (%s, %s);' % (gvaluep, name)
++    elif gtype == 'G_TYPE_DOUBLE':
++        return 'g_value_set_double (%s, %s);' % (gvaluep, name)
++    else:
++        raise AssertionError("Don't know how to put %s in a GValue" % gtype)
+diff --git a/tools/libtpcodegen.py b/tools/libtpcodegen.py
+index 7e9eb9a50..99de66340 100644
+--- a/tools/libtpcodegen.py
++++ b/tools/libtpcodegen.py
+@@ -21,6 +21,7 @@
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ 
+ import os
++import sys
+ from string import ascii_letters, digits
+ 
+ 
+@@ -28,6 +29,20 @@
+ 
+ _ASCII_ALNUM = ascii_letters + digits
+ 
++if sys.version_info[0] >= 3:
++    def u(s):
++        """Return s, which must be a str literal with no non-ASCII characters.
++        This is like a more restricted form of the Python 2 u'' syntax.
++        """
++        return s.encode('ascii').decode('ascii')
++else:
++    def u(s):
++        """Return a Unicode version of s, which must be a str literal
++        (a bytestring) in which each byte is an ASCII character.
++        This is like a more restricted form of the u'' syntax.
++        """
++        return s.decode('ascii')
++
+ def file_set_contents(filename, contents):
+     try:
+         os.remove(filename)
+@@ -38,13 +53,15 @@ def file_set_contents(filename, contents):
+     except OSError:
+         pass
+ 
+-    open(filename + '.tmp', 'w').write(contents)
++    open(filename + '.tmp', 'wb').write(contents)
+     os.rename(filename + '.tmp', filename)
+ 
+ def cmp_by_name(node1, node2):
+     return cmp(node1.getAttributeNode("name").nodeValue,
+                node2.getAttributeNode("name").nodeValue)
+ 
++def key_by_name(node):
++    return node.getAttributeNode("name").nodeValue
+ 
+ def escape_as_identifier(identifier):
+     """Escape the given string to be a valid D-Bus object path or service
+@@ -168,6 +185,9 @@ def __init__(self, string):
+         self.remaining = string
+ 
+     def next(self):
++        return self.__next__()
++
++    def __next__(self):
+         if self.remaining == '':
+             raise StopIteration
+ 
+diff --git a/tools/make-version-script.py b/tools/make-version-script.py
+index 0d30aa323..4ced849fe 100644
+--- a/tools/make-version-script.py
++++ b/tools/make-version-script.py
+@@ -63,9 +63,9 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+     if dpkg:
+         assert dpkg_first_line is not None
+-        print dpkg_first_line
++        print(dpkg_first_line)
+         if dpkg_build_depends_package is not None:
+-            print "* Build-Depends-Package: %s" % dpkg_build_depends_package
++            print("* Build-Depends-Package: %s" % dpkg_build_depends_package)
+ 
+     for filename in abifiles:
+         lines = open(filename, 'r').readlines()
+@@ -120,8 +120,8 @@ def main(abifiles, symbols=None, unreleased_version=None,
+         lines = lines[cut:]
+ 
+         if gnuld:
+-            print "%s {" % version
+-            print "    global:"
++            print("%s {" % version)
++            print("    global:")
+ 
+         for symbol in lines:
+             symbol = symbol.strip()
+@@ -130,7 +130,7 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 continue
+ 
+             if gnuld:
+-                print "        %s;" % symbol
++                print("        %s;" % symbol)
+             elif dpkg:
+                 dpkg_symbols.append('%s@%s %s' % (symbol, version, release))
+ 
+@@ -142,22 +142,22 @@ def main(abifiles, symbols=None, unreleased_version=None,
+ 
+         if gnuld:
+             if extends == '-':
+-                print "    local:"
+-                print "        *;"
+-                print "};"
++                print("    local:")
++                print("        *;")
++                print("};")
+             else:
+-                print "} %s;" % extends
+-                print
++                print("} %s;" % extends)
++                print("")
+ 
+     if dpkg:
+         dpkg_symbols.sort()
+         dpkg_versions.sort()
+ 
+         for x in dpkg_versions:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+         for x in dpkg_symbols:
+-            print " %s" % x
++            print(" %s" % x)
+ 
+     if symbol_set is not None:
+         missing = versioned_symbols - symbol_set
+@@ -182,13 +182,13 @@ def main(abifiles, symbols=None, unreleased_version=None,
+                 raise SystemExit(1)
+ 
+             if gnuld:
+-                print "%s {" % unreleased_version
+-                print "    global:"
++                print("%s {" % unreleased_version)
++                print("    global:")
+ 
+                 for symbol in unreleased:
+-                    print "        %s;" % symbol
++                    print("        %s;" % symbol)
+ 
+-                print "} %s;" % version
++                print("} %s;" % version)
+ 
+ 
+ if __name__ == '__main__':
+diff --git a/tools/xincludator.py b/tools/xincludator.py
+index 63e106ace..f9ed49ce4 100644
+--- a/tools/xincludator.py
++++ b/tools/xincludator.py
+@@ -1,17 +1,19 @@
+ #!/usr/bin/python
+ 
++import sys
+ from sys import argv, stdout, stderr
+ import codecs, locale
+ import os
+ import xml.dom.minidom
+ 
+-stdout = codecs.getwriter('utf-8')(stdout)
++if sys.version_info[0] < 3:
++    stdout = codecs.getwriter('utf-8')(stdout)
+ 
+ NS_XI = 'http://www.w3.org/2001/XInclude'
+ 
+ def xincludate(dom, base, dropns = []):
+     remove_attrs = []
+-    for i in xrange(dom.documentElement.attributes.length):
++    for i in range(dom.documentElement.attributes.length):
+         attr = dom.documentElement.attributes.item(i)
+         if attr.prefix == 'xmlns':
+             if attr.localName in dropns:
+@@ -34,6 +36,11 @@ def xincludate(dom, base, dropns = []):
+     argv = argv[1:]
+     dom = xml.dom.minidom.parse(argv[0])
+     xincludate(dom, argv[0])
+-    xml = dom.toxml()
++
++    if sys.version_info[0] >= 3:
++        xml = dom.toxml(encoding=None)
++    else:
++        xml = dom.toxml()
++
+     stdout.write(xml)
+     stdout.write('\n')
+--- a/plugins/telepathy-gabble-xmpp-console
++++ b/plugins/telepathy-gabble-xmpp-console
+@@ -313,12 +313,12 @@
+             CONN_FUTURE_IFACE, None)
+         try:
+             sidecar_path, _ = conn_future_proxy.EnsureSidecar('(s)', CONSOLE_IFACE)
+-        except Exception, e:
+-            print """
++        except Exception as e:
++            print("""
+ Couldn't connect to the XMPP console interface on '%(connection_bus_name)s':
+   %(e)s
+ Check that it's a running Jabber connection, and that you have the console
+-plugin installed.""" % locals()
++plugin installed.""" % locals())
+ 
+             raise SystemExit(2)
+ 
+@@ -357,7 +357,7 @@
+ ACCOUNT_IFACE = 'org.freedesktop.Telepathy.Account'
+ 
+ def usage():
+-    print """
++    print("""
+ Usage:
+ 
+   %(arg0)s gabble/jabber/blahblah
+@@ -367,7 +367,7 @@
+ List connection bus names using `qdbus | grep gabble`.
+ """ % { 'arg0': sys.argv[0],
+         'prefix': GABBLE_PREFIX,
+-      }
++      })
+     raise SystemExit(1)
+ 
+ if __name__ == '__main__':
+@@ -385,7 +385,7 @@
+             ACCOUNT_IFACE, None)
+         path = account_proxy.get_cached_property('Connection').get_string()
+         if path == '/':
+-            print "%s is not online" % thing
++            print("%s is not online" % thing)
+             raise SystemExit(1)
+         else:
+             thing = nameify(path)
diff --git a/srcpkgs/telepathy-gabble/template b/srcpkgs/telepathy-gabble/template
index 2bde648f265c4..b0b1aaed6e1b8 100644
--- a/srcpkgs/telepathy-gabble/template
+++ b/srcpkgs/telepathy-gabble/template
@@ -1,11 +1,11 @@
 # Template file for 'telepathy-gabble'
 pkgname=telepathy-gabble
 version=0.18.4
-revision=3
+revision=4
 build_style=gnu-configure
 configure_args="--with-ca-certificates=/etc/ssl/certs/ca-certificates.crt
  --enable-handle-leak-debug --disable-debug --disable-static"
-hostmakedepends="python pkg-config libxslt"
+hostmakedepends="python3 pkg-config libxslt"
 makedepends="glib-devel dbus-glib-devel libxml2-devel
  sqlite-devel gnutls-devel telepathy-glib-devel libsoup-devel
  libnice-devel ca-certificates"
@@ -14,8 +14,8 @@ short_desc="Jabber/XMPP connection manager for Telepathy"
 maintainer="Orphaned <orphan@voidlinux.org>"
 license="LGPL-2.1-or-later"
 homepage="https://telepathy.freedesktop.org"
-distfiles="$homepage/releases/$pkgname/$pkgname-$version.tar.gz"
+distfiles="https://telepathy.freedesktop.org/releases/telepathy-gabble/telepathy-gabble-$version.tar.gz"
 checksum=115c91572c72d4a40f0b25b606167b4f2f09441dc7bf1036ccbb1450f1a4969c
-python_version=2
+python_version=3
 nocross=yes
 lib32disabled=yes

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PR PATCH] [Merged]: telepathy suite: python3ise everything
  2023-10-08  4:54 [PR PATCH] telepathy suite: python3ise everything classabbyamp
                   ` (3 preceding siblings ...)
  2023-10-09 23:36 ` [PR PATCH] [Updated] " classabbyamp
@ 2023-10-10  0:33 ` classabbyamp
  4 siblings, 0 replies; 6+ messages in thread
From: classabbyamp @ 2023-10-10  0:33 UTC (permalink / raw)
  To: ml

[-- Attachment #1: Type: text/plain, Size: 629 bytes --]

There's a merged pull request on the void-packages repository

telepathy suite: python3ise everything
https://github.com/void-linux/void-packages/pull/46516

Description:
- telepathy-qt5: update to 0.9.8.
- telepathy-farstream: doesn't need python
- telepathy-logger: make codegen work with python3
- telepathy-haze: update to 0.8.1.
- telepathy-salut: make codegen work with python3
- telepathy-gabble: patch for python3

<!-- Uncomment relevant sections and delete options which are not applicable -->

#### Testing the changes
- I tested the changes in this PR: **briefly** (builds)

cc @duncaen, a couple of these are yours


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-10-10  0:33 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-08  4:54 [PR PATCH] telepathy suite: python3ise everything classabbyamp
2023-10-08 12:56 ` Duncaen
2023-10-08 18:53 ` classabbyamp
2023-10-08 19:05 ` classabbyamp
2023-10-09 23:36 ` [PR PATCH] [Updated] " classabbyamp
2023-10-10  0:33 ` [PR PATCH] [Merged]: " classabbyamp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).