24 lines
553 B
Python
24 lines
553 B
Python
|
|
"""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()
|