Standardize error handling for Subversion.

Review Request #13226 — Created Aug. 20, 2023 and submitted

Information

Review Board
release-6.x

Reviewers

Our Subversion support split the responsibility for error handling up
into SVNTool.normalize_error() and into individual backend functions.
The SVNTool version was even checking for backend-specific errors, a
holdover from when backends were first introduced.

In general, error handling for Subversion is iffy, as it depends on
backend internals. libsvn and PySVN may produce error strings that are
all wrapped by a single exception, which may be used for backend errors,
PySVN configuration errors, or repository errors. If operating inside a
callback, we also can't raise our own exceptions (which will come up and
be addressed in a future change).

This change redoes all our error and operation handling. Now, SVNTool
leaves all error handling up to the client backends. Backends are
expected to invoke operations within a with self.communicate(): block,
which will capture any errors and then hand them to the backend to turn
into proper exceptions. This will also give us an avenue to raise our
own exceptions within callbacks later, for SSL.

PySVN backend communication code has been updated to work with
communicate(). _do_on_path() now better wraps this as a context
manager as well, simplifying various backend implementations and letting
us remove some private callback functions.

All unit tests pass.

Summary ID
Standardize error handling for Subversion.
Our Subversion support split the responsibility for error handling up into `SVNTool.normalize_error()` and into individual backend functions. The `SVNTool` version was even checking for backend-specific errors, a holdover from when backends were first introduced. In general, error handling for Subversion is iffy, as it depends on backend internals. libsvn and PySVN may produce error strings that are all wrapped by a single exception, which may be used for backend errors, PySVN configuration errors, or repository errors. If operating inside a callback, we also can't raise our own exceptions (which will come up and be addressed in a future change). This change redoes all our error and operation handling. Now, `SVNTool` leaves all error handling up to the client backends. Backends are expected to invoke operations within a `with self.communicate():` block, which will capture any errors and then hand them to the backend to turn into proper exceptions. This will also give us an avenue to raise our own exceptions within callbacks later, for SSL. PySVN backend communication code has been updated to work with `communicate()`. `_do_on_path()` now better wraps this as a context manager as well, simplifying various backend implementations and letting us remove some private callback functions.
53c56c7d4dee4380cbfe170d7085f032f45bdaaf
chipx86
david
  1. Ship It!
  2. 
      
chipx86
Review request changed
Status:
Completed
Change Summary:
Pushed to release-6.x (e85e58b)