summaryrefslogtreecommitdiffstats
path: root/debian/patches/0011-Update-irkerhook.py-to-work-under-python-3.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/0011-Update-irkerhook.py-to-work-under-python-3.patch')
-rw-r--r--debian/patches/0011-Update-irkerhook.py-to-work-under-python-3.patch230
1 files changed, 230 insertions, 0 deletions
diff --git a/debian/patches/0011-Update-irkerhook.py-to-work-under-python-3.patch b/debian/patches/0011-Update-irkerhook.py-to-work-under-python-3.patch
new file mode 100644
index 0000000..65ad25e
--- /dev/null
+++ b/debian/patches/0011-Update-irkerhook.py-to-work-under-python-3.patch
@@ -0,0 +1,230 @@
+From: Neil Muller <drnlmuller+debian@gmail.com>
+Date: Sun, 13 May 2018 15:11:50 +0200
+Subject: Update irkerhook.py to work under python 3.
+
+This allows irkerhook.py to be used in a python 3 only setup.
+Due to the state of mercurial's python 3 support, irkerhook.py
+only supports git and svn repositories when used with python 3.
+
+Patch-Name: 0011-irkerhook_python3_support.patch
+Forwarded: https://gitlab.com/esr/irker/merge_requests/19
+---
+ irkerhook.py | 65 ++++++++++++++++++++++++++++++++++++++++++-----------------
+ irkerhook.xml | 3 +++
+ 2 files changed, 49 insertions(+), 19 deletions(-)
+
+diff --git a/irkerhook.py b/irkerhook.py
+index d32b742..fdc8d91 100755
+--- a/irkerhook.py
++++ b/irkerhook.py
+@@ -18,12 +18,14 @@
+ # does not override it.
+ #
+ # SPDX-License-Identifier: BSD-2-Clause
++from __future__ import print_function, absolute_import
++
+ default_server = "localhost"
+ IRKER_PORT = 6659
+
+ # The default service used to turn your web-view URL into a tinyurl so it
+ # will take up less space on the IRC notification line.
+-default_tinyifier = "http://tinyurl.com/api-create.php?url="
++default_tinyifier = u"http://tinyurl.com/api-create.php?url="
+
+ # Map magic urlprefix values to actual URL prefixes.
+ urlprefixmap = {
+@@ -33,7 +35,7 @@ urlprefixmap = {
+ }
+
+ # By default, ship to the freenode #commits list
+-default_channels = "irc://chat.freenode.net/#commits"
++default_channels = u"irc://chat.freenode.net/#commits"
+
+ #
+ # No user-serviceable parts below this line:
+@@ -41,14 +43,25 @@ default_channels = "irc://chat.freenode.net/#commits"
+
+ version = "2.17"
+
+-import os, sys, socket, urllib2, subprocess, locale, datetime, re
++import os, sys, socket, subprocess, locale, datetime, re
+ from pipes import quote as shellquote
+
++try:
++ from urllib2 import urlopen, HTTPError
++except ImportError:
++ from urllib.error import HTTPError
++ from urllib.request import urlopen
++
+ try:
+ import simplejson as json # Faster, also makes us Python-2.5-compatible
+ except ImportError:
+ import json
+
++if sys.version_info.major == 2:
++ string_type = unicode
++else:
++ string_type = str
++
+ try:
+ getstatusoutput = subprocess.getstatusoutput
+ except AttributeError:
+@@ -56,7 +69,10 @@ except AttributeError:
+ getstatusoutput = commands.getstatusoutput
+
+ def do(command):
+- return unicode(getstatusoutput(command)[1], locale.getlocale()[1] or 'UTF-8').encode(locale.getlocale()[1] or 'UTF-8')
++ if sys.version_info.major == 2:
++ return string_type(getstatusoutput(command)[1], locale.getlocale()[1] or 'UTF-8')
++ else:
++ return getstatusoutput(command)[1]
+
+ class Commit:
+ def __init__(self, extractor, commit):
+@@ -72,7 +88,14 @@ class Commit:
+ self.author_date = None
+ self.commit_date = None
+ self.__dict__.update(extractor.__dict__)
+- def __unicode__(self):
++
++ if sys.version_info.major == 2:
++ # Convert __str__ to __unicode__ for python 2
++ self.__unicode__ = self.__str__
++ # Not really needed, but maybe useful for debugging
++ self.__str__ = lambda x: x.__unicode__().encode('utf-8')
++
++ def __str__(self):
+ "Produce a notification string from this commit."
+ if self.urlprefix.lower() == "none":
+ self.url = ""
+@@ -81,12 +104,12 @@ class Commit:
+ webview = (urlprefix % self.__dict__) + self.commit
+ try:
+ # See it the url is accessible
+- res = urllib2.urlopen(webview)
++ res = urlopen(webview)
+ if self.tinyifier and self.tinyifier.lower() != "none":
+ try:
+ # Didn't get a retrieval error on the web
+ # view, so try to tinyify a reference to it.
+- self.url = urllib2.urlopen(self.tinyifier + webview).read()
++ self.url = urlopen(self.tinyifier + webview).read()
+ try:
+ self.url = self.url.decode('UTF-8')
+ except UnicodeError:
+@@ -95,7 +118,7 @@ class Commit:
+ self.url = webview
+ else:
+ self.url = webview
+- except urllib2.HTTPError as e:
++ except HTTPError as e:
+ if e.code == 401:
+ # Authentication error, so we assume the view is valid
+ self.url = webview
+@@ -104,7 +127,7 @@ class Commit:
+ except IOError:
+ self.url = ""
+ res = self.template % self.__dict__
+- return unicode(res, 'UTF-8') if not isinstance(res, unicode) else res
++ return string_type(res, 'UTF-8') if not isinstance(res, string_type) else res
+
+ class GenericExtractor:
+ "Generic class for encapsulating data from a VCS."
+@@ -239,10 +262,10 @@ class GitExtractor(GenericExtractor):
+ self.channels = do("git config --get irker.channels")
+ self.email = do("git config --get irker.email")
+ self.tcp = do("git config --bool --get irker.tcp")
+- self.template = do("git config --get irker.template") or '%(bold)s%(project)s:%(reset)s %(green)s%(author)s%(reset)s %(repo)s:%(yellow)s%(branch)s%(reset)s * %(bold)s%(rev)s%(reset)s / %(bold)s%(files)s%(reset)s: %(logmsg)s %(brown)s%(url)s%(reset)s'
++ self.template = do("git config --get irker.template") or u'%(bold)s%(project)s:%(reset)s %(green)s%(author)s%(reset)s %(repo)s:%(yellow)s%(branch)s%(reset)s * %(bold)s%(rev)s%(reset)s / %(bold)s%(files)s%(reset)s: %(logmsg)s %(brown)s%(url)s%(reset)s'
+ self.tinyifier = do("git config --get irker.tinyifier") or default_tinyifier
+ self.color = do("git config --get irker.color")
+- self.urlprefix = do("git config --get irker.urlprefix") or "gitweb"
++ self.urlprefix = do("git config --get irker.urlprefix") or u"gitweb"
+ self.cialike = do("git config --get irker.cialike")
+ self.filtercmd = do("git config --get irker.filtercmd")
+ # These are git-specific
+@@ -434,6 +457,10 @@ extractors = [GitExtractor, HgExtractor, SvnExtractor]
+
+ # VCS-dependent code ends here
+
++def convert_message(message):
++ """Convert the message to bytes to send to the socket"""
++ return message.encode(locale.getlocale()[1] or 'UTF-8') + b'\n'
++
+ def ship(extractor, commit, debug):
+ "Ship a notification for the specified commit."
+ metadata = extractor.commit_factory(commit)
+@@ -441,7 +468,7 @@ def ship(extractor, commit, debug):
+ # This is where we apply filtering
+ if extractor.filtercmd:
+ cmd = '%s %s' % (shellquote(extractor.filtercmd),
+- shellquote(json.dumps(metadata.__dict__)))
++ shellquote(json.dumps(metadata.__dict__)))
+ data = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read()
+ try:
+ metadata.__dict__.update(json.loads(data))
+@@ -466,10 +493,10 @@ def ship(extractor, commit, debug):
+ # purposes the commit text is more important. If it's still too long
+ # there's nothing much can be done other than ship it expecting the IRC
+ # server to truncate.
+- privmsg = unicode(metadata)
++ privmsg = string_type(metadata)
+ if len(privmsg) > 510:
+ metadata.files = ""
+- privmsg = unicode(metadata)
++ privmsg = string_type(metadata)
+
+ # Anti-spamming guard. It's deliberate that we get maxchannels not from
+ # the user-filtered metadata but from the extractor data - means repo
+@@ -481,7 +508,7 @@ def ship(extractor, commit, debug):
+ # Ready to ship.
+ message = json.dumps({"to": channels, "privmsg": privmsg})
+ if debug:
+- print message
++ print(message)
+ elif channels:
+ try:
+ if extractor.email:
+@@ -503,16 +530,16 @@ Subject: irker json
+ try:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.connect((extractor.server or default_server, IRKER_PORT))
+- sock.sendall(message + "\n")
++ sock.sendall(convert_message(message))
+ finally:
+ sock.close()
+ else:
+ try:
+ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+- sock.sendto(message + "\n", (extractor.server or default_server, IRKER_PORT))
++ sock.sendto(convert_message(message), (extractor.server or default_server, IRKER_PORT))
+ finally:
+ sock.close()
+- except socket.error, e:
++ except socket.error as e:
+ sys.stderr.write("%s\n" % e)
+
+ if __name__ == "__main__":
+@@ -523,7 +550,7 @@ if __name__ == "__main__":
+ if arg == '-n':
+ notify = False
+ elif arg == '-V':
+- print "irkerhook.py: version", version
++ print("irkerhook.py: version", version)
+ sys.exit(0)
+ elif arg.startswith("--repository="):
+ repository = arg[13:]
+diff --git a/irkerhook.xml b/irkerhook.xml
+index efb4bc1..2160166 100644
+--- a/irkerhook.xml
++++ b/irkerhook.xml
+@@ -174,6 +174,9 @@ are available as %() substitutions.</para>
+ </varlistentry>
+ </variablelist>
+
++<para>irkerhook.py will run under both python 2 and python 3, but it does
++not support mercurial repositories under python 3 yet.</para>
++
+ <refsect2 id="git"><title>git</title>
+
+ <para>Under git, the normal way to invoke this hook (from within the