diff --git a/.github/workflows/check-and-bump-versions.yaml b/.github/workflows/check-and-bump-versions.yaml
index 1cba867821..2842421e9c 100644
--- a/.github/workflows/check-and-bump-versions.yaml
+++ b/.github/workflows/check-and-bump-versions.yaml
@@ -261,21 +261,44 @@ jobs:
echo "• New checksum (${#NEW_CHECKSUM} chars): $NEW_CHECKSUM"
echo "• Match status: $([ "$OLD_CHECKSUM" = "$NEW_CHECKSUM" ] && echo "identical" || echo "different")"
- # Add function to check if only version changed in package.json
+ # Enhanced function to check if only version changed in package.json
check_package_json_changes() {
if [ "${{ github.event_name }}" = "pull_request" ]; then
DIFF=$(git diff "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" -- package.json)
else
DIFF=$(git diff HEAD~1 HEAD -- package.json)
fi
+
+ # If no diff found, return false (changes exist)
+ if [ -z "$DIFF" ]; then
+ return 1
+ fi
+
+ # First, capture all non-whitespace changes
+ CHANGES=$(echo "$DIFF" | grep '^[+-]' | grep -v '^[+-]\s*$' | grep -v '^[+-]\s*{*}*$')
- # Count number of changed lines that aren't the version field
- NON_VERSION_CHANGES=$(echo "$DIFF" | grep -v '"version":' | grep '^[+-]' | wc -l)
+ # Remove any line with just braces, commas, or whitespace
+ CHANGES=$(echo "$CHANGES" | grep -v '^[+-]\s*[{},]*\s*$')
- # If there are no non-version changes, return true (1)
- if [ "$NON_VERSION_CHANGES" -eq 0 ]; then
- return 0
+ # Get all lines except version changes
+ NON_VERSION_LINES=$(echo "$CHANGES" | grep -v '"version":\s*"[0-9][0-9.]*"' || true)
+
+ # If we have no non-version changes
+ if [ -z "$NON_VERSION_LINES" ]; then
+ # Verify we have exactly one version removal and one addition
+ VERSION_LINES=$(echo "$CHANGES" | grep '"version":\s*"[0-9][0-9.]*"' || true)
+ if [ -n "$VERSION_LINES" ]; then
+ VERSION_REMOVED=$(echo "$VERSION_LINES" | grep '^-' | wc -l | tr -d ' ')
+ VERSION_ADDED=$(echo "$VERSION_LINES" | grep '^+' | wc -l | tr -d ' ')
+
+ if [ "$VERSION_REMOVED" -eq 1 ] && [ "$VERSION_ADDED" -eq 1 ]; then
+ echo "✓ Verified: Only version field was changed"
+ return 0
+ fi
+ fi
fi
+
+ echo "✗ Other changes detected besides version"
return 1
}
@@ -286,7 +309,7 @@ jobs:
echo "New package detected, will create initial version"
SHOULD_BUMP=true
else
- # Improved source file detection
+ # Enhanced source file detection with better filtering
if [ "${{ github.event_name }}" = "pull_request" ]; then
SOURCE_FILES_CHANGED=$(git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}" | grep "^packages/$package/" | grep -E "\.(ts|tsx|js|jsx|json|css|scss|md)$" || true)
else
@@ -296,21 +319,32 @@ jobs:
if [ -n "$SOURCE_FILES_CHANGED" ]; then
# If only package.json changed, check if it's only version changes
if [ "$(echo "$SOURCE_FILES_CHANGED" | wc -l)" -eq 1 ] && [ "$(echo "$SOURCE_FILES_CHANGED" | grep "package.json$")" ]; then
+ echo "Only package.json changed. Checking if changes are version-only..."
if check_package_json_changes; then
- echo "Only version field changed in package.json, skipping version bump"
+ echo "✅ Confirmed: Only version field changed in package.json"
+ echo "⏭️ Skipping version bump, updating checksum only"
SHOULD_BUMP=false
+
+ # Update checksum without bumping version
+ echo "$NEW_CHECKSUM" > .checksum
+ if [ -n "$(git status --porcelain .checksum)" ]; then
+ git add .checksum
+ git commit -m "chore(@tutur3u/${package}): update checksum [skip ci]"
+ git push origin HEAD
+ fi
else
- echo "Package.json has meaningful changes"
+ echo "⚠️ Package.json contains meaningful changes beyond version"
SHOULD_BUMP=true
fi
else
- echo "Source files changed:"
+ echo "Multiple source files changed:"
echo "$SOURCE_FILES_CHANGED"
SHOULD_BUMP=true
fi
else
- echo "No source files changed"
- # Update checksum even if we don't bump version, but only if not on default branch
+ echo "No relevant source files changed"
+ SHOULD_BUMP=false
+ # Update checksum without version bump for PRs
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "$NEW_CHECKSUM" > .checksum
if [ -n "$(git status --porcelain .checksum)" ]; then
@@ -319,90 +353,121 @@ jobs:
git push origin HEAD
fi
fi
- SHOULD_BUMP=false
fi
fi
# If changes detected, bump version and create PR
if [ "$SHOULD_BUMP" = true ]; then
- # Version bump logic and PR creation
- NEW_VERSION=$(echo "$CURRENT_VERSION" | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g')
- echo "Meaningful changes detected, bumping version to: $NEW_VERSION"
+ # Enhanced version bump logic with validation
+ if [[ "$CURRENT_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
+ NEW_VERSION=$(echo "$CURRENT_VERSION" | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g')
+ echo "📈 Bumping version: $CURRENT_VERSION → $NEW_VERSION"
+ else
+ echo "⚠️ Invalid version format: $CURRENT_VERSION"
+ echo "Using default increment..."
+ NEW_VERSION="0.0.1"
+ fi
- sed -i "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" package.json
+ # Safely update package.json
+ if ! sed -i "s/\"version\": \"$CURRENT_VERSION\"/\"version\": \"$NEW_VERSION\"/" package.json; then
+ echo "❌ Failed to update version in package.json"
+ exit 1
+ fi
+
+ # Update checksum with verification
echo "$NEW_CHECKSUM" > .checksum
+ if [ "$(cat .checksum)" != "$NEW_CHECKSUM" ]; then
+ echo "❌ Checksum verification failed"
+ exit 1
+ fi
+ # Create branch with retry mechanism
BRANCH_NAME="bump-${package}-${NEW_VERSION}"
- git checkout -b "$BRANCH_NAME"
+ MAX_RETRIES=3
+ RETRY_COUNT=0
+
+ while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
+ if git checkout -b "$BRANCH_NAME" 2>/dev/null; then
+ break
+ fi
+ RETRY_COUNT=$((RETRY_COUNT + 1))
+ if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
+ echo "⚠️ Branch creation failed, attempt $RETRY_COUNT of $MAX_RETRIES"
+ sleep 2
+ else
+ echo "❌ Failed to create branch after $MAX_RETRIES attempts"
+ exit 1
+ fi
+ done
+ # Stage and commit changes
git add package.json .checksum
git commit -m "chore(@tutur3u/${package}): bump version to ${NEW_VERSION}"
- git push origin "$BRANCH_NAME"
- # Create PR with enhanced description
- PR_BODY="## 📦 Automated Version Bump
"
-
- if [ -n "$OLD_CHECKSUM" ]; then
- if [ "$OLD_CHECKSUM" = "$NEW_CHECKSUM" ]; then
- PR_BODY="${PR_BODY}> ✅ **Status:** No changes in package content
"
- else
- PR_BODY="${PR_BODY}> 🔄 **Status:** Package content modified
"
- fi
- else
- PR_BODY="${PR_BODY}> 🆕 **Status:** New package
"
+ # Push with error handling
+ if ! git push origin "$BRANCH_NAME"; then
+ echo "❌ Failed to push branch"
+ exit 1
fi
- # Add package information summary
- SUMMARY="### 📊 Package Information
"
- SUMMARY="${SUMMARY}
Detail | Value |
---|---|
Package | @tutur3u/${package} |
Current Version | ${CURRENT_VERSION} |
New Version | ${NEW_VERSION} |