159 lines
4.9 KiB
Bash
Executable File
159 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
VERSION=$1
|
|
|
|
# Check if version is provided
|
|
if [ -z "$VERSION" ]; then
|
|
echo "❌ Error: Version number is required"
|
|
echo "Usage: ./bin/release <version>"
|
|
echo "Example: ./bin/release 1.0.0"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if gh CLI is installed
|
|
if ! command -v gh &> /dev/null; then
|
|
echo "❌ Error: GitHub CLI (gh) is not installed"
|
|
echo "Please install it from: https://cli.github.com/"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if we're in a git repository
|
|
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
echo "❌ Error: Not in a git repository"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if there are uncommitted changes
|
|
if ! git diff-index --quiet HEAD --; then
|
|
echo "❌ Error: There are uncommitted changes. Please commit or stash them first."
|
|
exit 1
|
|
fi
|
|
|
|
# Get default branch from GitHub with better error handling
|
|
echo "🔍 Getting default branch from GitHub..."
|
|
DEFAULT_BRANCH_JSON=$(gh repo view --json defaultBranchRef 2>/dev/null)
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ Error: Failed to get repository information from GitHub"
|
|
echo " Please check your GitHub CLI authentication and repository access"
|
|
exit 1
|
|
fi
|
|
|
|
DEFAULT_BRANCH=$(echo "$DEFAULT_BRANCH_JSON" | grep -o '"name":"[^"]*"' | cut -d'"' -f4)
|
|
if [ -z "$DEFAULT_BRANCH" ]; then
|
|
echo "⚠️ Warning: Could not determine default branch, using 'main'"
|
|
DEFAULT_BRANCH="main"
|
|
fi
|
|
|
|
echo "📌 Local HEAD: $(git rev-parse HEAD)"
|
|
echo "📌 GitHub default branch: $DEFAULT_BRANCH"
|
|
|
|
# Fetch latest changes from remote
|
|
echo "🔄 Fetching latest changes from remote..."
|
|
git fetch origin
|
|
|
|
# Check if local branch is up-to-date with remote
|
|
LOCAL_HEAD=$(git rev-parse HEAD)
|
|
REMOTE_HEAD=$(git rev-parse origin/$DEFAULT_BRANCH 2>/dev/null)
|
|
|
|
if [ -z "$REMOTE_HEAD" ]; then
|
|
echo "❌ Error: Could not find remote branch origin/$DEFAULT_BRANCH"
|
|
exit 1
|
|
fi
|
|
|
|
if [ "$LOCAL_HEAD" != "$REMOTE_HEAD" ]; then
|
|
echo "❌ Error: Local branch is not up-to-date with remote"
|
|
echo " Local HEAD: $LOCAL_HEAD"
|
|
echo " Remote HEAD: $REMOTE_HEAD"
|
|
echo " Please pull the latest changes: git pull origin $DEFAULT_BRANCH"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Local repository is up-to-date with remote"
|
|
|
|
# Define the path to MollieApiClient.php
|
|
MOLLIE_CLIENT_FILE="src/MollieApiClient.php"
|
|
|
|
# Check if MollieApiClient.php exists
|
|
if [ ! -f "$MOLLIE_CLIENT_FILE" ]; then
|
|
echo "❌ Error: MollieApiClient.php not found at $MOLLIE_CLIENT_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if tag already exists
|
|
if git tag -l | grep -q "^v$VERSION$"; then
|
|
echo "❌ Error: Tag v$VERSION already exists"
|
|
exit 1
|
|
fi
|
|
|
|
echo "🔄 Updating CLIENT_VERSION to $VERSION in MollieApiClient.php..."
|
|
|
|
# Update the CLIENT_VERSION constant in MollieApiClient.php
|
|
if sed -i.bak "s/public const CLIENT_VERSION = '[^']*'/public const CLIENT_VERSION = '$VERSION'/g" "$MOLLIE_CLIENT_FILE"; then
|
|
echo "✅ CLIENT_VERSION updated successfully"
|
|
# Remove backup file created by sed
|
|
rm "${MOLLIE_CLIENT_FILE}.bak"
|
|
else
|
|
echo "❌ Error: Failed to update CLIENT_VERSION"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if the version was actually updated
|
|
if grep -q "CLIENT_VERSION = '$VERSION'" "$MOLLIE_CLIENT_FILE"; then
|
|
echo "✅ Version update verified"
|
|
else
|
|
echo "❌ Error: Version update verification failed"
|
|
exit 1
|
|
fi
|
|
|
|
# Commit the version update
|
|
echo "📝 Committing version update..."
|
|
git add "$MOLLIE_CLIENT_FILE"
|
|
git commit -m "Update CLIENT_VERSION to $VERSION"
|
|
|
|
echo "🏷️ Creating tag v$VERSION..."
|
|
|
|
# Create tag and push
|
|
git tag -a "v$VERSION" -m "Release $VERSION"
|
|
git push origin "v$VERSION"
|
|
|
|
echo "⏱️ Waiting for GitHub to recognize the new tag..."
|
|
sleep 3
|
|
|
|
# Verify tag exists on GitHub
|
|
echo "🔍 Verifying tag exists on GitHub..."
|
|
TAG_CHECK=$(gh release list --repo mollie/mollie-api-php 2>/dev/null | grep "v$VERSION" || echo "")
|
|
if [ -n "$TAG_CHECK" ]; then
|
|
echo "❌ Error: Release v$VERSION already exists on GitHub"
|
|
exit 1
|
|
fi
|
|
|
|
# Double-check that we can see the tag
|
|
GH_TAG_CHECK=$(gh api repos/mollie/mollie-api-php/git/refs/tags/v$VERSION 2>/dev/null || echo "not_found")
|
|
if [ "$GH_TAG_CHECK" = "not_found" ]; then
|
|
echo "⚠️ Warning: Tag not immediately visible on GitHub, waiting longer..."
|
|
sleep 5
|
|
fi
|
|
|
|
echo "🚀 Creating GitHub release..."
|
|
|
|
# Generate release from current HEAD with better error handling
|
|
RELEASE_OUTPUT=$(gh release create "v$VERSION" \
|
|
--target "$(git rev-parse HEAD)" \
|
|
--latest \
|
|
--generate-notes 2>&1)
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ Release v$VERSION created successfully!"
|
|
echo "$RELEASE_OUTPUT"
|
|
else
|
|
echo "❌ Error: Failed to create GitHub release"
|
|
echo "$RELEASE_OUTPUT"
|
|
echo ""
|
|
echo "🔍 Troubleshooting tips:"
|
|
echo " 1. Check if you have write permissions to the repository"
|
|
echo " 2. Verify your GitHub CLI authentication: gh auth status"
|
|
echo " 3. Try creating the release manually on GitHub.com"
|
|
echo " 4. Check if the tag was created successfully: git tag -l | grep v$VERSION"
|
|
exit 1
|
|
fi
|