Răsfoiți Sursa

scripts/errorlist.py: improve error list docs generation

- also output modern rc and traceback yes/no
- recursive list of Error subclasses
Thomas Waldmann 1 an în urmă
părinte
comite
34bbce8e71
1 a modificat fișierele cu 34 adăugiri și 6 ștergeri
  1. 34 6
      scripts/errorlist.py

+ 34 - 6
scripts/errorlist.py

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