From 44bb92f49ab90de40c7e227655b6e19af540efdf Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Wed, 10 Jun 2026 08:26:03 -0700 Subject: [PATCH] [dartdev] Provide no installation feedback in `dart installed` Updates `dart installed` to provide feedback if nothing is installed. If they didn't specify `--all` but there are inactive tools, provide a suggestion to specify the `--all` flag as well. Resolves https://github.com/dart-lang/sdk/issues/61626 Change-Id: I7d68fe91a29650c113047065e673e7a1139df847 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/510020 Reviewed-by: Daco Harkes Reviewed-by: Ben Konyi Commit-Queue: Ben Konyi --- pkg/dartdev/lib/src/commands/installed.dart | 22 ++++-- .../test/native_assets/install_test.dart | 67 ++++++++++++++++++- 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/pkg/dartdev/lib/src/commands/installed.dart b/pkg/dartdev/lib/src/commands/installed.dart index 4d0b953b530..34d86022d52 100644 --- a/pkg/dartdev/lib/src/commands/installed.dart +++ b/pkg/dartdev/lib/src/commands/installed.dart @@ -12,6 +12,10 @@ import 'package:pub_formats/pub_formats.dart'; class InstalledCommand extends DartdevCommand { static const cmdName = 'installed'; static const cmdDescription = 'List globally installed Dart CLI tools.'; + static const noToolsInstalledMessage = 'No Dart CLI tools installed.'; + static const noActiveToolsInstalledMessage = + 'No active Dart CLI tools installed. ' + 'Run "dart installed --all" to show inactive tools.'; @override CommandCategory get commandCategory => CommandCategory.global; @@ -34,11 +38,21 @@ on `PATH` are non-active.''', final all = argResults.flag('all'); final installedPackages = getInstalledPackages(); - for (final package in installedPackages) { - if (package.installed == Installed.not && !all) { - continue; + final packagesToShow = [ + for (final package in installedPackages) + if (all || package.installed != Installed.not) package, + ]; + + if (packagesToShow.isEmpty) { + if (all || installedPackages.isEmpty) { + print(noToolsInstalledMessage); + } else { + print(noActiveToolsInstalledMessage); + } + } else { + for (final package in packagesToShow) { + print(package.toString()); } - print(package.toString()); } return 0; diff --git a/pkg/dartdev/test/native_assets/install_test.dart b/pkg/dartdev/test/native_assets/install_test.dart index 24956f21c6b..0348007f62f 100644 --- a/pkg/dartdev/test/native_assets/install_test.dart +++ b/pkg/dartdev/test/native_assets/install_test.dart @@ -5,6 +5,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:dartdev/src/commands/installed.dart'; import 'package:meta/meta.dart'; import 'package:pub_formats/pub_formats.dart'; import 'package:test/test.dart'; @@ -154,6 +155,67 @@ Run "dart help" to see global options. }); } + skippableTest( + 'dart installed with no installations', + timeout: longTimeout, + () async { + await inTempDir((tempUri) async { + final binDir = Directory.fromUri(tempUri.resolve('install/bin')); + + final environment = { + _dartDirectoryEnvKey: tempUri.toFilePath(), + 'PATH': + '${binDir.path}$_pathEnvVarSeparator' + '${Platform.environment['PATH']!}', + }; + + Future runInstalled([ + List arguments = const [], + ]) => _runDartdev( + fromDartdevSource, + 'installed', + arguments, + null, + environment, + ); + + final emptyResult = await runInstalled(); + expect( + emptyResult.stdout.trim(), + equals(InstalledCommand.noToolsInstalledMessage), + ); + expect(emptyResult.stderr, isEmpty); + + final emptyAllResult = await runInstalled(['--all']); + expect( + emptyAllResult.stdout.trim(), + equals(InstalledCommand.noToolsInstalledMessage), + ); + expect(emptyAllResult.stderr, isEmpty); + + await _runDartdev( + fromDartdevSource, + 'install', + [_package2Dir.path], + null, + environment, + ); + + // Delete the bin directory to inactivate the installed tool. + if (binDir.existsSync()) { + binDir.deleteSync(recursive: true); + } + + final inactiveResult = await runInstalled(); + expect( + inactiveResult.stdout.trim(), + equals(InstalledCommand.noActiveToolsInstalledMessage), + ); + expect(inactiveResult.stderr, isEmpty); + }); + }, + ); + final argumentss = [ (null, [_packageForTest]), (null, [_packageForTest, _packageVersion]), @@ -735,7 +797,10 @@ void main(List args) async { null, environment, ); - expect(await runInstalled(), hasLength(0)); + expect( + await runInstalled(), + equals([InstalledCommand.noToolsInstalledMessage]), + ); }); }, );