42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
"""holds locking functionality that works across processes"""
|
|
from __future__ import absolute_import, unicode_literals
|
|
|
|
from contextlib import contextmanager
|
|
|
|
import py
|
|
from filelock import FileLock, Timeout
|
|
|
|
from tox.reporter import verbosity1
|
|
|
|
|
|
@contextmanager
|
|
def hold_lock(lock_file, reporter=verbosity1):
|
|
py.path.local(lock_file.dirname).ensure(dir=1)
|
|
lock = FileLock(str(lock_file))
|
|
try:
|
|
try:
|
|
lock.acquire(0.0001)
|
|
except Timeout:
|
|
reporter("lock file {} present, will block until released".format(lock_file))
|
|
lock.acquire()
|
|
yield
|
|
finally:
|
|
lock.release(force=True)
|
|
|
|
|
|
def get_unique_file(path, prefix, suffix):
|
|
"""get a unique file in a folder having a given prefix and suffix,
|
|
with unique number in between"""
|
|
lock_file = path.join(".lock")
|
|
prefix = "{}-".format(prefix)
|
|
with hold_lock(lock_file):
|
|
max_value = -1
|
|
for candidate in path.listdir("{}*{}".format(prefix, suffix)):
|
|
try:
|
|
max_value = max(max_value, int(candidate.basename[len(prefix) : -len(suffix)]))
|
|
except ValueError:
|
|
continue
|
|
winner = path.join("{}{}{}".format(prefix, max_value + 1, suffix))
|
|
winner.ensure(dir=0)
|
|
return winner
|