Package: python-inotifyx
Severity: important
Tags: patch

Dear Maintainer,

I've updated inotifyx to build a python3 package (tested with python3.5
on debian stretch).

Thanks,

Brian
-- System Information:
Debian Release: 8.7
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB.utf8, LC_CTYPE=en_GB.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
>From a0cf60121148f3ceb19ac68803418137955a012c Mon Sep 17 00:00:00 2001
From: Brian Russell <[email protected]>
Date: Mon, 27 Feb 2017 12:21:15 +0000
Subject: [PATCH 2/4] update C binding for python3

Update the module init for python3. This is required for version
3.5 onwards.
---
 inotifyx/binding.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/inotifyx/binding.c b/inotifyx/binding.c
index 95082ce..ef0094a 100644
--- a/inotifyx/binding.c
+++ b/inotifyx/binding.c
@@ -44,6 +44,9 @@
 #define EVENT_SIZE (sizeof (struct inotify_event))
 #define BUF_LEN (1024 * (EVENT_SIZE + 16))
 
+#if PY_MAJOR_VERSION >= 3
+#define IS_PY3
+#endif
 
 static PyObject * inotifyx_init(PyObject *self, PyObject *args) {
     int fd;
@@ -262,7 +265,25 @@ static PyMethodDef InotifyMethods[] = {
   {NULL, NULL, 0, NULL}
 };
 
+#ifdef IS_PY3
+static struct PyModuleDef inotifybinding =
+{
+  PyModuleDef_HEAD_INIT,
+  "inotifyx.binding",
+  (
+    "Low-level interface to inotify.  Do not use this module directly.\n"
+    "Instead, use the inotifyx module."
+  ),
+  -1,
+  InotifyMethods
+};
+
+PyMODINIT_FUNC PyInit_binding(void) {
+    PyObject *module = PyModule_Create(&inotifybinding);
 
+     if (module == NULL)
+        return NULL;
+#else
 PyMODINIT_FUNC initbinding(void) {
     PyObject* module = Py_InitModule3(
       "inotifyx.binding",
@@ -275,6 +296,7 @@ PyMODINIT_FUNC initbinding(void) {
 
     if (module == NULL)
         return;
+#endif
     
     PyModule_AddIntConstant(module, "IN_ACCESS", IN_ACCESS);
     PyModule_AddIntConstant(module, "IN_MODIFY", IN_MODIFY);
@@ -299,4 +321,7 @@ PyMODINIT_FUNC initbinding(void) {
     PyModule_AddIntConstant(module, "IN_ISDIR", IN_ISDIR);
     PyModule_AddIntConstant(module, "IN_ONESHOT", IN_ONESHOT);
     PyModule_AddIntConstant(module, "IN_ALL_EVENTS", IN_ALL_EVENTS);
+#ifdef IS_PY3
+    return module;
+#endif
 }
-- 
2.1.4

>From d2ffb3aa85fba9c288c892c3a2268647e5fa88ac Mon Sep 17 00:00:00 2001
From: Luca Boccassi <[email protected]>
Date: Fri, 24 Feb 2017 17:38:58 +0000
Subject: [PATCH 4/4] Add initial python3 support

Build and package for both python2 and python3.
---
 debian/control | 25 ++++++++++++++++++++++++-
 debian/rules   |  2 +-
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/debian/control b/debian/control
index cf17152..bf4414e 100644
--- a/debian/control
+++ b/debian/control
@@ -3,9 +3,10 @@ Section: python
 Priority: optional
 Maintainer: Ritesh Raj Sarraf <[email protected]>
 Uploaders: Debian Python Modules Team <[email protected]>
-Build-Depends: debhelper (>= 9), python-all-dev (>= 2.6.6-3~), dh-python
+Build-Depends: debhelper (>= 9), python-all-dev (>= 2.6.6-3~), python3-all-dev, dh-python
 Standards-Version: 3.9.2
 X-Python-Version: >= 2.7
+X-Python3-Version: >= 3.2
 Vcs-Git: https://anonscm.debian.org/git/python-modules/packages/inotifyx.git
 Vcs-Browser: https://anonscm.debian.org/cgit/python-modules/packages/inotifyx.git
 Homepage: http://www.alittletooquiet.net/software/inotifyx/
@@ -31,3 +32,25 @@ Description: simple Python binding to the Linux inotify
   * The API provided by pyinotify seems to change in incompatible ways on a
     fairly regular basis and with little justification. inotifyx has a simple
     API that will change rarely, if ever.
+
+Package: python3-inotifyx
+Architecture: any
+Depends: ${python3:Depends}, ${shlibs:Depends}, ${misc:Depends}
+Provides: ${python3:Provides}
+X-Python3-Version: >= 3.2
+Description: simple Python binding to the Linux inotify
+ inotifyx is a Python extension providing access to the Linux
+ inotify file system event notification API. It is primarily
+ written in C but has some Python window dressing
+ .
+ inotifyx exists as an alternative to the much known pyinotify bindings
+ .
+ Reasons you might choose inotifyx over pyinotify
+  * inotifyx is a C extension and does not use ctypes, making it
+    faster and less prone to subtle breakage due to changes in the inotify API
+  * inotifyx is a much thinner wrapper around inotify. pyinotify is more
+    complicated. It does provide features that inotifyx does not, but many of
+    them are not needed by most applications
+  * The API provided by pyinotify seems to change in incompatible ways on a
+    fairly regular basis and with little justification. inotifyx has a simple
+    API that will change rarely, if ever.
diff --git a/debian/rules b/debian/rules
index 32b1ae2..36fc8eb 100755
--- a/debian/rules
+++ b/debian/rules
@@ -9,4 +9,4 @@ get-orig-source:
 	uscan --force-download --rename --download-version=$(PKG_VER) --destdir=.
 
 %:
-	dh $@ --with python2 --buildsystem=pybuild
+	dh $@ --with python2,python3 --buildsystem=pybuild
-- 
2.1.4

>From 1f0197385d4f9848aa3a128865466ccb062c7a72 Mon Sep 17 00:00:00 2001
From: Luca Boccassi <[email protected]>
Date: Fri, 24 Feb 2017 17:37:13 +0000
Subject: [PATCH 3/4] Convert to dh-python2 and debhelper 9 format

In order to support both python2 and python3 builds out of the box we
need to modernize the packaging a bit.
Use debhelper 9 and dh-python2 and set the build system to pybuilder
with distutils.
The resulting package is the same as the previous one.
---
 debian/compat  |  2 +-
 debian/control |  4 +++-
 debian/rules   | 63 ++++------------------------------------------------------
 3 files changed, 8 insertions(+), 61 deletions(-)

diff --git a/debian/compat b/debian/compat
index 7f8f011..ec63514 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-7
+9
diff --git a/debian/control b/debian/control
index c59966c..cf17152 100644
--- a/debian/control
+++ b/debian/control
@@ -3,8 +3,9 @@ Section: python
 Priority: optional
 Maintainer: Ritesh Raj Sarraf <[email protected]>
 Uploaders: Debian Python Modules Team <[email protected]>
-Build-Depends: debhelper (>= 7), python-all-dev (>= 2.6.6-3~)
+Build-Depends: debhelper (>= 9), python-all-dev (>= 2.6.6-3~), dh-python
 Standards-Version: 3.9.2
+X-Python-Version: >= 2.7
 Vcs-Git: https://anonscm.debian.org/git/python-modules/packages/inotifyx.git
 Vcs-Browser: https://anonscm.debian.org/cgit/python-modules/packages/inotifyx.git
 Homepage: http://www.alittletooquiet.net/software/inotifyx/
@@ -12,6 +13,7 @@ Homepage: http://www.alittletooquiet.net/software/inotifyx/
 Package: python-inotifyx
 Architecture: any
 Depends: ${python:Depends}, ${shlibs:Depends}, ${misc:Depends}
+X-Python-Version: >= 2.
 Provides: ${python:Provides}
 Description: simple Python binding to the Linux inotify
  inotifyx is a Python extension providing access to the Linux
diff --git a/debian/rules b/debian/rules
index 9786d05..32b1ae2 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,67 +1,12 @@
 #!/usr/bin/make -f
 
-PKG_NAME=inotifyx
 PKG_VER=$(shell dpkg-parsechangelog | sed -rne 's,^Version: ([^-]+).*,\1,p')
 
-PYVERS=$(shell pyversions -vr)
-
--include /usr/share/python/python.mk
+export PYBUILD_NAME = inotifyx
+export PYBUILD_SYSTEM = distutils
 
 get-orig-source:
 	uscan --force-download --rename --download-version=$(PKG_VER) --destdir=.
 
-build: build-arch build-indep
-
-build-arch: $(PYVERS:%=build-python%)
-	touch $@
-
-build-indep: $(PYVERS:%=build-python%)
-	touch $@
-
-build-python%:
-	dh_testdir
-	python$* setup.py build
-	touch $@
-
-clean: $(PYVERS:%=clean-python%)
-	touch $@
-
-clean-python%: 
-	dh_testdir
-	dh_testroot
-
-	python$* setup.py clean --all
-	[ ! -e html ] || rm -rf html
-	[ ! -f setuplib.pyc ] || rm -rf setuplib.pyc
-
-	dh_clean 
-
-install: $(PYVERS:%=install-python%)
-	touch $@
-
-install-python%: build
-	dh_testdir
-	dh_testroot
-	dh_installdirs
-
-	python$* setup.py install --root $(CURDIR)/debian/python-inotifyx ${py_setup_install_args}
-
-binary-indep: build install
-
-binary-arch: build install
-		dh_testdir
-		dh_testroot
-		dh_installdocs
-		dh_installchangelogs NEWS
-		dh_python2
-		dh_compress
-		dh_fixperms
-		dh_strip
-		dh_installdeb
-		dh_shlibdeps
-		dh_gencontrol
-		dh_md5sums
-		dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install get-orig-source
+%:
+	dh $@ --with python2 --buildsystem=pybuild
-- 
2.1.4

>From 6273caed4b42acad700560d30ddad1daf382dde5 Mon Sep 17 00:00:00 2001
From: Brian Russell <[email protected]>
Date: Fri, 24 Feb 2017 17:01:41 +0000
Subject: [PATCH 1/4] python3 compatibility

Automated 2to3 changes plus manual fixup to make the code
python3 compatible.
---
 inotifyx/__init__.py |  6 +++---
 setup.py             |  4 ++--
 setuplib.py          | 12 ++++++------
 tests/__init__.py    |  2 +-
 tests/manager.py     |  4 ++--
 5 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/inotifyx/__init__.py b/inotifyx/__init__.py
index df10385..fcfaa04 100644
--- a/inotifyx/__init__.py
+++ b/inotifyx/__init__.py
@@ -95,7 +95,7 @@ class InotifyEvent(object):
         '''
 
         parts = []
-        for name, value in constants.items():
+        for name, value in list(constants.items()):
             if self.mask & value:
                 parts.append(name)
         if parts:
@@ -124,7 +124,7 @@ if __name__ == '__main__':
     import sys
 
     if len(sys.argv) == 1:
-        print >>sys.stderr, 'usage: inotify path [path ...]'
+        sys.stderr.write('usage: inotify path [path ...]')
         sys.exit(1)
 
     paths = sys.argv[1:]
@@ -146,7 +146,7 @@ if __name__ == '__main__':
                     parts = [event.get_mask_description()]
                     if event.name:
                         parts.append(event.name)
-                    print '%s: %s' % (path, ' '.join(parts))
+                    print('%s: %s' % (path, ' '.join(parts)))
         except KeyboardInterrupt:
             pass
 
diff --git a/setup.py b/setup.py
index 5564aba..bbd64c1 100755
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
 # Author: Forest Bond <[email protected]>
 # This file is in the public domain.
 
-import os, sys, commands
+import os, sys, subprocess
 from distutils.core import Extension
 
 
@@ -22,7 +22,7 @@ def get_version(release_file):
         finally:
             f.close()
     except (IOError, OSError):
-        status, output = commands.getstatusoutput('bzr revno')
+        status, output = subprocess.getstatusoutput('bzr revno')
         if status == 0:
             return 'bzr%s' % output.strip()
     return 'unknown'
diff --git a/setuplib.py b/setuplib.py
index cbfd67b..bbd6c74 100644
--- a/setuplib.py
+++ b/setuplib.py
@@ -1,7 +1,7 @@
 # Author: Forest Bond <[email protected]>
 # This file is in the public domain.
 
-from __future__ import with_statement
+
 
 import os, sys, shutil
 from tempfile import mkdtemp
@@ -216,8 +216,8 @@ class _DistinfoMixin:
 
     def _prepare_distinfo_string(self, value):
         if isinstance(value, str):
-            value = unicode(value)
-        return unicode(repr(value)).encode('utf-8')
+            value = str(value)
+        return str(repr(value)).encode('utf-8')
 
     def _write_distinfo_module(self, outfile, distinfo = (), imports = ()):
         distinfo = list(distinfo)
@@ -236,7 +236,7 @@ class _DistinfoMixin:
             log.info(' %s = %s', k, v)
 
         if not self.dry_run:
-            with open(outfile, 'wb') as f:
+            with open(outfile, 'w') as f:
                 f.write('# coding: utf-8\n')
                 f.write('\n')
                 for modname in imports:
@@ -359,8 +359,8 @@ class install_data(_install_data):
 
     def _gen_data_files(self, base_dir, data_files):
         for arg in data_files:
-            print arg
-            if isinstance(arg, basestring):
+            print(arg)
+            if isinstance(arg, str):
                 yield (base_dir, [arg])
             else:
                 subdir, filenames = arg
diff --git a/tests/__init__.py b/tests/__init__.py
index 4c2d77e..3537ebb 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -46,4 +46,4 @@ def main(**kwargs):
 
 def print_names(test_names = None):
     from tests.manager import manager
-    print '\n'.join(manager.get_names(test_names))
+    print('\n'.join(manager.get_names(test_names)))
diff --git a/tests/manager.py b/tests/manager.py
index 804ec12..a05f156 100644
--- a/tests/manager.py
+++ b/tests/manager.py
@@ -77,7 +77,7 @@ class TestManager(object):
             import coverage as _coverage
 
             if int(_coverage.__version__.split('.')[0]) < 3:
-                print >>sys.stderr, (
+                sys.stderr.write(
                   'warning: coverage versions < 3 '
                   'are known to produce imperfect results'
                 )
@@ -94,7 +94,7 @@ class TestManager(object):
             for test in self.tests:
                 if self.should_run_test(test, test_names):
                     if print_only:
-                        print test.id()
+                        print(test.id())
                     else:
                         suite.addTest(test)
 
-- 
2.1.4

Reply via email to