versionWorkspace function

Future<WorkspaceVersionResult> versionWorkspace({
  1. required Directory gitRoot,
  2. required WorkspaceInfo workspace,
  3. String? baseRef,
  4. required bool tag,
  5. String? newRef,
  6. required bool isPreRelease,
  7. required String preReleasePrefix,
  8. required bool commit,
  9. required bool badge,
  10. required bool generateChangelog,
  11. required bool cache,
  12. String? dartFile,
})

Versions all packages in a workspace

Implementation

Future<WorkspaceVersionResult> versionWorkspace({
  required Directory gitRoot,
  required WorkspaceInfo workspace,
  String? baseRef,
  required bool tag,
  String? newRef,
  required bool isPreRelease,
  required String preReleasePrefix,
  required bool commit,
  required bool badge,
  required bool generateChangelog,
  required bool cache,
  String? dartFile,
}) async {
  final packages = getWorkspacePackages(workspace);
  final effectiveNewRef = newRef ?? 'HEAD';

  logger.info('Found ${packages.length} packages in workspace');

  // Track which packages were versioned and their new versions
  final packageResults = <String, VersionResult>{};
  final packageVersions = <String, Version>{};

  // Step 1: Version each changed package
  for (final package in packages) {
    logger.info('Processing package: ${package.name}');

    // Determine the base ref for this package
    // If baseRef is provided, use it; otherwise get the previous tag for this package
    final packageBaseRef = baseRef ??
        (await GitUtils.getPreviousRefForPackage(gitRoot.path, package.name, tagPrefix: 'v') ?? effectiveNewRef);

    // Check if package has changes
    final hasChanges = await packageHasChanges(
      package.relativePath,
      packageBaseRef,
      effectiveNewRef,
      gitRoot,
    );

    if (!hasChanges) {
      logger.info('Package ${package.name} has no changes, skipping versioning');
      continue;
    }

    logger.info('Package ${package.name} has changes, versioning...');

    // Determine tag prefix for this package (format: package-name/v)
    final tagPrefix = '${package.name}/v';

    // Version the package
    try {
      final result = await version(
        gitRoot: gitRoot,
        dartRoot: package.directory,
        baseRef: baseRef,
        tag: tag,
        newRef: effectiveNewRef,
        isPreRelease: isPreRelease,
        preReleasePrefix: preReleasePrefix,
        commit: commit,
        badge: badge,
        generateChangelog: generateChangelog,
        cache: cache,
        tagPrefix: tagPrefix,
        dartFile: dartFile != null ? path.join(package.directory.path, dartFile) : null,
        packageName: package.name,
      );

      packageResults[package.name] = result;
      packageVersions[package.name] = result.version;
      logger.success('Versioned ${package.name} to ${result.version}');
    } catch (e) {
      logger.err('Failed to version package ${package.name}: $e');
      rethrow;
    }
  }

  // Step 2: Update dependencies between workspace packages
  if (packageVersions.isNotEmpty) {
    logger.info('Updating workspace dependencies...');
    await updateWorkspaceDependencies(
      workspace: workspace,
      packages: packages,
      updatedVersions: packageVersions,
    );
    logger.success('Updated workspace dependencies');
  }

  return WorkspaceVersionResult(
    packageResults: packageResults,
    packageVersions: packageVersions,
  );
}