diff --git a/packages/rust/src/generators/release-version/release-version.spec.ts b/packages/rust/src/generators/release-version/release-version.spec.ts index 0616e73..0eb061a 100644 --- a/packages/rust/src/generators/release-version/release-version.spec.ts +++ b/packages/rust/src/generators/release-version/release-version.spec.ts @@ -534,6 +534,48 @@ To fix this you will either need to add a Cargo.toml file at that location, or c } `); }); + + it(`should not throw with project without cargo.toml and even when filtering to a subset of projects which do not include those dependents`, async () => { + // Add project without Cargo.toml + const projectWithoutCargoToml = 'project-without-cargoToml'; + projectGraph.nodes[projectWithoutCargoToml] = { + name: projectWithoutCargoToml, + type: 'lib', + data: { + root: `libs/${projectWithoutCargoToml}`, + }, + }; + projectGraph.dependencies[projectWithoutCargoToml] = [ + { + target: projectWithoutCargoToml, + source: 'project-with-dependency-on-my-pkg', + type: 'static', + }, + ]; + tree.write( + `libs/${projectWithoutCargoToml}/package.json`, + JSON.stringify({ name: projectWithoutCargoToml, version: '0.0.1' }) + ); + + await releaseVersionGenerator(tree, { + projects: [projectGraph.nodes['my-lib']], // version only my-lib + projectGraph, + specifier: '9.9.9', // user CLI specifier override set, no prompting should occur + currentVersionResolver: 'disk', + specifierSource: 'prompt', + releaseGroup: createReleaseGroup('independent'), + }); + + expect(parseCargoTomlWithTree(tree, 'libs/my-lib', 'my-lib')) + .toMatchInlineSnapshot(` + Object { + "package": Object { + "name": "my-lib", + "version": "9.9.9", + }, + } + `); + }); }); }); diff --git a/packages/rust/src/generators/release-version/release-version.ts b/packages/rust/src/generators/release-version/release-version.ts index 19ac757..202e64b 100644 --- a/packages/rust/src/generators/release-version/release-version.ts +++ b/packages/rust/src/generators/release-version/release-version.ts @@ -588,17 +588,32 @@ function resolveLocalPackageDependencies( filteredProjects: ProjectGraphProjectNode[], projectNameToPackageRootMap: Map, resolvePackageRoot: (projectNode: ProjectGraphProjectNode) => string, - includeAll = false + includeDependents = false ): Record { const localPackageDependencies: Record = {}; + const filteredProjectsSet = new Set(); + + // Recursively retrieves all dependents for a given project + function addDeps(projectName: string, seen: Set) { + if (seen.has(projectName)) return; + seen.add(projectName); + Object.values(projectGraph.dependencies) + .filter((deps) => deps.some((d) => d.target === projectName)) + .flatMap((deps) => deps.map((d) => d.source)) + .forEach((d) => addDeps(d, seen)); + } + + filteredProjects.forEach((p) => addDeps(p.name, filteredProjectsSet)); - const projects = includeAll - ? Object.values(projectGraph.nodes) + const projects = includeDependents + ? [...filteredProjectsSet] + .map((dep) => projectGraph.nodes[dep]) + .filter(Boolean) : filteredProjects; for (const projectNode of projects) { // Ensure that the packageRoot is resolved for the project and added to the map for later use - if (includeAll) { + if (includeDependents) { fillPackageRootMap( projectNameToPackageRootMap, projectNode, diff --git a/rust-toolchain.toml b/rust-toolchain.toml index a67bfb7..e588558 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.79.0" +channel = "1.80.0" targets = ["wasm32-wasip1-threads"] profile = "default"