errorlist.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/env python3
  2. # this script automatically generates the error list for the docs by
  3. # looking at the "Error" class and its subclasses.
  4. from textwrap import indent
  5. import borg.archiver # noqa: F401 - need import to get Error subclasses.
  6. from borg.helpers import Error
  7. def subclasses(cls):
  8. direct_subclasses = cls.__subclasses__()
  9. return set(direct_subclasses).union([s for c in direct_subclasses for s in subclasses(c)])
  10. # 0, 1, 2 are used for success, generic warning, generic error
  11. # 3..99 are available for specific errors
  12. # 100..127 are available for specific warnings
  13. # 128+ are reserved for signals
  14. free_rcs = set(range(3, 99 + 1)) # 3 .. 99 (we only deal with errors here)
  15. # these classes map to rc 2
  16. generic_rc_classes = set()
  17. classes = {Error}.union(subclasses(Error))
  18. for cls in sorted(classes, key=lambda cls: (cls.__module__, cls.__qualname__)):
  19. traceback = "yes" if cls.traceback else "no"
  20. rc = cls.exit_mcode
  21. print(" ", cls.__qualname__, "rc:", rc, "traceback:", traceback)
  22. print(indent(cls.__doc__, " " * 8))
  23. if rc in free_rcs:
  24. free_rcs.remove(rc)
  25. elif rc == 2:
  26. generic_rc_classes.add(cls.__qualname__)
  27. else: # rc != 2
  28. # if we did not intentionally map this to the generic error rc, this might be an issue:
  29. print(f"ERROR: {rc} is not a free/available RC, but either duplicate or invalid")
  30. print()
  31. print("free RCs:", sorted(free_rcs))
  32. print("generic errors:", sorted(generic_rc_classes))