execute method
Execute check_available_upgrades Input: projectPath, packageName?, includePrerelease?, targetFlutterVersion? Output: per-dependency upgrade info
Implementation
Future<Map<String, dynamic>> execute(Map<String, dynamic> args) async {
final projectPath = args['projectPath'] as String;
final specificPackage = args['packageName'] as String?;
final includePrerelease = args['includePrerelease'] as bool? ?? false;
final pubspec = await _parser.parse(projectPath);
// Determine which packages to check
Map<String, DependencyInfo> packagesToCheck;
if (specificPackage != null) {
final dep = pubspec.dependencies[specificPackage] ??
pubspec.devDependencies[specificPackage];
if (dep == null) {
throw ArgumentError(
'Package $specificPackage not found in pubspec.yaml');
}
packagesToCheck = {specificPackage: dep};
} else {
packagesToCheck = {...pubspec.dependencies, ...pubspec.devDependencies};
}
// Only check hosted packages (skip path, git, sdk dependencies)
packagesToCheck.removeWhere((_, dep) => dep.source != 'hosted');
final upgrades = <Map<String, dynamic>>[];
for (final entry in packagesToCheck.entries) {
try {
final info = await _checkPackageUpgrade(
entry.key,
entry.value,
includePrerelease: includePrerelease,
);
if (info != null) upgrades.add(info);
} catch (e) {
Logger.warn('Failed to check upgrades for ${entry.key}: $e');
upgrades.add({
'packageName': entry.key,
'error': e.toString(),
});
}
}
return {
'projectName': pubspec.name,
'packagesChecked': packagesToCheck.length,
'upgradesAvailable':
upgrades.where((u) => u.containsKey('latestVersion')).length,
'upgrades': upgrades,
};
}