@@ -77,30 +77,33 @@ def get_pack_kind(pack: CodeQLPack) -> CodeQLPackKind:
7777 return kind
7878
7979 def resolve (pack : CodeQLPack ) -> ResolvedCodeQLPack :
80- logger .debug (f"Resolving pack { pack .config .name } @{ pack .config .version } " )
81- if pack in resolved_packs :
82- logger .debug (f"Resolved pack { pack .config .name } @{ pack .config .version } , already resolved." )
83- return resolved_packs [pack ]
84- else :
85- resolved_deps : List [ResolvedCodeQLPack ] = []
86- for dep_name , dep_version in pack .config .dependencies .items ():
87- logger .debug (f"Resolving dependency { dep_name } :{ dep_version } ." )
88- resolved_dep = None
89- for candidate_pack in candidates [dep_name ]:
90- logger .debug (f"Considering candidate pack { candidate_pack .config .name } @{ candidate_pack .config .version } ." )
91- if dep_version .match (candidate_pack .config .version ):
92- logger .debug (f"Found candidate pack { candidate_pack .config .name } @{ candidate_pack .config .version } ." )
93- resolved_dep = resolve (candidate_pack )
94-
95- if not resolved_dep :
96- raise PackResolverException (f"Could not resolve dependency { dep_name } for pack { pack .config .name } !" )
97- resolved_deps .append (resolved_dep )
98-
99-
100- resolved_pack = ResolvedCodeQLPack (path = pack .path , config = pack .config , kind = get_pack_kind (pack ), dependencies = resolved_deps )
101- resolved_packs [pack ] = resolved_pack
102- return resolved_pack
103-
80+ def inner (pack_to_be_resolved : CodeQLPack ) -> ResolvedCodeQLPack :
81+ logger .debug (f"Resolving pack { pack_to_be_resolved .config .name } @{ pack_to_be_resolved .config .version } " )
82+ if pack_to_be_resolved in resolved_packs :
83+ logger .debug (f"Resolved pack { pack_to_be_resolved .config .name } @{ pack_to_be_resolved .config .version } , already resolved." )
84+ return resolved_packs [pack_to_be_resolved ]
85+ else :
86+ resolved_deps : List [ResolvedCodeQLPack ] = []
87+ for dep_name , dep_version in pack_to_be_resolved .config .dependencies .items ():
88+ logger .debug (f"Resolving dependency { dep_name } :{ dep_version } ." )
89+ resolved_dep = None
90+ for candidate_pack in candidates [dep_name ]:
91+ logger .debug (f"Considering candidate pack { candidate_pack .config .name } @{ candidate_pack .config .version } ." )
92+ if candidate_pack == pack :
93+ raise PackResolverException (f"Pack { pack .config .name } @{ str (pack .config .version )} (transitively) depends on itself via { pack_to_be_resolved .config .name } @{ str (pack_to_be_resolved .config .version )} !" )
94+ if dep_version .match (candidate_pack .config .version ):
95+ logger .debug (f"Found candidate pack { candidate_pack .config .name } @{ candidate_pack .config .version } ." )
96+ resolved_dep = inner (candidate_pack )
97+
98+ if not resolved_dep :
99+ raise PackResolverException (f"Could not resolve dependency { dep_name } for pack { pack_to_be_resolved .config .name } !" )
100+ resolved_deps .append (resolved_dep )
101+
102+
103+ resolved_pack = ResolvedCodeQLPack (path = pack_to_be_resolved .path , config = pack_to_be_resolved .config , kind = get_pack_kind (pack_to_be_resolved ), dependencies = resolved_deps )
104+ resolved_packs [pack_to_be_resolved ] = resolved_pack
105+ return resolved_pack
106+ return inner (pack )
104107 return resolve
105108
106109 return builder ()
0 commit comments