updateWorkspaceDependencies function

Future<void> updateWorkspaceDependencies({
  1. required WorkspaceInfo workspace,
  2. required List<WorkspacePackage> packages,
  3. required Map<String, Version> updatedVersions,
})

Updates dependencies in workspace packages that reference other workspace packages

Implementation

Future<void> updateWorkspaceDependencies({
  required WorkspaceInfo workspace,
  required List<WorkspacePackage> packages,
  required Map<String, Version> updatedVersions,
}) async {
  // Create a map of package names to their directories for quick lookup
  final packageMap = <String, WorkspacePackage>{};
  for (final package in packages) {
    packageMap[package.name] = package;
  }

  // Update dependencies in all packages
  for (final package in packages) {
    final pubspecFile = File(path.join(package.directory.path, 'pubspec.yaml'));
    if (!pubspecFile.existsSync()) {
      continue;
    }

    final pubspecContent = await pubspecFile.readAsString();
    final dependencies = PubspecUtils.getAllDependencies(pubspecContent);

    bool needsUpdate = false;

    // Check if this package depends on any of the updated packages
    for (final dependencyName in dependencies.keys) {
      if (updatedVersions.containsKey(dependencyName) && packageMap.containsKey(dependencyName)) {
        // This is a workspace dependency that was updated
        needsUpdate = true;
        break;
      }
    }

    if (needsUpdate) {
      // Update each workspace dependency
      for (final entry in updatedVersions.entries) {
        final dependencyName = entry.key;
        final newVersion = entry.value;

        // Check if this package depends on this workspace package
        if (dependencies.containsKey(dependencyName)) {
          try {
            await PubspecUtils.updateWorkspaceDependency(
              pubspecFile,
              dependencyName,
              newVersion,
            );
            logger.info('Updated dependency $dependencyName to $newVersion in ${package.name}');
          } catch (e) {
            logger.warn('Failed to update dependency $dependencyName in ${package.name}: $e');
          }
        }
      }
    }
  }
}