concretizer: show input specs on error (#45245)
This commit is contained in:
		@@ -23,6 +23,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import llnl.util.lang
 | 
					import llnl.util.lang
 | 
				
			||||||
import llnl.util.tty as tty
 | 
					import llnl.util.tty as tty
 | 
				
			||||||
 | 
					from llnl.util.lang import elide_list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import spack
 | 
					import spack
 | 
				
			||||||
import spack.binary_distribution
 | 
					import spack.binary_distribution
 | 
				
			||||||
@@ -621,8 +622,9 @@ def _external_config_with_implicit_externals(configuration):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ErrorHandler:
 | 
					class ErrorHandler:
 | 
				
			||||||
    def __init__(self, model):
 | 
					    def __init__(self, model, input_specs: List[spack.spec.Spec]):
 | 
				
			||||||
        self.model = model
 | 
					        self.model = model
 | 
				
			||||||
 | 
					        self.input_specs = input_specs
 | 
				
			||||||
        self.full_model = None
 | 
					        self.full_model = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def multiple_values_error(self, attribute, pkg):
 | 
					    def multiple_values_error(self, attribute, pkg):
 | 
				
			||||||
@@ -709,12 +711,13 @@ def handle_error(self, msg, *args):
 | 
				
			|||||||
        return msg
 | 
					        return msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def message(self, errors) -> str:
 | 
					    def message(self, errors) -> str:
 | 
				
			||||||
        messages = [
 | 
					        input_specs = ", ".join(elide_list([f"`{s}`" for s in self.input_specs], 5))
 | 
				
			||||||
            f"  {idx+1: 2}. {self.handle_error(msg, *args)}"
 | 
					        header = f"failed to concretize {input_specs} for the following reasons:"
 | 
				
			||||||
 | 
					        messages = (
 | 
				
			||||||
 | 
					            f"    {idx+1:2}. {self.handle_error(msg, *args)}"
 | 
				
			||||||
            for idx, (_, msg, args) in enumerate(errors)
 | 
					            for idx, (_, msg, args) in enumerate(errors)
 | 
				
			||||||
        ]
 | 
					        )
 | 
				
			||||||
        header = "concretization failed for the following reasons:\n"
 | 
					        return "\n".join((header, *messages))
 | 
				
			||||||
        return "\n".join([header] + messages)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def raise_if_errors(self):
 | 
					    def raise_if_errors(self):
 | 
				
			||||||
        initial_error_args = extract_args(self.model, "error")
 | 
					        initial_error_args = extract_args(self.model, "error")
 | 
				
			||||||
@@ -750,7 +753,7 @@ def on_model(model):
 | 
				
			|||||||
                f"unexpected error during concretization [{str(e)}]. "
 | 
					                f"unexpected error during concretization [{str(e)}]. "
 | 
				
			||||||
                f"Please report a bug at https://github.com/spack/spack/issues"
 | 
					                f"Please report a bug at https://github.com/spack/spack/issues"
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            raise spack.error.SpackError(msg)
 | 
					            raise spack.error.SpackError(msg) from e
 | 
				
			||||||
        raise UnsatisfiableSpecError(msg)
 | 
					        raise UnsatisfiableSpecError(msg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -894,7 +897,7 @@ def on_model(model):
 | 
				
			|||||||
            min_cost, best_model = min(models)
 | 
					            min_cost, best_model = min(models)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # first check for errors
 | 
					            # first check for errors
 | 
				
			||||||
            error_handler = ErrorHandler(best_model)
 | 
					            error_handler = ErrorHandler(best_model, specs)
 | 
				
			||||||
            error_handler.raise_if_errors()
 | 
					            error_handler.raise_if_errors()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # build specs from spec attributes in the model
 | 
					            # build specs from spec attributes in the model
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user