diff --git a/.github/scripts/create-platform-release-pr.sh b/.github/scripts/create-platform-release-pr.sh index 1a2ad16d..05e93872 100755 --- a/.github/scripts/create-platform-release-pr.sh +++ b/.github/scripts/create-platform-release-pr.sh @@ -8,15 +8,15 @@ # 3. A version bump PR for the main branch # # Usage: -# create-platform-release-pr.sh [new_version_number] [git_user_name] [git_user_email] +# create-platform-release-pr.sh [new_version_number] [git_user_name] [git_user_email] # # Parameters: -# platform - 'mobile' or 'extension' -# previous_version - Previous release version tag (e.g., v7.7.0) -# new_version - New semantic version (e.g., 7.8.0) -# new_version_number - Build version for mobile platform (optional, required for mobile) -# git_user_name - Git user name for commits (optional, defaults to 'metamaskbot') -# git_user_email - Git user email for commits (optional, defaults to 'metamaskbot@users.noreply.github.com') +# platform - 'mobile' or 'extension' +# previous_version_ref - Previous release version branch name, tag or commit hash (e.g., release/7.7.0, v7.7.0, or 76fbc500034db9779e9ff7ce637ac5be1da0493d) +# new_version - New semantic version (e.g., 7.8.0) +# new_version_number - Build version for mobile platform (optional, required for mobile) +# git_user_name - Git user name for commits (optional, defaults to 'metamaskbot') +# git_user_email - Git user email for commits (optional, defaults to 'metamaskbot@users.noreply.github.com') set -e set -u @@ -24,7 +24,7 @@ set -o pipefail # Input validation PLATFORM="${1}" -PREVIOUS_VERSION="${2}" +PREVIOUS_VERSION_REF="${2}" NEW_VERSION="${3}" NEW_VERSION_NUMBER="${4:-}" GIT_USER_NAME="${5:-metamaskbot}" @@ -292,7 +292,7 @@ create_release_pr() { create_changelog_pr() { local platform="$1" local new_version="$2" - local previous_version="$3" + local previous_version_ref="$3" local release_branch_name="$4" local changelog_branch_name="$5" @@ -306,6 +306,31 @@ create_changelog_pr() { # Need to run from .github-tools context to inherit it's dependencies/environment echo "Current Directory: $(pwd)" PROJECT_GIT_DIR=$(pwd) + + # By default, DIFF_BASE is set to the provided `previous_version_ref` (which can be a branch name, tag, or commit hash). + # If `previous_version_ref` matches a remote branch on origin, we fetch it and update DIFF_BASE to the fully qualified remote ref (`origin/`). + # This is required for the `generate-rc-commits.mjs` script to resolve the branch and successfully run the `git log` command. + # Otherwise, DIFF_BASE remains unchanged. + DIFF_BASE="${previous_version_ref}" + + # Only consider known release branch patterns to avoid regex pitfalls: + # - Extension: Version-vx.y.z + # - Mobile: release/x.y.z + if [[ "${previous_version_ref}" =~ ^Version-v[0-9]+\.[0-9]+\.[0-9]+$ || "${previous_version_ref}" =~ ^release/[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Previous version looks like a release branch: ${previous_version_ref}" + # Check if the exact branch exists on origin without interpolating into a regex + if git ls-remote --heads origin "${previous_version_ref}" | grep -q "."; then + echo "Detected remote branch for previous version: ${previous_version_ref}" + git fetch origin "${previous_version_ref}" + DIFF_BASE="origin/${previous_version_ref}" + else + echo "Remote branch not found on origin: ${previous_version_ref}. Will use as-is." + fi + else + echo "Previous version is not a recognized release branch pattern. Treating as tag or SHA: ${previous_version_ref}" + fi + + # Switch to github-tools directory cd ./github-tools/ ls -ltra corepack prepare yarn@4.5.1 --activate @@ -313,8 +338,8 @@ create_changelog_pr() { yarn --cwd install echo "Generating test plan csv.." - yarn run gen:commits "${platform}" "${previous_version}" "${release_branch_name}" "${PROJECT_GIT_DIR}" - + yarn run gen:commits "${platform}" "${DIFF_BASE}" "${release_branch_name}" "${PROJECT_GIT_DIR}" + # Skipping Google Sheets update since there is no need for it anymore # TODO: Remove this once the current post-main validation approach is stable # if [[ "${TEST_ONLY:-false}" == 'false' ]]; then @@ -435,7 +460,7 @@ main() { if [ "$TEST_ONLY" == "true" ]; then echo "Skipping changelog generation in test mode" else - create_changelog_pr "$PLATFORM" "$NEW_VERSION" "$PREVIOUS_VERSION" "$release_branch_name" "$changelog_branch_name" + create_changelog_pr "$PLATFORM" "$NEW_VERSION" "$PREVIOUS_VERSION_REF" "$release_branch_name" "$changelog_branch_name" fi # Step 3: Create version bump PR for main branch diff --git a/.github/scripts/generate-rc-commits.mjs b/.github/scripts/generate-rc-commits.mjs index 0be37e28..4c4069b0 100644 --- a/.github/scripts/generate-rc-commits.mjs +++ b/.github/scripts/generate-rc-commits.mjs @@ -59,7 +59,8 @@ async function getTeam(repository, prNumber) { } // Function to filter commits based on unique commit messages and group by teams -async function filterCommitsByTeam(platform, branchA, branchB) { +// Input parameters refA and refB can be a branch name, a tag or a commit hash (e.g., release/7.7.0, v7.7.0, or 76fbc500034db9779e9ff7ce637ac5be1da0493d) +async function filterCommitsByTeam(platform, refA, refB) { const MAX_COMMITS = 500; // Limit the number of commits to process console.log('Filtering commits by team...'); @@ -81,8 +82,8 @@ async function filterCommitsByTeam(platform, branchA, branchB) { const git = simpleGit(); const logOptions = { - from: branchB, - to: branchA, + from: refB, + to: refA, format: { hash: '%H', author: '%an', @@ -92,7 +93,7 @@ async function filterCommitsByTeam(platform, branchA, branchB) { const log = await git.log(logOptions); - console.log(`Total commits between ${branchA} and ${branchB}: ${log.total}`); + console.log(`Total commits between ${refA} and ${refB}: ${log.total}`); console.log(`Processing up to ${Math.min(log.all.length, MAX_COMMITS)} commits...`); const commitsByTeam = {}; @@ -204,15 +205,15 @@ async function main() { if (args.length !== 4) { console.error( - 'Usage: node generate-rc-commits.mjs platform branchA branchB', + 'Usage: node generate-rc-commits.mjs platform refA refB', ); console.error('Received:', args, ' with length:', args.length); process.exit(1); } const platform = args[0]; - const branchA = args[1]; - const branchB = args[2]; + const refA = args[1]; + const refB = args[2]; const gitDir = args[3]; // Change the working directory to the git repository path @@ -220,10 +221,10 @@ async function main() { process.chdir(gitDir); console.log( - `Generating CSV file for commits between ${branchA} and ${branchB} on ${platform} platform...`, + `Generating CSV file for commits between ${refA} and ${refB} on ${platform} platform...`, ); - const commitsByTeam = await filterCommitsByTeam(platform, branchA, branchB); + const commitsByTeam = await filterCommitsByTeam(platform, refA, refB); if (Object.keys(commitsByTeam).length === 0) { console.log('No commits found.'); diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml index 795ac9d7..bdd85329 100644 --- a/.github/workflows/create-release-pr.yml +++ b/.github/workflows/create-release-pr.yml @@ -19,10 +19,10 @@ on: required: false type: string description: 'The build version for the mobile platform.' - previous-version-tag: + previous-version-ref: required: true type: string - description: 'Previous release version tag. eg: v7.7.0' + description: 'Previous release version branch name, tag or commit hash (e.g., release/7.7.0, v7.7.0, or 76fbc500034db9779e9ff7ce637ac5be1da0493d)' # Flag to indicate if the release is a test release for development purposes only mobile-template-sheet-id: required: false @@ -108,7 +108,7 @@ jobs: echo "Checkout Base Branch: ${{ inputs.checkout-base-branch }}" echo "Release PR Base Branch: ${{ inputs.release-pr-base-branch }}" echo "Semver Version: ${{ inputs.semver-version }}" - echo "Previous Version Tag: ${{ inputs.previous-version-tag }}" + echo "Previous Version Reference: ${{ inputs.previous-version-ref }}" echo "Test Only Mode: ${{ inputs.test-only }}" if [[ "${{ inputs.platform }}" == "mobile" ]]; then echo "Mobile Build Version: ${{ inputs.mobile-build-version }}" @@ -140,7 +140,7 @@ jobs: # Execute the script from github-tools ./github-tools/.github/scripts/create-platform-release-pr.sh \ ${{ inputs.platform }} \ - ${{ inputs.previous-version-tag }} \ + ${{ inputs.previous-version-ref }} \ ${{ inputs.semver-version }} \ ${{ inputs.mobile-build-version }} \ ${{ inputs.git-user-name }} \