| 332 | return all(not self.get(key) for key in keys) |
| 333 | |
| 334 | def modify(self, key, op): |
| 335 | roster = self.load() |
| 336 | try: |
| 337 | elements = {tuple(e) for e in roster[key]} |
| 338 | except KeyError: |
| 339 | elements = set() |
| 340 | if op == ADD: |
| 341 | elements.add(self.id) |
| 342 | elif op == REMOVE: |
| 343 | # note: we ignore it if the element is already not present anymore. |
| 344 | # this has been frequently seen in teardowns involving Repository.__del__ and Repository.__exit__. |
| 345 | elements.discard(self.id) |
| 346 | elif op == REMOVE2: |
| 347 | # needed for callers that do not want to ignore. |
| 348 | elements.remove(self.id) |
| 349 | else: |
| 350 | raise ValueError("Unknown LockRoster op %r" % op) |
| 351 | roster[key] = list(list(e) for e in elements) |
| 352 | self.save(roster) |
| 353 | |
| 354 | def migrate_lock(self, key, old_id, new_id): |
| 355 | """migrate the lock ownership from old_id to new_id""" |