[Notes] [Git][BuildStream/buildstream][danielsilverstone-ct/report-loop] _loader/loader.py: Be more explanatory in CircDep exception



Title: GitLab

Daniel pushed to branch danielsilverstone-ct/report-loop at BuildStream / buildstream

Commits:

2 changed files:

Changes:

  • buildstream/_loader/loader.py
    ... ... @@ -296,12 +296,14 @@ class Loader():
    296 296
         # Raises:
    
    297 297
         #    (LoadError): In case there was a circular dependency error
    
    298 298
         #
    
    299
    -    def _check_circular_deps(self, element_name, check_elements=None, validated=None):
    
    299
    +    def _check_circular_deps(self, element_name, check_elements=None, validated=None, sequence=None):
    
    300 300
     
    
    301 301
             if check_elements is None:
    
    302 302
                 check_elements = {}
    
    303 303
             if validated is None:
    
    304 304
                 validated = {}
    
    305
    +        if sequence is None:
    
    306
    +            sequence = []
    
    305 307
     
    
    306 308
             element = self._elements[element_name]
    
    307 309
     
    
    ... ... @@ -314,16 +316,21 @@ class Loader():
    314 316
                 return
    
    315 317
     
    
    316 318
             if check_elements.get(element_name) is not None:
    
    319
    +            chain = sequence[sequence.index(element_name):]
    
    320
    +            chain.append(element_name)
    
    317 321
                 raise LoadError(LoadErrorReason.CIRCULAR_DEPENDENCY,
    
    318
    -                            "Circular dependency detected for element: {}"
    
    319
    -                            .format(element.name))
    
    322
    +                            ("Circular dependency detected at element: {}\n" +
    
    323
    +                             "Dependency chain: {}")
    
    324
    +                            .format(element.name, " -> ".join(chain)))
    
    320 325
     
    
    321 326
             # Push / Check each dependency / Pop
    
    322 327
             check_elements[element_name] = True
    
    328
    +        sequence.append(element_name)
    
    323 329
             for dep in element.deps:
    
    324 330
                 loader = self._get_loader_for_dep(dep)
    
    325
    -            loader._check_circular_deps(dep.name, check_elements, validated)
    
    331
    +            loader._check_circular_deps(dep.name, check_elements, validated, sequence)
    
    326 332
             del check_elements[element_name]
    
    333
    +        sequence.pop()
    
    327 334
     
    
    328 335
             # Eliminate duplicate paths
    
    329 336
             validated[element_name] = True
    

  • tests/loader/dependencies.py
    ... ... @@ -110,6 +110,7 @@ def test_circular_dependency(datafiles):
    110 110
             element = loader.load(['elements/circulartarget.bst'])[0]
    
    111 111
     
    
    112 112
         assert (exc.value.reason == LoadErrorReason.CIRCULAR_DEPENDENCY)
    
    113
    +    assert ("seconddep" in exc.value.args[0])
    
    113 114
     
    
    114 115
     
    
    115 116
     @pytest.mark.datafiles(DATA_DIR)
    



  • [Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]