| name: Revert PR | |
| on: | |
| pull_request_target: | |
| types: [labeled] | |
| jobs: | |
| revert: | |
| name: Revert PR | |
| runs-on: ubuntu-latest | |
| if: github.event.label.name == 'revert_wf' | |
| steps: | |
| - name: Handle Not Merged PR | |
| if: github.event.pull_request.merged != true | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.FLUTTERACTIONSBOT_CP_TOKEN }} | |
| run: | | |
| gh pr comment ${{ github.event.pull_request.number }} -R flutter/flutter -b "Only merged pull requests can be reverted." | |
| gh pr edit ${{ github.event.pull_request.number }} -R ${{ github.repository }} --remove-label "revert_wf" | |
| exit 0 | |
| - name: Find Reason for Revert | |
| if: github.event.pull_request.merged == true | |
| id: find-reason | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.FLUTTERACTIONSBOT_CP_TOKEN }} | |
| run: | | |
| REASON=$(gh pr view ${{ github.event.pull_request.number }} -R ${{ github.repository }} --json comments \ | |
| --jq '.comments[] | .body | select(startswith("Reason for revert:")) | sub("^Reason for revert:\\s*"; "")' | head -n 1) | |
| if [ -z "$REASON" ]; then | |
| gh pr comment ${{ github.event.pull_request.number }} -R flutter/flutter -b "A reason for requesting a revert of ${{ github.repository }}/${{ github.event.pull_request.number }} could not be found or the reason was not properly formatted. Begin a comment with **'Reason for revert:'** to tell the bot why this issue is being reverted." | |
| gh pr edit ${{ github.event.pull_request.number }} -R ${{ github.repository }} --remove-label "revert_wf" | |
| echo "found=false" >> $GITHUB_OUTPUT | |
| exit 1 | |
| else | |
| echo "REASON=$REASON" >> $GITHUB_ENV | |
| echo "found=true" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Get PR Details | |
| if: steps.find-reason.outputs.found == 'true' | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.FLUTTERACTIONSBOT_CP_TOKEN }} | |
| ORIGINAL_AUTHOR: ${{ github.event.pull_request.user.login }} | |
| MERGE_COMMIT: ${{ github.event.pull_request.merge_commit_sha }} | |
| run: | | |
| REVIEWER=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews \ | |
| --jq '[.[] | select(.state == "APPROVED")] | .[0].user.login') | |
| echo "MERGE_COMMIT=$MERGE_COMMIT" >> $GITHUB_ENV | |
| echo "ORIGINAL_AUTHOR=$ORIGINAL_AUTHOR" >> $GITHUB_ENV | |
| echo "REVIEWER=$REVIEWER" >> $GITHUB_ENV | |
| gh pr view ${{ github.event.pull_request.number }} -R ${{ github.repository }} --json body --jq '.body' > original_pr_body.txt | |
| - name: Checkout Fork | |
| if: steps.find-reason.outputs.found == 'true' | |
| uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 | |
| with: | |
| repository: flutteractionsbot/flutter | |
| path: flutter | |
| ref: master | |
| token: ${{ secrets.FLUTTERACTIONSBOT_CP_TOKEN }} | |
| fetch-depth: 0 | |
| - name: Prepare Git | |
| if: steps.find-reason.outputs.found == 'true' | |
| working-directory: ./flutter | |
| run: | | |
| git config user.name "flutteractionsbot" | |
| git config user.email "<flutter-actions-bot@google.com>" | |
| git remote add upstream https://github.com/flutter/flutter.git | |
| git fetch upstream master | |
| BRANCH_NAME="revert-${{ github.event.pull_request.number }}-$(date +%s)" | |
| echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV | |
| git checkout -b $BRANCH_NAME upstream/master | |
| - name: Revert Commit | |
| if: steps.find-reason.outputs.found == 'true' | |
| id: revert-commit | |
| working-directory: ./flutter | |
| env: | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| run: | | |
| if git revert $MERGE_COMMIT --no-edit; then | |
| echo "success=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "success=false" >> $GITHUB_OUTPUT | |
| gh pr comment $PR_NUMBER -R flutter/flutter -b "Failed to revert commit $MERGE_COMMIT cleanly. Please resolve conflicts manually." | |
| gh pr edit $PR_NUMBER -R ${{ github.repository }} --remove-label "revert_wf" | |
| exit 1 | |
| fi | |
| - name: Push and Create PR | |
| if: steps.revert-commit.outputs.success == 'true' | |
| working-directory: ./flutter | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.FLUTTERACTIONSBOT_CP_TOKEN }} | |
| PR_TITLE: ${{ github.event.pull_request.title }} | |
| INITIATOR: ${{ github.event.sender.login }} | |
| run: | | |
| git push origin $BRANCH_NAME | |
| PR_LINK="https://github.com/flutter/flutter/pull/${{ github.event.pull_request.number }}" | |
| echo "Reverts: [$PR_TITLE]($PR_LINK)" > ../pr_body.txt | |
| echo "" >> ../pr_body.txt | |
| echo "Initiated by: @$INITIATOR" >> ../pr_body.txt | |
| echo "" >> ../pr_body.txt | |
| echo "Reason for reverting: $REASON" >> ../pr_body.txt | |
| echo "" >> ../pr_body.txt | |
| echo "Original PR Author: @$ORIGINAL_AUTHOR" >> ../pr_body.txt | |
| echo "" >> ../pr_body.txt | |
| echo "Reviewed By: @$REVIEWER" >> ../pr_body.txt | |
| echo "" >> ../pr_body.txt | |
| echo "The original PR description is provided below:" >> ../pr_body.txt | |
| echo "" >> ../pr_body.txt | |
| cat ../original_pr_body.txt >> ../pr_body.txt | |
| NEW_PR_URL=$(gh pr create \ | |
| --title "Revert \"${PR_TITLE}\"" \ | |
| --body-file ../pr_body.txt \ | |
| --repo flutter/flutter \ | |
| --base master \ | |
| --head flutteractionsbot:$BRANCH_NAME) | |
| gh pr comment ${{ github.event.pull_request.number }} -R flutter/flutter -b "Successfully created revert PR: $NEW_PR_URL" | |
| gh pr edit ${{ github.event.pull_request.number }} -R ${{ github.repository }} --remove-label "revert_wf" |