versionWorkspace function
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,
);
}