diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index 9cea5bc7a..e2b2c5291 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart @@ -1378,7 +1378,12 @@ See https://dart.dev/go/sdk-constraint final toTighten = <(Package, PackageRange)>[]; + // Keep track of the versions of workspace packages - these are not included + // in the lockfile. + final workspaceVersions = {}; + for (final package in workspaceRoot.transitiveWorkspace) { + workspaceVersions[package.name] = package.version; if (packagesToUpgrade.isEmpty) { for (final range in [ ...package.dependencies.values, @@ -1400,10 +1405,12 @@ See https://dart.dev/go/sdk-constraint for (final (package, range) in toTighten) { final changesForPackage = result[package] ??= {}; final constraint = (changesForPackage[range] ?? range).constraint; + final resolvedVersion = (packageVersions?.firstWhere((p) => p.name == range.name) ?? - lockFile.packages[range.name])! - .version; + lockFile.packages[range.name]) + ?.version ?? + workspaceVersions[range.name]!; if (range.source is HostedSource && constraint.isAny) { changesForPackage[range] = range .toRef() diff --git a/test/downgrade/tighten_test.dart b/test/downgrade/tighten_test.dart index 7505b839d..3cec338d9 100644 --- a/test/downgrade/tighten_test.dart +++ b/test/downgrade/tighten_test.dart @@ -30,4 +30,35 @@ void main() { ), ); }); + + test('--tighten works for workspace with internal dependencies', () async { + await servePackages(); + + await d.dir(appPath, [ + d.libPubspec( + 'myapp', + '1.2.3', + extras: { + 'workspace': ['pkgs/a'], + }, + sdk: '^3.5.0', + ), + d.dir('pkgs', [ + d.dir('a', [ + d.libPubspec( + 'a', + '1.1.1', + deps: {'myapp': '^1.0.0'}, + resolutionWorkspace: true, + ), + ]), + ]), + ]).create(); + + await pubDowngrade( + args: ['--tighten'], + output: contains('myapp: ^1.0.0 -> ^1.2.3'), + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + ); + }); }