Try harder.
This commit is contained in:
parent
eec4b0a7d5
commit
057599575a
1 changed files with 35 additions and 13 deletions
|
@ -15,8 +15,9 @@
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
from functools import partial
|
||||||
import logging
|
import logging
|
||||||
from typing import List, Optional, Dict, Tuple
|
from typing import List, Optional, Tuple, Callable, Any
|
||||||
|
|
||||||
from buildlog_consultant import Problem
|
from buildlog_consultant import Problem
|
||||||
from buildlog_consultant.common import (
|
from buildlog_consultant.common import (
|
||||||
|
@ -66,24 +67,45 @@ def run_detecting_problems(session: Session, args: List[str], **kwargs):
|
||||||
raise DetailedFailure(retcode, args, error)
|
raise DetailedFailure(retcode, args, error)
|
||||||
|
|
||||||
|
|
||||||
def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildFixer], **kwargs):
|
def iterate_with_build_fixers(fixers: List[BuildFixer], cb: Callable[[], Any]):
|
||||||
|
"""Call cb() until there are no more DetailedFailures we can fix.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
fixers: List of fixers to use to resolve issues
|
||||||
|
"""
|
||||||
fixed_errors = []
|
fixed_errors = []
|
||||||
while True:
|
while True:
|
||||||
|
to_resolve = []
|
||||||
try:
|
try:
|
||||||
run_detecting_problems(session, args, **kwargs)
|
return cb()
|
||||||
except DetailedFailure as e:
|
except DetailedFailure as e:
|
||||||
logging.info("Identified error: %r", e.error)
|
to_resolve.append(e)
|
||||||
if e.error in fixed_errors:
|
while to_resolve:
|
||||||
|
f = to_resolve.pop(-1)
|
||||||
|
logging.info("Identified error: %r", f.error)
|
||||||
|
if f.error in fixed_errors:
|
||||||
logging.warning(
|
logging.warning(
|
||||||
"Failed to resolve error %r, it persisted. Giving up.", e.error
|
"Failed to resolve error %r, it persisted. Giving up.", f.error
|
||||||
)
|
)
|
||||||
raise DetailedFailure(e.retcode, args, e.error)
|
raise f
|
||||||
if not resolve_error(e.error, None, fixers=fixers):
|
try:
|
||||||
logging.warning("Failed to find resolution for error %r. Giving up.", e.error)
|
if not resolve_error(f.error, None, fixers=fixers):
|
||||||
raise DetailedFailure(e.retcode, args, e.error)
|
logging.warning("Failed to find resolution for error %r. Giving up.", f.error)
|
||||||
fixed_errors.append(e.error)
|
raise f
|
||||||
else:
|
except DetailedFailure as n:
|
||||||
return
|
logging.info('New error %r while resolving %r', n, f)
|
||||||
|
if n in to_resolve:
|
||||||
|
raise
|
||||||
|
to_resolve.append(f)
|
||||||
|
to_resolve.append(n)
|
||||||
|
else:
|
||||||
|
fixed_errors.append(f.error)
|
||||||
|
|
||||||
|
|
||||||
|
def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildFixer], **kwargs):
|
||||||
|
return iterate_with_build_fixers(
|
||||||
|
fixers,
|
||||||
|
partial(run_detecting_problems, session, args, **kwargs))
|
||||||
|
|
||||||
|
|
||||||
def resolve_error(error, phase, fixers):
|
def resolve_error(error, phase, fixers):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue