Skip to content

Commit 416aad4

Browse files
authored
fix: duplicate package dependencies in lock file (#189)
Make sure that package dependencies in a lock file are added only once. Resolves #184 & Closes #184.
1 parent df77121 commit 416aad4

File tree

4 files changed

+50
-6
lines changed

4 files changed

+50
-6
lines changed

MODULE.bazel

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,14 @@ apt.install(
9696
manifest = "apt/tests/resolution/arch_all.yaml",
9797
nolock = True,
9898
)
99+
apt.install(
100+
name = "unique_dependencies",
101+
manifest = "//apt/tests/resolution:dependencies.yaml",
102+
nolock = True,
103+
)
99104
apt.install(
100105
name = "clang",
101106
manifest = "apt/tests/resolution/clang.yaml",
102107
nolock = True,
103108
)
104-
use_repo(apt, "arch_all_test", "arch_all_test_resolve", "bullseye", "bullseye_nolock", "clang", "noble", "resolution_test", "resolution_test_empty_lock_resolve", "resolution_test_resolve")
109+
use_repo(apt, "arch_all_test", "arch_all_test_resolve", "bullseye", "bullseye_nolock", "clang", "noble", "resolution_test", "resolution_test_empty_lock_resolve", "resolution_test_resolve", "unique_dependencies_resolve")

apt/private/lockfile.bzl

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"lock"
22

3+
load("@bazel_skylib//lib:new_sets.bzl", "sets")
34
load(":util.bzl", "util")
45

56
def _make_package_key(name, version, arch):
@@ -29,17 +30,22 @@ def _add_package(lock, package, arch):
2930
"dependencies": [],
3031
})
3132
lock.fast_package_lookup[k] = len(lock.packages) - 1
33+
lock.fast_package_dependencies_lookup[k] = sets.make()
3234

3335
def _add_package_dependency(lock, package, dependency, arch):
3436
k = _package_key(package, arch)
3537
if k not in lock.fast_package_lookup:
3638
fail("Broken state: %s is not in the lockfile." % package["Package"])
3739
i = lock.fast_package_lookup[k]
38-
lock.packages[i]["dependencies"].append(dict(
39-
key = _package_key(dependency, arch),
40-
name = dependency["Package"],
41-
version = dependency["Version"],
42-
))
40+
41+
dependency_key = _package_key(dependency, arch)
42+
if not sets.contains(lock.fast_package_dependencies_lookup[k], dependency_key):
43+
lock.packages[i]["dependencies"].append(dict(
44+
key = dependency_key,
45+
name = dependency["Package"],
46+
version = dependency["Version"],
47+
))
48+
lock.fast_package_dependencies_lookup[k] = sets.insert(lock.fast_package_dependencies_lookup[k], dependency_key)
4349

4450
def _has_package(lock, name, version, arch):
4551
key = "%s_%s_%s" % (util.sanitize(name), util.sanitize(version), arch)
@@ -60,6 +66,7 @@ def _empty(rctx):
6066
version = 1,
6167
packages = list(),
6268
fast_package_lookup = dict(),
69+
fast_package_dependencies_lookup = dict(),
6370
)
6471
return _create(rctx, lock)
6572

@@ -75,6 +82,7 @@ def _from_json(rctx, content):
7582
version = lock["version"],
7683
packages = lock["packages"],
7784
fast_package_lookup = dict(),
85+
fast_package_dependencies_lookup = dict(),
7886
)
7987
for (i, package) in enumerate(lock.packages):
8088
# TODO: only support urls before 1.0
@@ -83,6 +91,7 @@ def _from_json(rctx, content):
8391

8492
lock.packages[i] = package
8593
lock.fast_package_lookup[package["key"]] = i
94+
lock.fast_package_dependencies_lookup[package["key"]] = sets.make([d["key"] for d in package["dependencies"]])
8695
return _create(rctx, lock)
8796

8897
lockfile = struct(

apt/tests/resolution/BUILD.bazel

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,21 @@ assert_contains(
6262
expected = "73",
6363
)
6464

65+
jq(
66+
name = "unique_dependencies",
67+
srcs = [
68+
"@unique_dependencies_resolve//:lockfile",
69+
],
70+
args = ["-rj"],
71+
filter = '.packages | map(select(.name == "gcc")) | .[0].dependencies | group_by(.) | map(select(length>1) | .[0]) | length',
72+
)
73+
74+
assert_contains(
75+
name = "test_unique_dependencies",
76+
actual = ":unique_dependencies",
77+
expected = "0",
78+
)
79+
6580
build_test(
6681
name = "build_clang",
6782
target_compatible_with = [
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
version: 1
2+
sources:
3+
- channel: jammy main
4+
url: https://snapshot.ubuntu.com/ubuntu/20250302T030400Z
5+
- channel: jammy universe
6+
url: https://snapshot.ubuntu.com/ubuntu/20250302T030400Z
7+
- channel: jammy-security main
8+
url: https://snapshot.ubuntu.com/ubuntu/20250302T030400Z
9+
- channel: jammy-updates main
10+
url: https://snapshot.ubuntu.com/ubuntu/20250302T030400Z
11+
archs:
12+
- "arm64"
13+
packages:
14+
- "gcc"
15+
- "gcc-aarch64-linux-gnu"

0 commit comments

Comments
 (0)