-
-
Notifications
You must be signed in to change notification settings - Fork 758
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #7976 from ThomasWaldmann/new-rc-1.4
optional more specific return codes
- Loading branch information
Showing
22 changed files
with
872 additions
and
414 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,63 @@ | ||
#!/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.constants import * # NOQA | ||
from borg.helpers import Error, BackupError, BorgWarning | ||
|
||
classes = Error.__subclasses__() + ErrorWithTraceback.__subclasses__() | ||
|
||
for cls in sorted(classes, key=lambda cls: (cls.__module__, cls.__qualname__)): | ||
if cls is ErrorWithTraceback: | ||
continue | ||
print(' ', cls.__qualname__) | ||
def subclasses(cls): | ||
direct_subclasses = cls.__subclasses__() | ||
return set(direct_subclasses) | set(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_error_rcs = set(range(EXIT_ERROR_BASE, EXIT_WARNING_BASE)) # 3 .. 99 | ||
free_warning_rcs = set(range(EXIT_WARNING_BASE, EXIT_SIGNAL_BASE)) # 100 .. 127 | ||
|
||
# these classes map to rc 2 | ||
generic_error_rc_classes = set() | ||
generic_warning_rc_classes = set() | ||
|
||
error_classes = {Error} | subclasses(Error) | ||
|
||
for cls in sorted(error_classes, key=lambda cls: (cls.__module__, 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_error_rcs: | ||
free_error_rcs.remove(rc) | ||
elif rc == 2: | ||
generic_error_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 error RCs:', sorted(free_error_rcs)) | ||
print('generic errors:', sorted(generic_error_rc_classes)) | ||
|
||
warning_classes = {BorgWarning} | subclasses(BorgWarning) | {BackupError} | subclasses(BackupError) | ||
|
||
for cls in sorted(warning_classes, key=lambda cls: (cls.__module__, cls.__qualname__)): | ||
rc = cls.exit_mcode | ||
print(' ', cls.__qualname__, 'rc:', rc) | ||
print(indent(cls.__doc__, ' ' * 8)) | ||
if rc in free_warning_rcs: | ||
free_warning_rcs.remove(rc) | ||
elif rc == 1: | ||
generic_warning_rc_classes.add(cls.__qualname__) | ||
else: # rc != 1 | ||
# if we did not intentionally map this to the generic warning rc, this might be an issue: | ||
print(f'ERROR: {rc} is not a free/available RC, but either duplicate or invalid') | ||
|
||
print("\n") | ||
print('free warning RCs:', sorted(free_warning_rcs)) | ||
print('generic warnings:', sorted(generic_warning_rc_classes)) |
Oops, something went wrong.