|
|
|
@ -8,7 +8,7 @@ on: |
|
|
|
|
workflow_dispatch: |
|
|
|
|
# push: |
|
|
|
|
# branches: |
|
|
|
|
# - main |
|
|
|
|
# - ${{ github.event.repository.default_branch }} |
|
|
|
|
|
|
|
|
|
jobs: |
|
|
|
|
Merge: |
|
|
|
@ -19,40 +19,53 @@ 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 |
|
|
|
|
|
|
|
|
|
# Authenticate with the GitHub Token |
|
|
|
|
g = Github(os.getenv('GITHUB_TOKEN')) |
|
|
|
|
|
|
|
|
|
# Get the repository dynamically |
|
|
|
|
repo = g.get_repo(os.getenv('GITHUB_REPOSITORY')) |
|
|
|
|
|
|
|
|
|
# List all open pull requests |
|
|
|
|
open_pulls = repo.get_pulls(state='open', sort='created') |
|
|
|
|
|
|
|
|
|
for pr in open_pulls: |
|
|
|
|
|
|
|
|
|
# Fetch the default branch name |
|
|
|
|
default_branch_name = repo.default_branch |
|
|
|
|
default_branch = repo.get_branch(default_branch_name) |
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
# 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}).") |
|
|
|
|
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: |
|
|
|
|
print(f"Could not merge 'main' into PR #{pr.number} ({pr.head.ref}): {e}") |
|
|
|
|
print(f"❌ Could not process PR #{pr.number}: {e}") |
|
|
|
|
|
|
|
|
|
env: |
|
|
|
|
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} |
|
|
|
|
GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN || secrets.GITHUB_TOKEN }} |
|
|
|
|
GITHUB_REPOSITORY: ${{ github.repository }} |
|
|
|
|