Skip to content

Commit ae7d35d

Browse files
committed
cargo: Do not look pkg in subprojects when we have its manifest
It was wasteful, but also failed when the .wrap file miss that dependency from [provide] section and no Cargo.lock file provide it either.
1 parent 7f31642 commit ae7d35d

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

mesonbuild/cargo/interpreter.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def interpret_package(self, manifest: Manifest, build: builder.Builder, subdir:
117117
member = ws.packages_to_member[manifest.package.name]
118118
pkg = ws.packages[member]
119119
else:
120-
pkg, cached = self._fetch_package(manifest.package.name, manifest.package.api)
120+
pkg, cached = self._fetch_package_from_manifest(manifest)
121121
if not cached:
122122
# This is an entry point, always enable the 'default' feature.
123123
# FIXME: We should have a Meson option similar to `cargo build --no-default-features`
@@ -223,15 +223,15 @@ def _require_workspace_member(self, ws: WorkspaceState, member: str) -> PackageS
223223
ws.required_members.append(member)
224224
return pkg
225225

226-
def _fetch_package(self, package_name: str, api: str) -> T.Tuple[PackageState, bool]:
226+
def _fetch_package(self, package_name: str, api: str) -> PackageState:
227227
key = PackageKey(package_name, api)
228228
pkg = self.packages.get(key)
229229
if pkg:
230-
return pkg, True
230+
return pkg
231231
meson_depname = _dependency_name(package_name, api)
232232
return self._fetch_package_from_subproject(package_name, meson_depname)
233233

234-
def _fetch_package_from_subproject(self, package_name: str, meson_depname: str) -> T.Tuple[PackageState, bool]:
234+
def _fetch_package_from_subproject(self, package_name: str, meson_depname: str) -> PackageState:
235235
subp_name, _ = self.environment.wrap_resolver.find_dep_provider(meson_depname)
236236
if subp_name is None:
237237
# If Cargo.lock has a different version, this could be a resolution
@@ -251,17 +251,28 @@ def _fetch_package_from_subproject(self, package_name: str, meson_depname: str)
251251
downloaded = \
252252
subp_name in self.environment.wrap_resolver.wraps and \
253253
self.environment.wrap_resolver.wraps[subp_name].type is not None
254+
254255
if isinstance(manifest, Workspace):
255256
ws = self._get_workspace(manifest, subdir)
256257
member = ws.packages_to_member[package_name]
257258
pkg = self._require_workspace_member(ws, member)
258-
return pkg, False
259+
return pkg
260+
259261
key = PackageKey(package_name, version.api(manifest.package.version))
262+
pkg = self.packages.get(key)
263+
if pkg:
264+
return pkg
265+
pkg = PackageState(manifest, downloaded)
266+
self.packages[key] = pkg
267+
self._prepare_package(pkg)
268+
return pkg
260269

270+
def _fetch_package_from_manifest(self, manifest: Manifest) -> T.Tuple[PackageState, bool]:
271+
key = PackageKey(manifest.package.name, version.api(manifest.package.version))
261272
pkg = self.packages.get(key)
262273
if pkg:
263274
return pkg, True
264-
pkg = PackageState(manifest, downloaded)
275+
pkg = PackageState(manifest, downloaded=False)
265276
self.packages[key] = pkg
266277
self._prepare_package(pkg)
267278
return pkg, False
@@ -287,7 +298,7 @@ def _dep_package(self, pkg: PackageState, dep: Dependency) -> PackageState:
287298
dep_pkg = self._require_workspace_member(ws, dep_member)
288299
elif dep.git:
289300
_, _, directory = _parse_git_url(dep.git, dep.branch)
290-
dep_pkg, _ = self._fetch_package_from_subproject(dep.package, directory)
301+
dep_pkg = self._fetch_package_from_subproject(dep.package, directory)
291302
else:
292303
# From all available versions from Cargo.lock, pick the most recent
293304
# satisfying the constraints
@@ -302,7 +313,7 @@ def _dep_package(self, pkg: PackageState, dep: Dependency) -> PackageState:
302313
else:
303314
if not dep.meson_version:
304315
raise MesonException(f'Cannot determine version of cargo package {dep.package}')
305-
dep_pkg, _ = self._fetch_package(dep.package, dep.api)
316+
dep_pkg = self._fetch_package(dep.package, dep.api)
306317
return dep_pkg
307318

308319
def _load_manifest(self, subdir: str, workspace: T.Optional[Workspace] = None, member_path: str = '') -> T.Union[Manifest, Workspace]:

0 commit comments

Comments
 (0)