Hello community, here is the log from the commit of package python-zc-lockfile for openSUSE:Factory checked in at 2013-01-17 10:34:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-zc-lockfile (Old) and /work/SRC/openSUSE:Factory/.python-zc-lockfile.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-zc-lockfile", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/python-zc-lockfile/python-zc-lockfile.changes 2011-09-23 12:43:28.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-zc-lockfile.new/python-zc-lockfile.changes 2013-01-17 10:34:47.000000000 +0100 @@ -1,0 +2,8 @@ +Mon Jan 14 14:45:30 UTC 2013 - p.drouand@gmail.com + +- Update to 1.0.2 version: + * Fixed: the fix included in 1.0.1 caused multiple pids to be written + to the lock file +- Clean the specfile by removing redundant and useless tags + +------------------------------------------------------------------- Old: ---- zc.lockfile-1.0.0.tar.bz2 New: ---- zc.lockfile-1.0.2.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-zc-lockfile.spec ++++++ --- /var/tmp/diff_new_pack.gsmXDN/_old 2013-01-17 10:34:47.000000000 +0100 +++ /var/tmp/diff_new_pack.gsmXDN/_new 2013-01-17 10:34:47.000000000 +0100 @@ -1,7 +1,7 @@ # -# spec file for package python-zc-lockfile (Version 1.0.0) +# spec file for package python-zc-lockfile # -# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,8 +19,8 @@ %define modname zc.lockfile Name: python-zc-lockfile -Version: 1.0.0 -Release: 5 +Version: 1.0.2 +Release: 0 Summary: Basic inter-process locks Url: http://pypi.python.org/pypi/zc.lockfile License: ZPL-2.0 @@ -42,15 +42,11 @@ %setup -q -n %{modname}-%{version} %build -export CFLAGS="$RPM_OPT_FLAGS" python setup.py build %install python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT --record-rpm=INSTALLED_FILES -%clean -rm -rf %{buildroot} - %files -f INSTALLED_FILES %defattr(-,root,root) %doc README.txt ++++++ zc.lockfile-1.0.0.tar.bz2 -> zc.lockfile-1.0.2.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/CHANGES.txt new/zc.lockfile-1.0.2/CHANGES.txt --- old/zc.lockfile-1.0.0/CHANGES.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.0.2/CHANGES.txt 2012-12-02 18:49:17.000000000 +0100 @@ -0,0 +1,33 @@ +Change History +*************** + +1.0.2 (2012-12-02) +================== + +- Fixed: the fix included in 1.0.1 caused multiple pids to be written + to the lock file + +1.0.1 (2012-11-30) +================== + +- Fixed: when there was lock contention, the pid in the lock file was + lost. + + Thanks to Daniel Moisset reporting the problem and providing a fix + with tests. + +- Added test extra to declare test dependency on ``zope.testing``. + +- Using Python's ``doctest`` module instead of depreacted + ``zope.testing.doctest``. + + +1.0.0 (2008-10-18) +================== + +- Fixed a small bug in error logging. + +1.0.0b1 (2007-07-18) +==================== + +Initial release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/COPYRIGHT.txt new/zc.lockfile-1.0.2/COPYRIGHT.txt --- old/zc.lockfile-1.0.0/COPYRIGHT.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.0.2/COPYRIGHT.txt 2012-11-20 22:19:12.000000000 +0100 @@ -0,0 +1 @@ +Zope Foundation and Contributors \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/LICENSE.txt new/zc.lockfile-1.0.2/LICENSE.txt --- old/zc.lockfile-1.0.0/LICENSE.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.0.2/LICENSE.txt 2012-11-20 22:19:12.000000000 +0100 @@ -0,0 +1,44 @@ +Zope Public License (ZPL) Version 2.1 + +A copyright notice accompanies this license document that identifies the +copyright holders. + +This license has been certified as open source. It has also been designated as +GPL compatible by the Free Software Foundation (FSF). + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions in source code must retain the accompanying copyright +notice, this list of conditions, and the following disclaimer. + +2. Redistributions in binary form must reproduce the accompanying copyright +notice, this list of conditions, and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Names of the copyright holders must not be used to endorse or promote +products derived from this software without prior written permission from the +copyright holders. + +4. The right to distribute this software or to use it for any purpose does not +give you the right to use Servicemarks (sm) or Trademarks (tm) of the +copyright +holders. Use of them is covered by separate agreement with the copyright +holders. + +5. If any files are modified, you must cause the modified files to carry +prominent notices stating that you changed the files and the date of any +change. + +Disclaimer + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/PKG-INFO new/zc.lockfile-1.0.2/PKG-INFO --- old/zc.lockfile-1.0.0/PKG-INFO 2008-10-18 19:19:50.000000000 +0200 +++ new/zc.lockfile-1.0.2/PKG-INFO 2012-12-02 18:54:28.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: zc.lockfile -Version: 1.0.0 +Version: 1.0.2 Summary: Basic inter-process locks Home-page: http://www.python.org/pypi/zc.lockfile Author: Jim Fulton @@ -32,49 +32,70 @@ OS-provided locking facilities. To create a lock, instantiate a LockFile object with a file name: - >>> import zc.lockfile - >>> lock = zc.lockfile.LockFile('lock') + >>> import zc.lockfile + >>> lock = zc.lockfile.LockFile('lock') If we try to lock the same name, we'll get a lock error: - >>> import zope.testing.loggingsupport - >>> handler = zope.testing.loggingsupport.InstalledHandler('zc.lockfile') - >>> try: - ... zc.lockfile.LockFile('lock') - ... except zc.lockfile.LockError: - ... print "Can't lock file" - Can't lock file - - >>> for record in handler.records: - ... print record.levelname, record.getMessage() - ERROR Error locking file lock; pid=UNKNOWN + >>> import zope.testing.loggingsupport + >>> handler = zope.testing.loggingsupport.InstalledHandler('zc.lockfile') + >>> try: + ... zc.lockfile.LockFile('lock') + ... except zc.lockfile.LockError: + ... print "Can't lock file" + Can't lock file + + >>> for record in handler.records: # doctest: +ELLIPSIS + ... print record.levelname, record.getMessage() + ERROR Error locking file lock; pid=... To release the lock, use it's close method: - >>> lock.close() + >>> lock.close() The lock file is not removed. It is left behind: - >>> import os - >>> os.path.exists('lock') - True + >>> import os + >>> os.path.exists('lock') + True - Of course, now that we've released the lock, we can created it again: + Of course, now that we've released the lock, we can create it again: - >>> lock = zc.lockfile.LockFile('lock') - >>> lock.close() + >>> lock = zc.lockfile.LockFile('lock') + >>> lock.close() .. Cleanup - >>> import os - >>> os.remove('lock') + >>> import os + >>> os.remove('lock') Change History *************** + 1.0.2 (2012-12-02) + ================== + + - Fixed: the fix included in 1.0.1 caused multiple pids to be written + to the lock file + + 1.0.1 (2012-11-30) + ================== + + - Fixed: when there was lock contention, the pid in the lock file was + lost. + + Thanks to Daniel Moisset reporting the problem and providing a fix + with tests. + + - Added test extra to declare test dependency on ``zope.testing``. + + - Using Python's ``doctest`` module instead of depreacted + ``zope.testing.doctest``. + + 1.0.0 (2008-10-18) - ==================== + ================== - Fixed a small bug in error logging. @@ -89,7 +110,6 @@ Keywords: lock Platform: UNKNOWN Classifier: Programming Language :: Python -Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Zope Public License Classifier: Operating System :: POSIX diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/bootstrap.py new/zc.lockfile-1.0.2/bootstrap.py --- old/zc.lockfile-1.0.0/bootstrap.py 1970-01-01 01:00:00.000000000 +0100 +++ new/zc.lockfile-1.0.2/bootstrap.py 2012-11-20 22:19:12.000000000 +0100 @@ -0,0 +1,260 @@ +############################################################################## +# +# Copyright (c) 2006 Zope Foundation and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""Bootstrap a buildout-based project + +Simply run this script in a directory containing a buildout.cfg. +The script accepts buildout command-line options, so you can +use the -c option to specify an alternate configuration file. +""" + +import os, shutil, sys, tempfile, textwrap, urllib, urllib2, subprocess +from optparse import OptionParser + +if sys.platform == 'win32': + def quote(c): + if ' ' in c: + return '"%s"' % c # work around spawn lamosity on windows + else: + return c +else: + quote = str + +# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments. +stdout, stderr = subprocess.Popen( + [sys.executable, '-Sc', + 'try:\n' + ' import ConfigParser\n' + 'except ImportError:\n' + ' print 1\n' + 'else:\n' + ' print 0\n'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() +has_broken_dash_S = bool(int(stdout.strip())) + +# In order to be more robust in the face of system Pythons, we want to +# run without site-packages loaded. This is somewhat tricky, in +# particular because Python 2.6's distutils imports site, so starting +# with the -S flag is not sufficient. However, we'll start with that: +if not has_broken_dash_S and 'site' in sys.modules: + # We will restart with python -S. + args = sys.argv[:] + args[0:0] = [sys.executable, '-S'] + args = map(quote, args) + os.execv(sys.executable, args) +# Now we are running with -S. We'll get the clean sys.path, import site +# because distutils will do it later, and then reset the path and clean +# out any namespace packages from site-packages that might have been +# loaded by .pth files. +clean_path = sys.path[:] +import site +sys.path[:] = clean_path +for k, v in sys.modules.items(): + if k in ('setuptools', 'pkg_resources') or ( + hasattr(v, '__path__') and + len(v.__path__)==1 and + not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))): + # This is a namespace package. Remove it. + sys.modules.pop(k) + +is_jython = sys.platform.startswith('java') + +setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py' +distribute_source = 'http://python-distribute.org/distribute_setup.py' + +# parsing arguments +def normalize_to_url(option, opt_str, value, parser): + if value: + if '://' not in value: # It doesn't smell like a URL. + value = 'file://%s' % ( + urllib.pathname2url( + os.path.abspath(os.path.expanduser(value))),) + if opt_str == '--download-base' and not value.endswith('/'): + # Download base needs a trailing slash to make the world happy. + value += '/' + else: + value = None + name = opt_str[2:].replace('-', '_') + setattr(parser.values, name, value) + +usage = '''\ +[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options] + +Bootstraps a buildout-based project. + +Simply run this script in a directory containing a buildout.cfg, using the +Python that you want bin/buildout to use. + +Note that by using --setup-source and --download-base to point to +local resources, you can keep this script from going over the network. +''' + +parser = OptionParser(usage=usage) +parser.add_option("-v", "--version", dest="version", + help="use a specific zc.buildout version") +parser.add_option("-d", "--distribute", + action="store_true", dest="use_distribute", default=False, + help="Use Distribute rather than Setuptools.") +parser.add_option("--setup-source", action="callback", dest="setup_source", + callback=normalize_to_url, nargs=1, type="string", + help=("Specify a URL or file location for the setup file. " + "If you use Setuptools, this will default to " + + setuptools_source + "; if you use Distribute, this " + "will default to " + distribute_source +".")) +parser.add_option("--download-base", action="callback", dest="download_base", + callback=normalize_to_url, nargs=1, type="string", + help=("Specify a URL or directory for downloading " + "zc.buildout and either Setuptools or Distribute. " + "Defaults to PyPI.")) +parser.add_option("--eggs", + help=("Specify a directory for storing eggs. Defaults to " + "a temporary directory that is deleted when the " + "bootstrap script completes.")) +parser.add_option("-t", "--accept-buildout-test-releases", + dest='accept_buildout_test_releases', + action="store_true", default=False, + help=("Normally, if you do not specify a --version, the " + "bootstrap script and buildout gets the newest " + "*final* versions of zc.buildout and its recipes and " + "extensions for you. If you use this flag, " + "bootstrap and buildout will get the newest releases " + "even if they are alphas or betas.")) +parser.add_option("-c", None, action="store", dest="config_file", + help=("Specify the path to the buildout configuration " + "file to be used.")) + +options, args = parser.parse_args() + +# if -c was provided, we push it back into args for buildout's main function +if options.config_file is not None: + args += ['-c', options.config_file] + +if options.eggs: + eggs_dir = os.path.abspath(os.path.expanduser(options.eggs)) +else: + eggs_dir = tempfile.mkdtemp() + +if options.setup_source is None: + if options.use_distribute: + options.setup_source = distribute_source + else: + options.setup_source = setuptools_source + +if options.accept_buildout_test_releases: + args.append('buildout:accept-buildout-test-releases=true') +args.append('bootstrap') + +try: + import pkg_resources + import setuptools # A flag. Sometimes pkg_resources is installed alone. + if not hasattr(pkg_resources, '_distribute'): + raise ImportError +except ImportError: + ez_code = urllib2.urlopen( + options.setup_source).read().replace('\r\n', '\n') + ez = {} + exec ez_code in ez + setup_args = dict(to_dir=eggs_dir, download_delay=0) + if options.download_base: + setup_args['download_base'] = options.download_base + if options.use_distribute: + setup_args['no_fake'] = True + ez['use_setuptools'](**setup_args) + if 'pkg_resources' in sys.modules: + reload(sys.modules['pkg_resources']) + import pkg_resources + # This does not (always?) update the default working set. We will + # do it. + for path in sys.path: + if path not in pkg_resources.working_set.entries: + pkg_resources.working_set.add_entry(path) + +cmd = [quote(sys.executable), + '-c', + quote('from setuptools.command.easy_install import main; main()'), + '-mqNxd', + quote(eggs_dir)] + +if not has_broken_dash_S: + cmd.insert(1, '-S') + +find_links = options.download_base +if not find_links: + find_links = os.environ.get('bootstrap-testing-find-links') +if find_links: + cmd.extend(['-f', quote(find_links)]) + +if options.use_distribute: + setup_requirement = 'distribute' +else: + setup_requirement = 'setuptools' +ws = pkg_resources.working_set +setup_requirement_path = ws.find( + pkg_resources.Requirement.parse(setup_requirement)).location +env = dict( + os.environ, + PYTHONPATH=setup_requirement_path) + +requirement = 'zc.buildout' +version = options.version +if version is None and not options.accept_buildout_test_releases: + # Figure out the most recent final version of zc.buildout. + import setuptools.package_index + _final_parts = '*final-', '*final' + def _final_version(parsed_version): + for part in parsed_version: + if (part[:1] == '*') and (part not in _final_parts): + return False + return True + index = setuptools.package_index.PackageIndex( + search_path=[setup_requirement_path]) + if find_links: + index.add_find_links((find_links,)) + req = pkg_resources.Requirement.parse(requirement) + if index.obtain(req) is not None: + best = [] + bestv = None + for dist in index[req.project_name]: + distv = dist.parsed_version + if _final_version(distv): + if bestv is None or distv > bestv: + best = [dist] + bestv = distv + elif distv == bestv: + best.append(dist) + if best: + best.sort() + version = best[-1].version +if version: + requirement = '=='.join((requirement, version)) +cmd.append(requirement) + +if is_jython: + import subprocess + exitcode = subprocess.Popen(cmd, env=env).wait() +else: # Windows prefers this, apparently; otherwise we would prefer subprocess + exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env])) +if exitcode != 0: + sys.stdout.flush() + sys.stderr.flush() + print ("An error occurred when trying to install zc.buildout. " + "Look above this message for any errors that " + "were output by easy_install.") + sys.exit(exitcode) + +ws.add_entry(eggs_dir) +ws.require(requirement) +import zc.buildout.buildout +zc.buildout.buildout.main(args) +if not options.eggs: # clean up temporary egg directory + shutil.rmtree(eggs_dir) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/buildout.cfg new/zc.lockfile-1.0.2/buildout.cfg --- old/zc.lockfile-1.0.0/buildout.cfg 2008-10-18 19:18:26.000000000 +0200 +++ new/zc.lockfile-1.0.2/buildout.cfg 2012-12-02 18:31:09.000000000 +0100 @@ -1,7 +1,12 @@ [buildout] develop = . -parts = test +parts = py [test] -recipe = zc.recipe.testrunner -eggs = zc.lockfile +recipe = zc.recipe.testrunner ==1.3.0 +eggs = zc.lockfile [test] + +[py] +recipe = zc.recipe.egg +eggs = ${test:eggs} +interpreter = py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/setup.py new/zc.lockfile-1.0.2/setup.py --- old/zc.lockfile-1.0.0/setup.py 2008-10-18 19:18:41.000000000 +0200 +++ new/zc.lockfile-1.0.2/setup.py 2012-12-02 18:53:48.000000000 +0100 @@ -11,7 +11,7 @@ # FOR A PARTICULAR PURPOSE. # ############################################################################## -name, version = "zc.lockfile", '1.0.0' +name, version = "zc.lockfile", '1.0.2' import os from setuptools import setup, find_packages @@ -27,7 +27,7 @@ + '\n' + read('src', 'zc', 'lockfile', 'README.txt') + '\n' + - read('src', 'zc', 'lockfile', 'CHANGES.txt') + read('CHANGES.txt') + '\n' + 'Download\n' '**********************\n' @@ -49,11 +49,14 @@ package_dir = {'': 'src'}, namespace_packages = ['zc'], install_requires = 'setuptools', + extras_require=dict( + test=[ + 'zope.testing', + ]), include_package_data = True, zip_safe=False, classifiers = [ 'Programming Language :: Python', - 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: Zope Public License', 'Operating System :: POSIX', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc/lockfile/CHANGES.txt new/zc.lockfile-1.0.2/src/zc/lockfile/CHANGES.txt --- old/zc.lockfile-1.0.0/src/zc/lockfile/CHANGES.txt 2008-10-18 19:18:26.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc/lockfile/CHANGES.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,12 +0,0 @@ -Change History -*************** - -1.0.0 (2008-10-18) -==================== - -- Fixed a small bug in error logging. - -1.0.0b1 (2007-07-18) -==================== - -Initial release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc/lockfile/README.txt new/zc.lockfile-1.0.2/src/zc/lockfile/README.txt --- old/zc.lockfile-1.0.0/src/zc/lockfile/README.txt 2008-10-18 19:18:26.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc/lockfile/README.txt 2012-11-20 22:38:34.000000000 +0100 @@ -19,9 +19,9 @@ ... print "Can't lock file" Can't lock file - >>> for record in handler.records: + >>> for record in handler.records: # doctest: +ELLIPSIS ... print record.levelname, record.getMessage() - ERROR Error locking file lock; pid=UNKNOWN + ERROR Error locking file lock; pid=... To release the lock, use it's close method: @@ -33,7 +33,7 @@ >>> os.path.exists('lock') True -Of course, now that we've released the lock, we can created it again: +Of course, now that we've released the lock, we can create it again: >>> lock = zc.lockfile.LockFile('lock') >>> lock.close() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc/lockfile/__init__.py new/zc.lockfile-1.0.2/src/zc/lockfile/__init__.py --- old/zc.lockfile-1.0.0/src/zc/lockfile/__init__.py 2008-10-18 19:18:26.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc/lockfile/__init__.py 2012-12-02 18:40:58.000000000 +0100 @@ -1,6 +1,6 @@ ############################################################################## # -# Copyright (c) 2001, 2002 Zope Corporation and Contributors. +# Copyright (c) 2001, 2002 Zope Foundation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, @@ -47,7 +47,7 @@ msvcrt.locking(file.fileno(), msvcrt.LK_UNLCK, 1) except IOError: raise LockError("Couldn't unlock %r" % file.name) - + else: # Unix _flags = fcntl.LOCK_EX | fcntl.LOCK_NB @@ -57,7 +57,7 @@ fcntl.flock(file.fileno(), _flags) except IOError: raise LockError("Couldn't lock %r" % file.name) - + def _unlock_file(file): # File is automatically unlocked on close @@ -70,7 +70,15 @@ def __init__(self, path): self._path = path - fp = open(path, 'w+') + try: + # Try to open for writing without truncation: + fp = open(path, 'r+') + except IOError: + # If the file doesn't exist, we'll get an IO error, try a+ + # Note that there may be a race here. Multiple processes + # could fail on the r+ open and open the file a+, but only + # one will get the the lock and write a pid. + fp = open(path, 'a+') try: _lock_file(fp) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc/lockfile/tests.py new/zc.lockfile-1.0.2/src/zc/lockfile/tests.py --- old/zc.lockfile-1.0.0/src/zc/lockfile/tests.py 2008-10-18 19:18:26.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc/lockfile/tests.py 2012-12-02 18:52:32.000000000 +0100 @@ -1,21 +1,20 @@ ############################################################################## # -# Copyright (c) 2004 Zope Corporation and Contributors. +# Copyright (c) 2004 Zope Foundation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, -# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## -import os, sys, unittest -from zope.testing import doctest, setupstack - +from zope.testing import setupstack +import os, sys, unittest, doctest import zc.lockfile, time, threading - + def inc(): while 1: @@ -48,7 +47,43 @@ True >>> os.remove('f') + + We should only have one pid in the lock file: + + >>> f = open('f.lock') + >>> len(f.read().strip().split()) + 1 + >>> f.close() + >>> os.remove('f.lock') + + """ + +def pid_in_lockfile(): + r""" + >>> import os, zc.lockfile + >>> pid = os.getpid() + >>> lock = zc.lockfile.LockFile("f.lock") + >>> f = open("f.lock") + >>> f.seek(1) + >>> f.read().strip() == str(pid) + True + >>> f.close() + + Make sure that locking twice does not overwrite the old pid: + + >>> lock = zc.lockfile.LockFile("f.lock") + Traceback (most recent call last): + ... + LockError: Couldn't lock 'f.lock' + + >>> f = open("f.lock") + >>> f.seek(1) + >>> f.read().strip() == str(pid) + True + >>> f.close() + + >>> lock.close() """ def test_suite(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc.lockfile.egg-info/PKG-INFO new/zc.lockfile-1.0.2/src/zc.lockfile.egg-info/PKG-INFO --- old/zc.lockfile-1.0.0/src/zc.lockfile.egg-info/PKG-INFO 2008-10-18 19:19:50.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc.lockfile.egg-info/PKG-INFO 2012-12-02 18:54:28.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.0 Name: zc.lockfile -Version: 1.0.0 +Version: 1.0.2 Summary: Basic inter-process locks Home-page: http://www.python.org/pypi/zc.lockfile Author: Jim Fulton @@ -32,49 +32,70 @@ OS-provided locking facilities. To create a lock, instantiate a LockFile object with a file name: - >>> import zc.lockfile - >>> lock = zc.lockfile.LockFile('lock') + >>> import zc.lockfile + >>> lock = zc.lockfile.LockFile('lock') If we try to lock the same name, we'll get a lock error: - >>> import zope.testing.loggingsupport - >>> handler = zope.testing.loggingsupport.InstalledHandler('zc.lockfile') - >>> try: - ... zc.lockfile.LockFile('lock') - ... except zc.lockfile.LockError: - ... print "Can't lock file" - Can't lock file - - >>> for record in handler.records: - ... print record.levelname, record.getMessage() - ERROR Error locking file lock; pid=UNKNOWN + >>> import zope.testing.loggingsupport + >>> handler = zope.testing.loggingsupport.InstalledHandler('zc.lockfile') + >>> try: + ... zc.lockfile.LockFile('lock') + ... except zc.lockfile.LockError: + ... print "Can't lock file" + Can't lock file + + >>> for record in handler.records: # doctest: +ELLIPSIS + ... print record.levelname, record.getMessage() + ERROR Error locking file lock; pid=... To release the lock, use it's close method: - >>> lock.close() + >>> lock.close() The lock file is not removed. It is left behind: - >>> import os - >>> os.path.exists('lock') - True + >>> import os + >>> os.path.exists('lock') + True - Of course, now that we've released the lock, we can created it again: + Of course, now that we've released the lock, we can create it again: - >>> lock = zc.lockfile.LockFile('lock') - >>> lock.close() + >>> lock = zc.lockfile.LockFile('lock') + >>> lock.close() .. Cleanup - >>> import os - >>> os.remove('lock') + >>> import os + >>> os.remove('lock') Change History *************** + 1.0.2 (2012-12-02) + ================== + + - Fixed: the fix included in 1.0.1 caused multiple pids to be written + to the lock file + + 1.0.1 (2012-11-30) + ================== + + - Fixed: when there was lock contention, the pid in the lock file was + lost. + + Thanks to Daniel Moisset reporting the problem and providing a fix + with tests. + + - Added test extra to declare test dependency on ``zope.testing``. + + - Using Python's ``doctest`` module instead of depreacted + ``zope.testing.doctest``. + + 1.0.0 (2008-10-18) - ==================== + ================== - Fixed a small bug in error logging. @@ -89,7 +110,6 @@ Keywords: lock Platform: UNKNOWN Classifier: Programming Language :: Python -Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Zope Public License Classifier: Operating System :: POSIX diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc.lockfile.egg-info/SOURCES.txt new/zc.lockfile-1.0.2/src/zc.lockfile.egg-info/SOURCES.txt --- old/zc.lockfile-1.0.0/src/zc.lockfile.egg-info/SOURCES.txt 2008-10-18 19:19:50.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc.lockfile.egg-info/SOURCES.txt 2012-12-02 18:54:28.000000000 +0100 @@ -1,4 +1,8 @@ +CHANGES.txt +COPYRIGHT.txt +LICENSE.txt README.txt +bootstrap.py buildout.cfg setup.py src/zc/__init__.py @@ -9,7 +13,6 @@ src/zc.lockfile.egg-info/not-zip-safe src/zc.lockfile.egg-info/requires.txt src/zc.lockfile.egg-info/top_level.txt -src/zc/lockfile/CHANGES.txt src/zc/lockfile/README.txt src/zc/lockfile/__init__.py src/zc/lockfile/tests.py \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zc.lockfile-1.0.0/src/zc.lockfile.egg-info/requires.txt new/zc.lockfile-1.0.2/src/zc.lockfile.egg-info/requires.txt --- old/zc.lockfile-1.0.0/src/zc.lockfile.egg-info/requires.txt 2008-10-18 19:19:50.000000000 +0200 +++ new/zc.lockfile-1.0.2/src/zc.lockfile.egg-info/requires.txt 2012-12-02 18:54:28.000000000 +0100 @@ -1 +1,4 @@ -setuptools \ No newline at end of file +setuptools + +[test] +zope.testing \ No newline at end of file -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org