Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update list_command.dart #798

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 138 additions & 39 deletions lib/src/commands/list_command.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:dart_console/dart_console.dart';
import 'package:mason_logger/mason_logger.dart';

import '../models/flutter_version_model.dart';
import '../services/cache_service.dart';
import '../services/global_version_service.dart';
import '../services/logger_service.dart';
Expand All @@ -12,6 +13,61 @@ import '../utils/get_directory_size.dart';
import '../utils/helpers.dart';
import 'base_command.dart';

// ERRORS
enum ListCommandException implements Exception {
noSDKsInstalled;
}

// SERVICE
class ListCommandService {
static Future<ListCommandData> run() async {
final cacheVersions = await CacheService.fromContext.getAllVersions();

final directorySize = await getFullDirectorySize(cacheVersions);

if (cacheVersions.isEmpty) {
throw ListCommandException.noSDKsInstalled;
}

final releases = await FlutterReleasesClient.getReleases();
final globalVersion = GlobalVersionService.fromContext.getGlobal();
final localVersion = ProjectService.fromContext.findVersion();

final versions = <VersionInfo>[];

for (var version in cacheVersions) {
FlutterSdkRelease? latestRelease;

if (version.isChannel && !version.isMaster) {
latestRelease = releases.getLatestChannelRelease(version.name);
}

final release =
releases.getReleaseFromVersion(version.flutterSdkVersion ?? '');

final versionInfo = VersionInfo(
name: version.name,
type: version.type,
flutterSdkVersion: version.flutterSdkVersion,
dartSdkVersion: version.dartSdkVersion,
release: release,
isGlobal: globalVersion == version,
isLocal: localVersion == version.name && localVersion != null,
needsSetup: version.isNotSetup,
latestRelease: latestRelease,
);

versions.add(versionInfo);
}

return ListCommandData(
versions: versions,
directorySize: directorySize,
versionsCachePath: ctx.versionsCachePath,
);
}
}

/// List installed SDK Versions
class ListCommand extends BaseCommand {
@override
Expand All @@ -25,17 +81,75 @@ class ListCommand extends BaseCommand {

@override
Future<int> run() async {
final cacheVersions = await CacheService.fromContext.getAllVersions();
final ui = ListCommandUI(logger: logger);

try {
final data = await ListCommandService.run();
ui.render(data);
} on ListCommandException catch (e) {
switch (e) {
case ListCommandException.noSDKsInstalled:
ui.renderNoSDKsInstalled();
}
}

final directorySize = await getFullDirectorySize(cacheVersions);
return ExitCode.success.code;
}

// Print where versions are stored
@override
List<String> get aliases => ['ls'];
}

// DATA
class ListCommandData {
final List<VersionInfo> versions;
final int directorySize;
final String versionsCachePath;

const ListCommandData({
required this.versions,
required this.directorySize,
required this.versionsCachePath,
});
}

class VersionInfo {
final String name;
final VersionType type;
final String? flutterSdkVersion;
final String? dartSdkVersion;
final FlutterSdkRelease? release;
final bool isGlobal;
final bool isLocal;
final bool needsSetup;
final FlutterSdkRelease? latestRelease;

const VersionInfo({
required this.name,
required this.type,
this.flutterSdkVersion,
this.dartSdkVersion,
this.release,
required this.isGlobal,
required this.isLocal,
required this.needsSetup,
this.latestRelease,
});
}

// UI
class ListCommandUI {
final LoggerService logger;

const ListCommandUI({required this.logger});

void render(ListCommandData data) {
logger
..info('Cache directory: ${cyan.wrap(ctx.versionsCachePath)}')
..info('Directory Size: ${formatBytes(directorySize)}')
..info('Cache directory: ${cyan.wrap(data.versionsCachePath)}')
..info('Directory Size: ${formatBytes(data.directorySize)}')
..spacer;

if (cacheVersions.any((e) => e.isNotSetup)) {
if (data.versions.any((e) => e.needsSetup)) {
logger
..warn(
'Some versions might still require finishing setup - SDKs have been cloned, but they have not downloaded their dependencies.',
Expand All @@ -45,17 +159,6 @@ class ListCommand extends BaseCommand {
)
..spacer;
}
if (cacheVersions.isEmpty) {
logger
..info('No SDKs have been installed yet. Flutter. SDKs')
..info('installed outside of fvm will not be displayed.');

return ExitCode.success.code;
}

final releases = await FlutterReleasesClient.getReleases();
final globalVersion = GlobalVersionService.fromContext.getGlobal();
final localVersion = ProjectService.fromContext.findVersion();

final table = Table()
..insertColumn(header: 'Version', alignment: TextAlignment.left)
Expand All @@ -66,20 +169,13 @@ class ListCommand extends BaseCommand {
..insertColumn(header: 'Global', alignment: TextAlignment.left)
..insertColumn(header: 'Local', alignment: TextAlignment.left);

for (var version in cacheVersions) {
var printVersion = version.name;
FlutterSdkRelease? latestRelease;

if (version.isChannel && !version.isMaster) {
latestRelease = releases.getLatestChannelRelease(version.name);
}

final release =
releases.getReleaseFromVersion(version.flutterSdkVersion ?? '');

for (var version in data.versions) {
String releaseDate = '';
String channel = '';

final release = version.release;

print(release);
if (release != null) {
releaseDate = friendlyDate(release.releaseDate);
channel = release.channel.name;
Expand All @@ -88,10 +184,13 @@ class ListCommand extends BaseCommand {
String flutterSdkVersion = version.flutterSdkVersion ?? '';

String getVersionOutput() {
if (version.isNotSetup) {
if (version.needsSetup) {
return flutterSdkVersion = '${yellow.wrap('Need setup*')}';
}
if (latestRelease != null && version.isChannel) {

final latestRelease = version.latestRelease;

if (latestRelease != null && version.type == VersionType.channel) {
// If its not the latest version
if (latestRelease.version != version.flutterSdkVersion) {
return '$flutterSdkVersion $rightArrow ${(green.wrap(latestRelease.version))}';
Expand All @@ -106,27 +205,27 @@ class ListCommand extends BaseCommand {
table
..insertRows([
[
printVersion,
version.name,
channel,
getVersionOutput(),
version.dartSdkVersion ?? '',
releaseDate,
globalVersion == version ? green.wrap(dot)! : '',
localVersion == printVersion && localVersion != null
? green.wrap(dot)!
: '',
version.isGlobal ? green.wrap(dot)! : '',
version.isLocal ? green.wrap(dot)! : '',
],
])
..borderStyle = BorderStyle.square
..borderColor = ConsoleColor.white
..borderType = BorderType.grid
..headerStyle = FontStyle.bold;
}
logger.info(table.toString());

return ExitCode.success.code;
logger.info(table.toString());
}

@override
List<String> get aliases => ['ls'];
void renderNoSDKsInstalled() {
logger
..info('No SDKs have been installed yet. Flutter. SDKs')
..info('installed outside of fvm will not be displayed.');
}
}