From aac61d97de69cd82147a60a97d713fd2b3135f02 Mon Sep 17 00:00:00 2001 From: ammallya Date: Mon, 18 Aug 2025 03:53:02 -0700 Subject: [PATCH] Adding new workflow for list import --- .github/workflows/import_pr_list.yml | 151 +++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 .github/workflows/import_pr_list.yml diff --git a/.github/workflows/import_pr_list.yml b/.github/workflows/import_pr_list.yml new file mode 100644 index 0000000000..10b1111d20 --- /dev/null +++ b/.github/workflows/import_pr_list.yml @@ -0,0 +1,151 @@ +name: Import Subrepo PRs LIST + +on: + workflow_dispatch: + inputs: + subrepo-prefix: + description: "super-repo path prefix (e.g., projects/rocblas)" + required: true + subrepo-pr-numbers: + description: "Comma-separated list of Subrepo PR numbers to import" + required: true + subrepo-repo: + description: "Full name of subrepo repo or fork (e.g., ROCm/rocBLAS or user/rocBLAS-fork)" + required: true + subrepo-upstream: + description: "Canonical subrepo repo (e.g., ROCm/rocBLAS)" + required: true + super-repo-target-branch: + description: "Target branch in the super-repo (default: develop)" + required: false + default: "develop" + +jobs: + generate-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Convert PR numbers to matrix + id: set-matrix + run: | + PRS="${{ github.event.inputs.subrepo-pr-numbers }}" + PR_ARRAY=$(echo "$PRS" | tr ',' '\n' | jq -R . | jq -s .) + echo "matrix=$PR_ARRAY" + echo "matrix=$PR_ARRAY" >> $GITHUB_OUTPUT + + import: + needs: generate-matrix + runs-on: ubuntu-24.04 + strategy: + matrix: + pr_number: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} + steps: + - name: Validate maintainer permissions + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + echo "Actor is: ${{ github.actor }}" + PERMISSION=$(gh api \ + repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission \ + --jq .permission) + if [[ "$PERMISSION" != "admin" && "$PERMISSION" != "maintain" ]]; then + echo "❌ User ${{ github.actor }} is not authorized to run this workflow" + exit 1 + fi + + - name: Generate a token + id: generate-token + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + with: + app-id: ${{ secrets.APP_ID }} + private-key: ${{ secrets.APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + sparse-checkout: | + .github + ${{ github.event.inputs.subrepo-prefix }} + sparse-checkout-cone-mode: true + token: ${{ steps.generate-token.outputs.token }} + fetch-depth: 0 # for subtree operations + + - name: Set up Git user + run: | + git config user.name "systems-assistant[bot]" + git config user.email "systems-assistant[bot]@users.noreply.github.com" + + - name: Fetch subrepo PR info using gh + id: prdata + env: + GH_TOKEN: ${{ steps.generate-token.outputs.token }} + run: | + PR_JSON=$(gh pr view ${{ matrix.pr_number }} \ + --repo ${{ github.event.inputs.subrepo-upstream }} \ + --json title,body,headRefName,headRepository,isDraft \ + --jq '{title: .title, body: .body, head_ref: .headRefName, head_repo: .headRepository.cloneUrl, is_draft: .isDraft}') + + echo "$PR_JSON" > pr.json + + TITLE=$(jq -r .title pr.json | sed 's/`/\\`/g') + echo "title=$TITLE" >> $GITHUB_OUTPUT + + { + echo 'body<> $GITHUB_OUTPUT + + echo "head_ref=$(jq -r .head_ref pr.json)" >> $GITHUB_OUTPUT + echo "head_repo=$(jq -r .head_repo pr.json)" >> $GITHUB_OUTPUT + echo "is_draft=$(jq -r .is_draft pr.json)" >> $GITHUB_OUTPUT + + - name: Create new branch for import + id: import-branch + run: | + git fetch origin ${{ github.event.inputs.super-repo-target-branch }} + git checkout ${{ github.event.inputs.super-repo-target-branch }} + SANITIZED_BASE=$(echo "${{ github.event.inputs.super-repo-target-branch }}" | sed 's|/|_|g') + SANITIZED_REPO=$(echo "${{ github.event.inputs.subrepo-repo }}" | sed 's|/|_|g') + IMPORT_BRANCH="import/${SANITIZED_BASE}/${SANITIZED_REPO}/pr-${{ matrix.pr_number }}" + echo "import_branch=$IMPORT_BRANCH" >> $GITHUB_OUTPUT + git checkout -b "$IMPORT_BRANCH" + + - name: Pull subrepo changes + run: | + git subtree pull --prefix=${{ github.event.inputs.subrepo-prefix }} https://github.com/${{ github.event.inputs.subrepo-repo }} ${{ steps.prdata.outputs.head_ref }} + git push origin ${{ steps.import-branch.outputs.import_branch }} + + - name: Create super-repo PR + env: + GH_TOKEN: ${{ steps.generate-token.outputs.token }} + run: | + IMPORT_BRANCH="${{ steps.import-branch.outputs.import_branch }}" + PR_TITLE="${{ steps.prdata.outputs.title }}" + UPSTREAM_REPO="${{ github.event.inputs.subrepo-upstream }}" + SUBREPO_PR_NUMBER="${{ matrix.pr_number }}" + SUBREPO_URL="https://github.com/$UPSTREAM_REPO/pull/$SUBREPO_PR_NUMBER" + AUTHOR=$(gh pr view "$SUBREPO_PR_NUMBER" --repo "$UPSTREAM_REPO" --json author --jq .author.login) + + echo "${{ steps.prdata.outputs.body }}" > pr_body.txt + { + echo "" + echo "---" + echo "🔁 Imported from [$UPSTREAM_REPO#$SUBREPO_PR_NUMBER]($SUBREPO_URL)" + echo "🧑‍💻 Originally authored by @$AUTHOR" + } >> pr_body.txt + + DRAFT_FLAG="" + if [[ "${{ steps.prdata.outputs.is_draft }}" == "true" ]]; then + DRAFT_FLAG="--draft" + fi + + gh pr create \ + --base "${{ github.event.inputs.super-repo-target-branch }}" \ + --head "$IMPORT_BRANCH" \ + --title "$PR_TITLE" \ + --label "imported pr" \ + $DRAFT_FLAG \ + --body-file pr_body.txt