Skip to content

Commit a03e9a8

Browse files
committed
Detect circular dependencies
1 parent c4adafe commit a03e9a8

File tree

5 files changed

+50
-24
lines changed

5 files changed

+50
-24
lines changed

codeql_bundle/helpers/bundle.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
provide:
2+
- "**/qlpack.yml"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
library: false
3+
warnOnImplicitThis: false
4+
name: cycle/x
5+
version: 0.0.1
6+
dependencies:
7+
"cycle/y": "*"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
library: false
3+
warnOnImplicitThis: false
4+
name: cycle/y
5+
version: 0.0.1
6+
dependencies:
7+
"cycle/z": "*"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
library: false
3+
warnOnImplicitThis: false
4+
name: cycle/z
5+
version: 0.0.1
6+
dependencies:
7+
"cycle/x": "*"

0 commit comments

Comments
 (0)