Update merge-main-into-prs.yml (#13282)
Signed-off-by: Glenn Jocher <glenn.jocher@ultralytics.com>pull/13283/head
parent
c07b9a8b8c
commit
427cfc4f73
|
@ -1,4 +1,4 @@
|
||||||
# Ultralytics YOLOv5 🚀, AGPL-3.0 license
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
||||||
# Automatically merges repository 'main' branch into all open PRs to keep them up-to-date
|
# Automatically merges repository 'main' branch into all open PRs to keep them up-to-date
|
||||||
# Action runs on updates to main branch so when one PR merges to main all others update
|
# Action runs on updates to main branch so when one PR merges to main all others update
|
||||||
|
|
||||||
|
@ -6,10 +6,9 @@ name: Merge main into PRs
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
# push:
|
||||||
branches:
|
# branches:
|
||||||
- main
|
# - ${{ github.event.repository.default_branch }}
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Merge:
|
Merge:
|
||||||
|
@ -22,35 +21,51 @@ jobs:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.x"
|
||||||
cache: "pip" # caching pip dependencies
|
cache: "pip"
|
||||||
- name: Install requirements
|
- name: Install requirements
|
||||||
run: |
|
run: |
|
||||||
pip install pygithub
|
pip install pygithub
|
||||||
- name: Merge main into PRs
|
- name: Merge default branch into PRs
|
||||||
shell: python
|
shell: python
|
||||||
run: |
|
run: |
|
||||||
from github import Github
|
from github import Github
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# Authenticate with the GitHub Token
|
|
||||||
g = Github(os.getenv('GITHUB_TOKEN'))
|
g = Github(os.getenv('GITHUB_TOKEN'))
|
||||||
|
|
||||||
# Get the repository dynamically
|
|
||||||
repo = g.get_repo(os.getenv('GITHUB_REPOSITORY'))
|
repo = g.get_repo(os.getenv('GITHUB_REPOSITORY'))
|
||||||
|
|
||||||
# List all open pull requests
|
# Fetch the default branch name
|
||||||
open_pulls = repo.get_pulls(state='open', sort='created')
|
default_branch_name = repo.default_branch
|
||||||
|
default_branch = repo.get_branch(default_branch_name)
|
||||||
|
|
||||||
for pr in open_pulls:
|
for pr in repo.get_pulls(state='open', sort='created'):
|
||||||
# Compare PR head with main to see if it's behind
|
|
||||||
try:
|
try:
|
||||||
# Merge main into the PR branch
|
# Get full names for repositories and branches
|
||||||
success = pr.update_branch()
|
base_repo_name = repo.full_name
|
||||||
assert success, "Branch update failed"
|
head_repo_name = pr.head.repo.full_name
|
||||||
print(f"Merged 'master' into PR #{pr.number} ({pr.head.ref}) successfully.")
|
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:
|
||||||
|
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}).")
|
||||||
|
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}")
|
||||||
|
print(" This might be due to branch protection rules or insufficient permissions.")
|
||||||
|
else:
|
||||||
|
print(f"✅ PR #{pr.number} ({head_repo_name}:{head_branch_name} -> {base_repo_name}:{base_branch_name}) is up to date with {default_branch_name}.")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Could not merge 'master' into PR #{pr.number} ({pr.head.ref}): {e}")
|
print(f"❌ Could not process PR #{pr.number}: {e}")
|
||||||
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN || secrets.GITHUB_TOKEN }}
|
||||||
GITHUB_REPOSITORY: ${{ github.repository }}
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
|
Loading…
Reference in New Issue