apenwarr-redo/redo/cycles.py

24 lines
553 B
Python
Raw Normal View History

"""Code for detecting and aborting on cyclic dependency loops."""
import os
class CyclicDependencyError(Exception):
pass
def _get():
"""Get the list of held cycle items."""
return os.environ.get('REDO_CYCLES', '').split(':')
def add(fid):
"""Add a lock to the list of held cycle items."""
items = set(_get())
items.add(str(fid))
os.environ['REDO_CYCLES'] = ':'.join(list(items))
def check(fid):
if str(fid) in _get():
# Lock already held by parent: cyclic dependency
raise CyclicDependencyError()