Skip to content

Commit 56e84d3

Browse files
xclaessedcbaker
authored andcommitted
wrap: wraps from subprojects can replace directories found with no wrap
If main project finds a directory subprojects/foo with no corresponding foo.wrap, it creates a dummy PackageDefinition for it. If we later find a subproject that has foo.wrap, replace the dummy wrap with it. This happens for example when wrap-redirect have been deleted. It also happens for subprojects downloaded from some Cargo.lock which does not create a wrap-redirect. Avoid loading the same location twice, which can happen when preparing cargo subprojects.
1 parent 095c852 commit 56e84d3

File tree

5 files changed

+42
-6
lines changed

5 files changed

+42
-6
lines changed

mesonbuild/wrap/wrap.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ def __post_init__(self) -> None:
354354
self.wrapdb: T.Dict[str, T.Any] = {}
355355
self.wrapdb_provided_deps: T.Dict[str, str] = {}
356356
self.wrapdb_provided_programs: T.Dict[str, str] = {}
357+
self.loaded_dirs: T.Set[str] = set()
357358
self.load_wraps()
358359
self.load_netrc()
359360
self.load_wrapdb()
@@ -395,6 +396,7 @@ def load_wraps(self) -> None:
395396
# Add provided deps and programs into our lookup tables
396397
for wrap in self.wraps.values():
397398
self.add_wrap(wrap)
399+
self.loaded_dirs.add(self.subdir)
398400

399401
def add_wrap(self, wrap: PackageDefinition) -> None:
400402
for k in wrap.provided_deps.keys():
@@ -439,16 +441,25 @@ def get_from_wrapdb(self, subp_name: str) -> T.Optional[PackageDefinition]:
439441

440442
def _merge_wraps(self, other_resolver: 'Resolver') -> None:
441443
for k, v in other_resolver.wraps.items():
442-
self.wraps.setdefault(k, v)
443-
for k, v in other_resolver.provided_deps.items():
444-
self.provided_deps.setdefault(k, v)
445-
for k, v in other_resolver.provided_programs.items():
446-
self.provided_programs.setdefault(k, v)
444+
prev_wrap = self.wraps.get(v.directory)
445+
if prev_wrap and prev_wrap.type is None and v.type is not None:
446+
# This happens when a subproject has been previously downloaded
447+
# using a wrap from another subproject and the wrap-redirect got
448+
# deleted. In that case, the main project created a bare wrap
449+
# for the download directory, but now we have a proper wrap.
450+
# It also happens for wraps coming from Cargo.lock files, which
451+
# don't create wrap-redirect.
452+
del self.wraps[v.directory]
453+
del self.provided_deps[v.directory]
454+
if k not in self.wraps:
455+
self.wraps[k] = v
456+
self.add_wrap(v)
447457

448458
def load_and_merge(self, subdir: str, subproject: SubProject) -> None:
449-
if self.wrap_mode != WrapMode.nopromote:
459+
if self.wrap_mode != WrapMode.nopromote and subdir not in self.loaded_dirs:
450460
other_resolver = Resolver(self.source_dir, subdir, subproject, self.wrap_mode, self.wrap_frontend, self.allow_insecure, self.silent)
451461
self._merge_wraps(other_resolver)
462+
self.loaded_dirs.add(subdir)
452463

453464
def find_dep_provider(self, packagename: str) -> T.Tuple[T.Optional[str], T.Optional[str]]:
454465
# Python's ini parser converts all key values to lowercase.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
project('wrap override')
2+
3+
4+
subproject('sub')
5+
6+
# sub has subsub.wrap that provides subsub-1.0 dependency. Even if sub itself
7+
# does not use it, that dependency should now be available.
8+
dependency('subsub-1.0')
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
project('sub')
2+
3+
# Simulate an optional feature that requires subsub.wrap, but that feature is
4+
# not enabled.
5+
if false
6+
dependency('subsub-1.0')
7+
endif
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[wrap-file]
2+
3+
4+
[provide]
5+
dependency_names = subsub-1.0
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
project('sub')
2+
3+
# This simulates a subproject we previously downloaded using
4+
# subproject/sub/subproject/subsub.wrap
5+
meson.override_dependency('subsub-1.0', declare_dependency())

0 commit comments

Comments
 (0)