--- /dev/null
+# https://github.com/smontanaro/pylockfile/commit/379fa0b6131995f96f5bd048906fc0bd3c2527f7
+# https://github.com/smontanaro/pylockfile/commit/eeead7d35e9a97b457b90edd241fd031df68d57b
+# https://github.com/smontanaro/pylockfile/commit/bf2627a5b9f83e1bbcf1b5030a693acb6236a211
+--- a/lockfile/__init__.py
++++ b/lockfile/__init__.py
+@@ -1,4 +1,3 @@
+-
+ """
+ lockfile.py - Platform-independent advisory file locks.
+
+@@ -50,6 +49,8 @@ Exceptions:
+ NotMyLock - File was locked but not by the current thread/process
+ """
+
++from __future__ import absolute_import
++
+ import sys
+ import socket
+ import os
+@@ -257,7 +258,7 @@ def LinkFileLock(*args, **kwds):
+ Do not use in new code. Instead, import LinkLockFile from the
+ lockfile.linklockfile module.
+ """
+- import linklockfile
++ from . import linklockfile
+ return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile",
+ *args, **kwds)
+
+@@ -267,7 +268,7 @@ def MkdirFileLock(*args, **kwds):
+ Do not use in new code. Instead, import MkdirLockFile from the
+ lockfile.mkdirlockfile module.
+ """
+- import mkdirlockfile
++ from . import mkdirlockfile
+ return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile",
+ *args, **kwds)
+
+@@ -277,7 +278,7 @@ def SQLiteFileLock(*args, **kwds):
+ Do not use in new code. Instead, import SQLiteLockFile from the
+ lockfile.mkdirlockfile module.
+ """
+- import sqlitelockfile
++ from . import sqlitelockfile
+ return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile",
+ *args, **kwds)
+
+@@ -306,10 +307,10 @@ def locked(path, timeout=None):
+ return decor
+
+ if hasattr(os, "link"):
+- import linklockfile as _llf
++ from . import linklockfile as _llf
+ LockFile = _llf.LinkLockFile
+ else:
+- import mkdirlockfile as _mlf
++ from . import mkdirlockfile as _mlf
+ LockFile = _mlf.MkdirLockFile
+
+ FileLock = LockFile
+diff --git a/lockfile/pidlockfile.py b/lockfile/pidlockfile.py
+index 3fc8f63..a965ba8 100644
+--- a/lockfile/pidlockfile.py
++++ b/lockfile/pidlockfile.py
+@@ -78,7 +78,7 @@ class PIDLockFile(LockBase):
+ while True:
+ try:
+ write_pid_to_pidfile(self.path)
+- except OSError, exc:
++ except OSError as exc:
+ if exc.errno == errno.EEXIST:
+ # The lock creation failed. Maybe sleep a bit.
+ if timeout is not None and time.time() > end_time:
+@@ -159,7 +159,7 @@ def write_pid_to_pidfile(pidfile_path):
+
+ """
+ open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY)
+- open_mode = 0644
++ open_mode = 0o644
+ pidfile_fd = os.open(pidfile_path, open_flags, open_mode)
+ pidfile = os.fdopen(pidfile_fd, 'w')
+
+@@ -186,7 +186,7 @@ def remove_existing_pidfile(pidfile_path):
+ """
+ try:
+ os.remove(pidfile_path)
+- except OSError, exc:
++ except OSError as exc:
+ if exc.errno == errno.ENOENT:
+ pass
+ else:
+diff --git a/lockfile/sqlitelockfile.py b/lockfile/sqlitelockfile.py
+index ec75490..d596229 100644
+--- a/lockfile/sqlitelockfile.py
++++ b/lockfile/sqlitelockfile.py
+@@ -3,6 +3,11 @@ from __future__ import absolute_import, division
+ import time
+ import os
+
++try:
++ unicode
++except NameError:
++ unicode = str
++
+ from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked
+
+ class SQLiteLockFile(LockBase):
+
--- /dev/null
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+
+PYTHON_COMPAT=( python2_7 python3_{3,4,5} pypy pypy3 )
+
+inherit distutils-r1
+
+DESCRIPTION="Platform-independent file locking module"
+HOMEPAGE="https://launchpad.net/pylockfile https://pypi.python.org/pypi/lockfile"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"
+IUSE="doc test"
+
+DEPEND="
+ dev-python/pbr[${PYTHON_USEDEP}]
+ doc? ( dev-python/sphinx[${PYTHON_USEDEP}] )
+ test? ( dev-python/nose[${PYTHON_USEDEP}] )"
+RDEPEND=""
+
+DOCS=( ACKS README RELEASE-NOTES )
+
+python_compile_all() {
+ if use doc; then
+ einfo "Generation of documentation"
+ emake -C doc/source html || die "Generation of documentation failed"
+ fi
+}
+
+python_test() {
+ # "${PYTHON}" test/test_lockfile.py yeilds no informative coverage output
+ nosetests || die "test_lockfile failed under ${EPYTHON}"
+}
+
+python_install_all() {
+ use doc && local HTML_DOCS=( doc/source/.build/html/. )
+ distutils-r1_python_install_all
+}
--- /dev/null
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+# py2.5 dropped; Test file reveals py2.5 can't support a core file
+PYTHON_COMPAT=( python{2_7,3_3,3_4} pypy )
+
+inherit distutils-r1
+
+DESCRIPTION="Platform-independent file locking module"
+HOMEPAGE="https://code.google.com/p/pylockfile/ https://pypi.python.org/pypi/lockfile http://smontanaro.dyndns.org/python/"
+SRC_URI="https://pylockfile.googlecode.com/files/${P}.tar.gz"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="amd64 arm ppc ~sparc x86"
+IUSE="doc test"
+
+DEPEND="doc? ( dev-python/sphinx[${PYTHON_USEDEP}] )
+ test? ( dev-python/nose[${PYTHON_USEDEP}] )"
+RDEPEND=""
+
+DOCS=( ACKS README RELEASE-NOTES )
+
+PATCHES=( "${FILESDIR}"/py3-support.patch )
+
+python_compile_all() {
+ if use doc; then
+ einfo "Generation of documentation"
+ emake -C doc html || die "Generation of documentation failed"
+ fi
+}
+
+python_test() {
+ # "${PYTHON}" test/test_lockfile.py yeilds no informative coverage output
+ nosetests || die "test_lockfile failed under ${EPYTHON}"
+}
+
+python_install_all() {
+ use doc && local HTML_DOCS=( doc/.build/html/. )
+ distutils-r1_python_install_all
+}