diff --git a/.github/workflows/merge-main-into-prs.yml b/.github/workflows/merge-main-into-prs.yml
index c72166827..328775a22 100644
--- a/.github/workflows/merge-main-into-prs.yml
+++ b/.github/workflows/merge-main-into-prs.yml
@@ -8,7 +8,7 @@ on:
workflow_dispatch:
# push:
# branches:
- # - main
+ # - ${{ github.event.repository.default_branch }}
jobs:
Merge:
@@ -19,40 +19,73 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
- ref: main
- uses: actions/setup-python@v5
with:
- python-version: "3.11"
- cache: "pip" # caching pip dependencies
+ python-version: "3.x"
+ cache: "pip"
- name: Install requirements
run: |
pip install pygithub
- - name: Merge main into PRs
+ - name: Merge default branch into PRs
shell: python
run: |
from github import Github
import os
+ import time
- # Authenticate with the GitHub Token
g = Github(os.getenv('GITHUB_TOKEN'))
-
- # Get the repository dynamically
repo = g.get_repo(os.getenv('GITHUB_REPOSITORY'))
+
+ # Fetch the default branch name
+ default_branch_name = repo.default_branch
+ default_branch = repo.get_branch(default_branch_name)
- # List all open pull requests
- open_pulls = repo.get_pulls(state='open', sort='created')
-
- for pr in open_pulls:
+ # Initialize counters
+ updated_branches = 0
+ up_to_date_branches = 0
+ errors = 0
+
+ for pr in repo.get_pulls(state='open', sort='created'):
try:
- # Compare PR head with main to see if it's behind
- comparison = repo.compare(pr.base.ref, pr.head.ref) # ensure correct order of base and head
+ # Label PRs as popular for positive reactions
+ reactions = pr.as_issue().get_reactions()
+ if sum([(1 if r.content not in {"-1", "confused"} else 0) for r in reactions]) > 5:
+ pr.set_labels(*("popular",) + tuple(l.name for l in pr.get_labels()))
+
+ # Get full names for repositories and branches
+ base_repo_name = repo.full_name
+ head_repo_name = pr.head.repo.full_name
+ base_branch_name = pr.base.ref
+ head_branch_name = pr.head.ref
+
+ # Check if PR is behind the default branch
+ comparison = repo.compare(default_branch.commit.sha, pr.head.sha)
if comparison.behind_by > 0:
- # Merge main into the PR branch
- success = pr.update_branch()
- assert success, "Branch update failed"
- print(f"Merged 'main' into PR #{pr.number} ({pr.head.ref}) successfully.")
+ print(f"⚠️ PR #{pr.number} ({head_repo_name}:{head_branch_name} -> {base_repo_name}:{base_branch_name}) is behind {default_branch_name} by {comparison.behind_by} commit(s).")
+
+ # Attempt to update the branch
+ try:
+ success = pr.update_branch()
+ assert success, "Branch update failed"
+ print(f"✅ Successfully merged '{default_branch_name}' into PR #{pr.number} ({head_repo_name}:{head_branch_name} -> {base_repo_name}:{base_branch_name}).")
+ updated_branches += 1
+ time.sleep(10) # rate limit merges
+ except Exception as update_error:
+ print(f"❌ Could not update PR #{pr.number} ({head_repo_name}:{head_branch_name} -> {base_repo_name}:{base_branch_name}): {update_error}")
+ errors += 1
+ else:
+ print(f"✅ PR #{pr.number} ({head_repo_name}:{head_branch_name} -> {base_repo_name}:{base_branch_name}) is already up to date with {default_branch_name}, no merge required.")
+ up_to_date_branches += 1
except Exception as e:
- print(f"Could not merge 'main' into PR #{pr.number} ({pr.head.ref}): {e}")
+ print(f"❌ Could not process PR #{pr.number}: {e}")
+ errors += 1
+
+ # Print summary
+ print("\n\nSummary:")
+ print(f"Branches updated: {updated_branches}")
+ print(f"Branches already up-to-date: {up_to_date_branches}")
+ print(f"Total errors: {errors}")
+
env:
- GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN || secrets.GITHUB_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index 45bcff7d8..fb6755714 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -9,19 +9,19 @@
class="banner-wrapper"
>