Handle all examples in workspace with flag `--example` (#4679)
diff --git a/lib/src/command/add.dart b/lib/src/command/add.dart index 7c6c701..e6d6e54 100644 --- a/lib/src/command/add.dart +++ b/lib/src/command/add.dart
@@ -291,14 +291,14 @@ precompile: !argResults.isDryRun && argResults.shouldPrecompile, ); - if (!argResults.isDryRun && - argResults.example && - entrypoint.example != null) { - await entrypoint.example!.acquireDependencies( - SolveType.get, - precompile: argResults.shouldPrecompile, - summaryOnly: true, - ); + if (!argResults.isDryRun && argResults.example) { + for (final example in entrypoint.examples) { + await example.acquireDependencies( + SolveType.get, + precompile: argResults.shouldPrecompile, + summaryOnly: true, + ); + } } if (isOffline) {
diff --git a/lib/src/command/downgrade.dart b/lib/src/command/downgrade.dart index 1bdd092..cd90376 100644 --- a/lib/src/command/downgrade.dart +++ b/lib/src/command/downgrade.dart
@@ -81,21 +81,27 @@ unlock: argResults.rest, dryRun: _dryRun, ); - final example = entrypoint.example; - if (argResults.flag('example') && example != null) { - await example.acquireDependencies( - SolveType.get, - unlock: argResults.rest, - dryRun: _dryRun, - summaryOnly: true, - ); + if (_example) { + for (final example in entrypoint.examples) { + await example.acquireDependencies( + SolveType.get, + unlock: argResults.rest, + dryRun: _dryRun, + summaryOnly: true, + ); + } } if (_tighten) { - if (_example && entrypoint.example != null) { - log.warning( - 'Running `downgrade --tighten` only in `${entrypoint.workspaceRoot.dir}`. Run `$topLevelProgram pub upgrade --tighten --directory example/` separately.', - ); + if (_example && entrypoint.examples.isNotEmpty) { + for (final example in entrypoint.examples) { + log.warning( + 'Running `downgrade --tighten` only in ' + '`${entrypoint.workspaceRoot.dir}`. ' + 'Run `$topLevelProgram pub downgrade --tighten ' + '--directory ${example.workspaceRoot.presentationDir}` separately.', + ); + } } final changes = entrypoint.tighten(); entrypoint.applyChanges(changes, _dryRun);
diff --git a/lib/src/command/get.dart b/lib/src/command/get.dart index 4e522c0..978d6f6 100644 --- a/lib/src/command/get.dart +++ b/lib/src/command/get.dart
@@ -84,15 +84,16 @@ enforceLockfile: argResults.flag('enforce-lockfile'), ); - final example = entrypoint.example; - if ((argResults.flag('example')) && example != null) { - await example.acquireDependencies( - SolveType.get, - dryRun: argResults.flag('dry-run'), - precompile: argResults.flag('precompile'), - summaryOnly: true, - enforceLockfile: argResults.flag('enforce-lockfile'), - ); + if (argResults.flag('example')) { + for (final example in entrypoint.examples) { + await example.acquireDependencies( + SolveType.get, + dryRun: argResults.flag('dry-run'), + precompile: argResults.flag('precompile'), + summaryOnly: true, + enforceLockfile: argResults.flag('enforce-lockfile'), + ); + } } } }
diff --git a/lib/src/command/remove.dart b/lib/src/command/remove.dart index 32e7590..df648e9 100644 --- a/lib/src/command/remove.dart +++ b/lib/src/command/remove.dart
@@ -98,13 +98,14 @@ dryRun: isDryRun, ); - final example = entrypoint.example; - if (!isDryRun && argResults.flag('example') && example != null) { - await example.acquireDependencies( - SolveType.get, - precompile: argResults.flag('precompile'), - summaryOnly: true, - ); + if (!isDryRun && argResults.flag('example')) { + for (final example in entrypoint.examples) { + await example.acquireDependencies( + SolveType.get, + precompile: argResults.flag('precompile'), + summaryOnly: true, + ); + } } }
diff --git a/lib/src/command/upgrade.dart b/lib/src/command/upgrade.dart index a817ff4..0c25686 100644 --- a/lib/src/command/upgrade.dart +++ b/lib/src/command/upgrade.dart
@@ -155,19 +155,30 @@ } if (_upgradeMajorVersions) { - if (argResults.flag('example') && entrypoint.example != null) { - log.warning( - 'Running `upgrade --major-versions` only in `${entrypoint.workspaceRoot.dir}`. Run `$topLevelProgram pub upgrade --major-versions --directory example/` separately.', - ); + if (argResults.flag('example')) { + for (final example in entrypoint.examples) { + log.warning( + 'Running `upgrade --major-versions` only in ' + '`${entrypoint.workspaceRoot.dir}`. ' + 'Run `$topLevelProgram pub upgrade --major-versions ' + '--directory ${example.workspaceRoot.presentationDir}` separately.', + ); + } } await _runUpgradeMajorVersions(); } else { await _runUpgrade(entrypoint); if (_tighten) { - if (argResults.flag('example') && entrypoint.example != null) { - log.warning( - 'Running `upgrade --tighten` only in `${entrypoint.workspaceRoot.dir}`. Run `$topLevelProgram pub upgrade --tighten --directory example/` separately.', - ); + if (argResults.flag('example')) { + for (final example in entrypoint.examples) { + log.warning( + 'Running `upgrade --tighten` only in ' + '`${entrypoint.workspaceRoot.dir}`. ' + 'Run `$topLevelProgram pub upgrade --tighten ' + '--directory ${example.workspaceRoot.presentationDir}` ' + 'separately.', + ); + } } final changes = entrypoint.tighten( packagesToUpgrade: await _packagesToUpgrade, @@ -175,11 +186,10 @@ entrypoint.applyChanges(changes, _dryRun); } } - if (argResults.flag('example') && entrypoint.example != null) { - // Reload the entrypoint to ensure we pick up potential changes that has - // been made. - final exampleEntrypoint = Entrypoint(directory, cache).example!; - await _runUpgrade(exampleEntrypoint, onlySummary: true); + if (argResults.flag('example')) { + for (final example in entrypoint.examples) { + await _runUpgrade(example, onlySummary: true); + } } }
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart index 3f2be96..2eda882 100644 --- a/lib/src/entrypoint.dart +++ b/lib/src/entrypoint.dart
@@ -321,7 +321,7 @@ Entrypoint._( this.workingDir, this._lockFile, - this._example, + this._examples, this._packageGraph, this.cache, this._packages, @@ -349,10 +349,15 @@ final newWorkPackage = newWorkspaceRoot.transitiveWorkspace.firstWhere( (package) => package.dir == workPackage.dir, ); - return Entrypoint._(workingDir, _lockFile, _example, _packageGraph, cache, ( - root: newWorkspaceRoot, - work: newWorkPackage, - ), isCachedGlobal); + return Entrypoint._( + workingDir, + _lockFile, + _examples, + _packageGraph, + cache, + (root: newWorkspaceRoot, work: newWorkPackage), + isCachedGlobal, + ); } /// Creates an entrypoint at the same location, that will use [pubspec] for @@ -378,18 +383,30 @@ } } - /// Gets the [Entrypoint] package for the current working directory. + /// Gets [Entrypoint]s for examples of any workspace packages. /// - /// This will be null if the example folder doesn't have a `pubspec.yaml`. - Entrypoint? get example { - if (_example != null) return _example; - if (!fileExists(workspaceRoot.path('example', 'pubspec.yaml'))) { - return null; + /// Does not return examples that are already in the workspace + /// + /// This will be empty if the example folder doesn't have a `pubspec.yaml`. + List<Entrypoint> get examples { + if (_examples case final List<Entrypoint> examples) return examples; + final directoriesInWorkspace = <String>{}; + for (final package in workspaceRoot.transitiveWorkspace) { + directoriesInWorkspace.add(p.canonicalize(package.dir)); } - return _example = Entrypoint(workspaceRoot.path('example'), cache); + final result = <Entrypoint>[]; + for (final package in workspaceRoot.transitiveWorkspace) { + final examplePath = package.path('example'); + + if (!directoriesInWorkspace.contains(p.canonicalize(examplePath)) && + fileExists(p.join(examplePath, 'pubspec.yaml'))) { + result.add(Entrypoint(examplePath, cache)); + } + } + return _examples = result; } - Entrypoint? _example; + List<Entrypoint>? _examples; /// Writes the .dart_tool/package_config.json file and workspace references to /// it.
diff --git a/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt b/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt index 0fb9eb7..708e8b3 100644 --- a/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt +++ b/test/testdata/goldens/upgrade/example_warns_about_major_versions_test/pub upgrade --major-versions does not update major versions in example~.txt
@@ -12,7 +12,7 @@ Resolving dependencies in `./example`... Downloading packages... Got dependencies in `./example`. -[STDERR] Running `upgrade --major-versions` only in `.`. Run `dart pub upgrade --major-versions --directory example/` separately. +[STDERR] Running `upgrade --major-versions` only in `.`. Run `dart pub upgrade --major-versions --directory ./example` separately. -------------------------------- END OF OUTPUT ---------------------------------
diff --git a/test/workspace_test.dart b/test/workspace_test.dart index b348f8b..ff9fa35 100644 --- a/test/workspace_test.dart +++ b/test/workspace_test.dart
@@ -1725,6 +1725,104 @@ output: contains('+ bar'), ); }); + + test('`--example` gets all (non-workspace) examples in workspace', () async { + final server = await servePackages(); + server.serve('foo', '1.0.0'); + server.serve('foo', '1.5.0'); + + await dir(appPath, [ + libPubspec( + 'myapp', + '1.2.3', + extras: { + 'workspace': ['pkgs/a'], + }, + sdk: '^3.5.0', + ), + dir('pkgs', [ + dir('a', [ + libPubspec('a', '1.0.0', resolutionWorkspace: true), + dir('example', [libPubspec('example_b', '1.0.0')]), + ]), + dir('b', [ + libPubspec( + 'b', + '1.0.0', + resolutionWorkspace: true, + extras: { + 'workspace': ['example'], + }, + ), + dir('example', [libPubspec('example_b', '1.0.0')]), + ]), + ]), + ]).create(); + + final s = p.separator; + + await runPub( + args: ['get', '--example'], + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + output: allOf( + contains('Got dependencies in `.${s}pkgs/a${s}example`.'), + isNot(contains('Got dependencies in `.${s}pkgs/b${s}example`.`.')), + ), + ); + + await runPub( + args: ['upgrade', '--example'], + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + output: allOf( + contains('Got dependencies in `.${s}pkgs/a${s}example`.'), + isNot(contains('Got dependencies in `.${s}pkgs/b${s}example`.`.')), + ), + ); + + await runPub( + args: ['upgrade', '--example', '--tighten'], + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + output: allOf( + contains('Got dependencies in `.${s}pkgs/a${s}example`.'), + isNot(contains('Got dependencies in `.${s}pkgs/b${s}example`.`.')), + ), + error: contains( + 'Running `upgrade --tighten` only in `.`. Run `dart pub upgrade --tighten --directory .${s}pkgs/a${s}example` separately.', + ), + ); + + await runPub( + args: ['upgrade', '--example', '--major-versions'], + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + output: allOf( + contains('Got dependencies in `.${s}pkgs/a${s}example`.'), + isNot(contains('Got dependencies in `.${s}pkgs/b${s}example`.')), + ), + error: contains( + 'Running `upgrade --major-versions` only in `.`. Run `dart pub upgrade --major-versions --directory .${s}pkgs/a${s}example` separately.', + ), + ); + + await runPub( + args: ['add', 'foo:^1.0.0', '--example'], + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + output: allOf( + contains('+ foo 1.5.0'), + contains('Got dependencies in `.${s}pkgs/a${s}example`.'), + isNot(contains('Got dependencies in `.${s}pkgs/b${s}example`.')), + ), + ); + + await runPub( + args: ['downgrade', '--example'], + environment: {'_PUB_TEST_SDK_VERSION': '3.5.0'}, + output: allOf( + contains('< foo 1.0.0'), + contains('Got dependencies in `.${s}pkgs/a${s}example`.'), + isNot(contains('Got dependencies in `.${s}pkgs/b${s}example`.`.')), + ), + ); + }); } final s = p.separator;