From 51a655f07b2955d4612206db02f0c09bfcd69f31 Mon Sep 17 00:00:00 2001 From: bahdotsh Date: Thu, 28 Aug 2025 12:56:05 +0530 Subject: [PATCH] version fixes --- Cargo.lock | 2 +- Cargo.toml | 25 +++- VERSION_MANAGEMENT.md | 279 +++++++++++++++++++++++++++++++++++ crates/evaluator/Cargo.toml | 6 +- crates/executor/Cargo.toml | 14 +- crates/github/Cargo.toml | 2 +- crates/gitlab/Cargo.toml | 2 +- crates/logging/Cargo.toml | 2 +- crates/matrix/Cargo.toml | 2 +- crates/parser/Cargo.toml | 4 +- crates/runtime/Cargo.toml | 18 +-- crates/secrets/Cargo.toml | 43 +++--- crates/ui/Cargo.toml | 12 +- crates/utils/Cargo.toml | 2 +- crates/validators/Cargo.toml | 4 +- crates/wrkflw/Cargo.toml | 26 ++-- scripts/bump-crate.sh | 97 ++++++++++++ 17 files changed, 469 insertions(+), 71 deletions(-) create mode 100644 VERSION_MANAGEMENT.md create mode 100755 scripts/bump-crate.sh diff --git a/Cargo.lock b/Cargo.lock index 164df67..aa8a736 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3264,7 +3264,7 @@ dependencies = [ [[package]] name = "wrkflw-secrets" -version = "0.7.1" +version = "0.7.2" dependencies = [ "aes-gcm", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index a1d60c7..b5c1026 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,5 @@ [workspace] -members = [ - "crates/*" -] +members = ["crates/*"] resolver = "2" [workspace.package] @@ -16,6 +14,22 @@ categories = ["command-line-utilities"] license = "MIT" [workspace.dependencies] +# Internal crate dependencies +wrkflw-models = { path = "crates/models", version = "0.7.2" } +wrkflw-evaluator = { path = "crates/evaluator", version = "0.7.2" } +wrkflw-executor = { path = "crates/executor", version = "0.7.2" } +wrkflw-github = { path = "crates/github", version = "0.7.2" } +wrkflw-gitlab = { path = "crates/gitlab", version = "0.7.2" } +wrkflw-logging = { path = "crates/logging", version = "0.7.2" } +wrkflw-matrix = { path = "crates/matrix", version = "0.7.2" } +wrkflw-parser = { path = "crates/parser", version = "0.7.2" } +wrkflw-runtime = { path = "crates/runtime", version = "0.7.2" } +wrkflw-secrets = { path = "crates/secrets", version = "0.7.2" } +wrkflw-ui = { path = "crates/ui", version = "0.7.2" } +wrkflw-utils = { path = "crates/utils", version = "0.7.2" } +wrkflw-validators = { path = "crates/validators", version = "0.7.2" } + +# External dependencies clap = { version = "4.3", features = ["derive"] } colored = "2.0" serde = { version = "1.0", features = ["derive"] } @@ -44,7 +58,10 @@ rayon = "1.7.0" num_cpus = "1.16.0" regex = "1.10" lazy_static = "1.4" -reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "json"] } +reqwest = { version = "0.11", default-features = false, features = [ + "rustls-tls", + "json", +] } libc = "0.2" nix = { version = "0.27.1", features = ["fs"] } urlencoding = "2.1.3" diff --git a/VERSION_MANAGEMENT.md b/VERSION_MANAGEMENT.md new file mode 100644 index 0000000..1fe1c23 --- /dev/null +++ b/VERSION_MANAGEMENT.md @@ -0,0 +1,279 @@ +# Version Management Guide + +This guide explains how to manage versions in the wrkflw workspace, both for the entire workspace and for individual crates. + +## Overview + +The wrkflw project uses a Cargo workspace with flexible version management that supports: +- **Workspace-wide versioning**: All crates share the same version +- **Individual crate versioning**: Specific crates can have their own versions +- **Automatic dependency management**: Internal dependencies are managed through workspace inheritance + +## Current Setup + +### Workspace Dependencies +All internal crate dependencies are defined in the root `Cargo.toml` under `[workspace.dependencies]`: + +```toml +[workspace.dependencies] +# Internal crate dependencies +wrkflw-models = { path = "crates/models", version = "0.7.2" } +wrkflw-evaluator = { path = "crates/evaluator", version = "0.7.2" } +# ... other crates +``` + +### Crate Dependencies +Individual crates reference internal dependencies using workspace inheritance: + +```toml +[dependencies] +# Internal crates +wrkflw-models.workspace = true +wrkflw-validators.workspace = true +``` + +This approach means: +- ✅ No hard-coded versions in individual crates +- ✅ Single source of truth for internal crate versions +- ✅ Easy individual crate versioning without manual updates everywhere + +## Version Management Strategies + +### Strategy 1: Workspace-Wide Versioning (Recommended for most cases) + +Use this when changes affect multiple crates or for major releases. + +```bash +# Bump all crates to the same version +cargo ws version patch # 0.7.2 → 0.7.3 +cargo ws version minor # 0.7.2 → 0.8.0 +cargo ws version major # 0.7.2 → 1.0.0 + +# Or specify exact version +cargo ws version 1.0.0 + +# Commit and tag +git add . +git commit -m "chore: bump workspace version to $(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"\([^"]*\)".*/\1/')" +git tag v$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"\([^"]*\)".*/\1/') +git push origin main --tags +``` + +### Strategy 2: Individual Crate Versioning + +Use this when changes are isolated to specific crates. + +#### Using the Helper Script + +```bash +# Bump a specific crate +./scripts/bump-crate.sh wrkflw-models patch # 0.7.2 → 0.7.3 +./scripts/bump-crate.sh wrkflw-models minor # 0.7.2 → 0.8.0 +./scripts/bump-crate.sh wrkflw-models 0.8.5 # Specific version + +# The script will: +# 1. Update the crate's Cargo.toml to use explicit version +# 2. Update workspace dependencies +# 3. Show you next steps +``` + +#### Manual Individual Versioning + +If you prefer manual control: + +1. **Update the crate's Cargo.toml**: + ```toml + # Change from: + version.workspace = true + # To: + version = "0.7.3" + ``` + +2. **Update workspace dependencies**: + ```toml + [workspace.dependencies] + wrkflw-models = { path = "crates/models", version = "0.7.3" } + ``` + +3. **Test and commit**: + ```bash + cargo check + git add . + git commit -m "bump: wrkflw-models to 0.7.3" + git tag v0.7.3-wrkflw-models + git push origin main --tags + ``` + +## Release Workflows + +### Full Workspace Release + +```bash +# 1. Make your changes +# 2. Bump version +cargo ws version patch --no-git-commit + +# 3. Commit and tag +git add . +git commit -m "chore: release version $(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"\([^"]*\)".*/\1/')" +git tag v$(grep '^version' Cargo.toml | head -1 | sed 's/.*= *"\([^"]*\)".*/\1/') + +# 4. Push (this triggers GitHub Actions) +git push origin main --tags +``` + +### Individual Crate Release + +```bash +# 1. Use helper script or manual method above +./scripts/bump-crate.sh wrkflw-models patch + +# 2. Follow the script's suggestions +git add . +git commit -m "bump: wrkflw-models to X.Y.Z" +git tag vX.Y.Z-wrkflw-models +git push origin main --tags + +# 3. Optionally publish to crates.io +cd crates/models +cargo publish +``` + +## Publishing to crates.io + +### Publishing Individual Crates + +```bash +# Navigate to the crate +cd crates/models + +# Ensure all dependencies are published first +# (or available on crates.io) +cargo publish --dry-run + +# Publish +cargo publish +``` + +### Publishing All Crates + +```bash +# Use cargo-workspaces +cargo ws publish --from-git +``` + +## Integration with GitHub Actions + +The existing `.github/workflows/release.yml` works with both strategies: + +- **Tag format `v1.2.3`**: Triggers full workspace release +- **Tag format `v1.2.3-crate-name`**: Could be used for individual crate releases (needs workflow modification) + +### Modifying for Individual Crate Releases + +To support individual crate releases, you could modify the workflow to: + +```yaml +on: + push: + tags: + - 'v*' # Full releases: v1.2.3 + - 'v*-wrkflw-*' # Individual releases: v1.2.3-wrkflw-models +``` + +## Best Practices + +### When to Use Each Strategy + +**Use Workspace-Wide Versioning when:** +- Making breaking changes across multiple crates +- Major feature releases +- Initial development phases +- Simpler release management is preferred + +**Use Individual Crate Versioning when:** +- Changes are isolated to specific functionality +- Different crates have different stability levels +- You want to minimize dependency updates for users +- Publishing to crates.io with different release cadences + +### Version Numbering + +Follow [Semantic Versioning](https://semver.org/): + +- **Patch (0.7.2 → 0.7.3)**: Bug fixes, internal improvements +- **Minor (0.7.2 → 0.8.0)**: New features, backward compatible +- **Major (0.7.2 → 1.0.0)**: Breaking changes + +### Dependency Management + +- Keep internal dependencies using workspace inheritance +- Only specify explicit versions when a crate diverges from workspace version +- Always test with `cargo check` and `cargo test` before releasing +- Use `cargo tree` to verify dependency resolution + +## Troubleshooting + +### Common Issues + +**Issue**: Cargo complains about version mismatches +```bash +# Solution: Check workspace dependencies match crate versions +grep -r "version.*=" crates/*/Cargo.toml +grep "wrkflw-.*version" Cargo.toml +``` + +**Issue**: Published crate can't find dependencies +```bash +# Solution: Ensure all dependencies are published to crates.io first +# Or use path dependencies only for local development +``` + +**Issue**: GitHub Actions fails on tag +```bash +# Solution: Ensure tag format matches workflow trigger +git tag -d v1.2.3 # Delete local tag +git push origin :refs/tags/v1.2.3 # Delete remote tag +git tag v1.2.3 # Recreate with correct format +git push origin v1.2.3 +``` + +## Tools and Commands + +### Useful Commands + +```bash +# List all workspace members with versions +cargo ws list + +# Check all crates +cargo check --workspace + +# Test all crates +cargo test --workspace + +# Show dependency tree +cargo tree + +# Show outdated dependencies +cargo outdated + +# Verify publishability +cargo publish --dry-run --manifest-path crates/models/Cargo.toml +``` + +### Recommended Tools + +- `cargo-workspaces`: Workspace management +- `cargo-outdated`: Check for outdated dependencies +- `cargo-audit`: Security audit +- `cargo-machete`: Find unused dependencies + +## Migration Notes + +If you're migrating from the old hard-coded version system: + +1. All internal crate versions are now managed in workspace `Cargo.toml` +2. Individual crates use `crate-name.workspace = true` for internal dependencies +3. Use the helper script or manual process above for individual versioning +4. The system is fully backward compatible with existing workflows \ No newline at end of file diff --git a/crates/evaluator/Cargo.toml b/crates/evaluator/Cargo.toml index eda19b3..af80c0f 100644 --- a/crates/evaluator/Cargo.toml +++ b/crates/evaluator/Cargo.toml @@ -12,9 +12,9 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-validators = { path = "../validators", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-validators.workspace = true # External dependencies colored.workspace = true -serde_yaml.workspace = true +serde_yaml.workspace = true diff --git a/crates/executor/Cargo.toml b/crates/executor/Cargo.toml index 4759048..58a0ad0 100644 --- a/crates/executor/Cargo.toml +++ b/crates/executor/Cargo.toml @@ -12,13 +12,13 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-parser = { path = "../parser", version = "0.7.0" } -wrkflw-runtime = { path = "../runtime", version = "0.7.0" } -wrkflw-logging = { path = "../logging", version = "0.7.0" } -wrkflw-matrix = { path = "../matrix", version = "0.7.0" } -wrkflw-secrets = { path = "../secrets", version = "0.7.0" } -wrkflw-utils = { path = "../utils", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-parser.workspace = true +wrkflw-runtime.workspace = true +wrkflw-logging.workspace = true +wrkflw-matrix.workspace = true +wrkflw-secrets.workspace = true +wrkflw-utils.workspace = true # External dependencies async-trait.workspace = true diff --git a/crates/github/Cargo.toml b/crates/github/Cargo.toml index c261cff..629a331 100644 --- a/crates/github/Cargo.toml +++ b/crates/github/Cargo.toml @@ -12,7 +12,7 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } +wrkflw-models.workspace = true # External dependencies from workspace serde.workspace = true diff --git a/crates/gitlab/Cargo.toml b/crates/gitlab/Cargo.toml index 13ec51b..9b87186 100644 --- a/crates/gitlab/Cargo.toml +++ b/crates/gitlab/Cargo.toml @@ -12,7 +12,7 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } +wrkflw-models.workspace = true # External dependencies lazy_static.workspace = true diff --git a/crates/logging/Cargo.toml b/crates/logging/Cargo.toml index f41afa5..c3276fb 100644 --- a/crates/logging/Cargo.toml +++ b/crates/logging/Cargo.toml @@ -12,7 +12,7 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } +wrkflw-models.workspace = true # External dependencies chrono.workspace = true diff --git a/crates/matrix/Cargo.toml b/crates/matrix/Cargo.toml index 3266a91..68b2668 100644 --- a/crates/matrix/Cargo.toml +++ b/crates/matrix/Cargo.toml @@ -12,7 +12,7 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } +wrkflw-models.workspace = true # External dependencies indexmap.workspace = true diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml index ca4ba28..7b704b3 100644 --- a/crates/parser/Cargo.toml +++ b/crates/parser/Cargo.toml @@ -12,8 +12,8 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-matrix = { path = "../matrix", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-matrix.workspace = true # External dependencies jsonschema.workspace = true diff --git a/crates/runtime/Cargo.toml b/crates/runtime/Cargo.toml index cbb5ac0..22932ba 100644 --- a/crates/runtime/Cargo.toml +++ b/crates/runtime/Cargo.toml @@ -12,19 +12,19 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-logging = { path = "../logging", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-logging.workspace = true # External dependencies async-trait.workspace = true -once_cell = "1.19" +once_cell.workspace = true serde.workspace = true serde_yaml.workspace = true -tempfile = "3.9" +tempfile.workspace = true tokio.workspace = true -futures = "0.3" +futures.workspace = true ignore = "0.4" -wrkflw-utils = { path = "../utils", version = "0.7.0" } -which = "4.4" -regex = "1.10" -thiserror = "1.0" +wrkflw-utils.workspace = true +which.workspace = true +regex.workspace = true +thiserror.workspace = true diff --git a/crates/secrets/Cargo.toml b/crates/secrets/Cargo.toml index adc5723..8a89d83 100644 --- a/crates/secrets/Cargo.toml +++ b/crates/secrets/Cargo.toml @@ -1,30 +1,35 @@ [package] name = "wrkflw-secrets" -version = "0.7.1" -edition = "2021" -authors = ["wrkflw contributors"] -description = "Secrets management for wrkflw workflow execution" -license = "MIT" -keywords = ["secrets", "workflow", "ci-cd", "github-actions"] -categories = ["development-tools"] +version.workspace = true +edition.workspace = true +description = "Secrets management for wrkflw workflow execution engine" +license.workspace = true +documentation.workspace = true +homepage.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true [dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -serde_yaml = "0.9" -tokio = { version = "1.0", features = ["full"] } +# External dependencies +serde.workspace = true +serde_json.workspace = true +serde_yaml.workspace = true +tokio.workspace = true +thiserror.workspace = true +dirs.workspace = true +regex.workspace = true +lazy_static.workspace = true +chrono = { workspace = true, features = ["serde"] } +async-trait.workspace = true + +# Dependencies not in workspace anyhow = "1.0" -thiserror = "1.0" base64 = "0.21" aes-gcm = "0.10" rand = "0.8" -dirs = "5.0" tracing = "0.1" -regex = "1.10" url = "2.4" -async-trait = "0.1" -lazy_static = "1.4" -chrono = { version = "0.4", features = ["serde"] } pbkdf2 = "0.12" hmac = "0.12" sha2 = "0.10" @@ -46,9 +51,9 @@ file-provider = [] # all-providers = ["vault-provider", "aws-provider", "azure-provider", "gcp-provider"] [dev-dependencies] -tempfile = "3.8" +tempfile.workspace = true tokio-test = "0.4" -uuid = { version = "1.6", features = ["v4"] } +uuid.workspace = true criterion = { version = "0.5", features = ["html_reports"] } [[bench]] diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml index 8ea8b19..e884398 100644 --- a/crates/ui/Cargo.toml +++ b/crates/ui/Cargo.toml @@ -12,12 +12,12 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-evaluator = { path = "../evaluator", version = "0.7.0" } -wrkflw-executor = { path = "../executor", version = "0.7.0" } -wrkflw-logging = { path = "../logging", version = "0.7.0" } -wrkflw-utils = { path = "../utils", version = "0.7.0" } -wrkflw-github = { path = "../github", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-evaluator.workspace = true +wrkflw-executor.workspace = true +wrkflw-logging.workspace = true +wrkflw-utils.workspace = true +wrkflw-github.workspace = true # External dependencies chrono.workspace = true diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index 2b8abd8..d6a72e5 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -12,7 +12,7 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } +wrkflw-models.workspace = true # External dependencies serde.workspace = true diff --git a/crates/validators/Cargo.toml b/crates/validators/Cargo.toml index 8cee0cd..3996226 100644 --- a/crates/validators/Cargo.toml +++ b/crates/validators/Cargo.toml @@ -12,8 +12,8 @@ categories.workspace = true [dependencies] # Internal crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-matrix = { path = "../matrix", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-matrix.workspace = true # External dependencies serde.workspace = true diff --git a/crates/wrkflw/Cargo.toml b/crates/wrkflw/Cargo.toml index da63938..5434be9 100644 --- a/crates/wrkflw/Cargo.toml +++ b/crates/wrkflw/Cargo.toml @@ -12,18 +12,18 @@ license.workspace = true [dependencies] # Workspace crates -wrkflw-models = { path = "../models", version = "0.7.0" } -wrkflw-executor = { path = "../executor", version = "0.7.0" } -wrkflw-github = { path = "../github", version = "0.7.0" } -wrkflw-gitlab = { path = "../gitlab", version = "0.7.0" } -wrkflw-logging = { path = "../logging", version = "0.7.0" } -wrkflw-matrix = { path = "../matrix", version = "0.7.0" } -wrkflw-parser = { path = "../parser", version = "0.7.0" } -wrkflw-runtime = { path = "../runtime", version = "0.7.0" } -wrkflw-ui = { path = "../ui", version = "0.7.0" } -wrkflw-utils = { path = "../utils", version = "0.7.0" } -wrkflw-validators = { path = "../validators", version = "0.7.0" } -wrkflw-evaluator = { path = "../evaluator", version = "0.7.0" } +wrkflw-models.workspace = true +wrkflw-executor.workspace = true +wrkflw-github.workspace = true +wrkflw-gitlab.workspace = true +wrkflw-logging.workspace = true +wrkflw-matrix.workspace = true +wrkflw-parser.workspace = true +wrkflw-runtime.workspace = true +wrkflw-ui.workspace = true +wrkflw-utils.workspace = true +wrkflw-validators.workspace = true +wrkflw-evaluator.workspace = true # External dependencies clap.workspace = true @@ -62,4 +62,4 @@ path = "src/lib.rs" [[bin]] name = "wrkflw" -path = "src/main.rs" +path = "src/main.rs" diff --git a/scripts/bump-crate.sh b/scripts/bump-crate.sh new file mode 100755 index 0000000..644d22a --- /dev/null +++ b/scripts/bump-crate.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +# Script to bump individual crate versions and update workspace dependencies +# Usage: ./scripts/bump-crate.sh +# Example: ./scripts/bump-crate.sh wrkflw-models patch +# Example: ./scripts/bump-crate.sh wrkflw-models 0.7.5 + +set -e + +CRATE_NAME="$1" +VERSION_TYPE="$2" + +if [[ -z "$CRATE_NAME" || -z "$VERSION_TYPE" ]]; then + echo "Usage: $0 " + echo " crate-name: Name of the crate to bump (e.g., wrkflw-models)" + echo " version-type: patch|minor|major or specific version (e.g., 0.7.5)" + echo "" + echo "Available crates:" + ls crates/ | grep -v README.md + exit 1 +fi + +CRATE_DIR="crates/${CRATE_NAME#wrkflw-}" +if [[ ! -d "$CRATE_DIR" ]]; then + echo "Error: Crate directory '$CRATE_DIR' not found" + echo "Available crates:" + ls crates/ | grep -v README.md + exit 1 +fi + +echo "Bumping $CRATE_NAME with $VERSION_TYPE..." + +# Get current version from the crate's Cargo.toml +CURRENT_VERSION=$(grep "^version" "$CRATE_DIR/Cargo.toml" | head -1 | sed 's/.*= *"\([^"]*\)".*/\1/' | sed 's/.*workspace *= *true.*//') + +if [[ "$CURRENT_VERSION" == "" ]]; then + # If using workspace version, get it from workspace Cargo.toml + CURRENT_VERSION=$(grep "^version" Cargo.toml | head -1 | sed 's/.*= *"\([^"]*\)".*/\1/') + echo "Current workspace version: $CURRENT_VERSION" +else + echo "Current crate version: $CURRENT_VERSION" +fi + +# Calculate new version +if [[ "$VERSION_TYPE" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + NEW_VERSION="$VERSION_TYPE" +else + # Use semver logic for patch/minor/major + IFS='.' read -ra VERSION_PARTS <<< "$CURRENT_VERSION" + MAJOR="${VERSION_PARTS[0]}" + MINOR="${VERSION_PARTS[1]}" + PATCH="${VERSION_PARTS[2]}" + + case "$VERSION_TYPE" in + "patch") + NEW_VERSION="$MAJOR.$MINOR.$((PATCH + 1))" + ;; + "minor") + NEW_VERSION="$MAJOR.$((MINOR + 1)).0" + ;; + "major") + NEW_VERSION="$((MAJOR + 1)).0.0" + ;; + *) + echo "Error: Invalid version type. Use patch|minor|major or specify exact version" + exit 1 + ;; + esac +fi + +echo "New version: $NEW_VERSION" + +# Update the crate's Cargo.toml to use explicit version instead of workspace +sed -i.bak "s/version\.workspace = true/version = \"$NEW_VERSION\"/" "$CRATE_DIR/Cargo.toml" + +# Update the workspace Cargo.toml with the new version +if grep -q "$CRATE_NAME.*version.*=" Cargo.toml; then + sed -i.bak "s/\($CRATE_NAME.*version = \"\)[^\"]*\"/\1$NEW_VERSION\"/" Cargo.toml +else + echo "Warning: $CRATE_NAME not found in workspace dependencies" +fi + +# Clean up backup files +rm -f "$CRATE_DIR/Cargo.toml.bak" Cargo.toml.bak + +echo "" +echo "✅ Successfully bumped $CRATE_NAME to version $NEW_VERSION" +echo "" +echo "Next steps:" +echo "1. Review the changes: git diff" +echo "2. Test the build: cargo check" +echo "3. Commit the changes: git add . && git commit -m 'bump: $CRATE_NAME to $NEW_VERSION'" +echo "4. Create a tag: git tag v$NEW_VERSION-$CRATE_NAME" +echo "5. Push: git push origin main --tags" +echo "" +echo "To publish individual crate:" +echo " cd $CRATE_DIR && cargo publish"