From 31fa75baa5872e7f094a554c0ec7741742889530 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 19 Aug 2024 12:43:15 +0200 Subject: [PATCH] Handle workspace interdependencies in `downgrade --tighten` (#4346) --- lib/src/entrypoint.dart | 11 +++++++++-- test/downgrade/tighten_test.dart | 31 +++++++++++++++++++++++++++++++ test/test_pub.dart | 2 +- 3 files changed, 41 insertions(+), 3 deletions(-) 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'}, + ); + }); } diff --git a/test/test_pub.dart b/test/test_pub.dart index 1816670a4..463b4dc99 100644 --- a/test/test_pub.dart +++ b/test/test_pub.dart @@ -1130,7 +1130,7 @@ Stream> _replaceOs(Stream> stream) async* { /// of maps, one of them having the property `k` with value `v`, recurse into /// that map. /// -/// Cast the result as a . +/// Cast the result as a ``. T dig(dynamic json, List path) { for (var i = 0; i < path.length; i++) { switch (path[i]) {