From b34da7d3b959570dea2de128f803291b3ea20890 Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Mon, 26 Aug 2024 01:35:16 +0800 Subject: [PATCH 1/4] Update merge-main-into-prs.yml (#15801) --- .github/workflows/merge-main-into-prs.yml | 55 ++++++++++++++--------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/.github/workflows/merge-main-into-prs.yml b/.github/workflows/merge-main-into-prs.yml index c72166827..111c2ca4a 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,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 }} From 8ca4e9c98b78b64100facb2d4c7dfb9a76869d58 Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Mon, 26 Aug 2024 02:51:51 +0800 Subject: [PATCH 2/4] Fix very large banner SVGs bug (#15803) --- docs/overrides/main.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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" > Date: Mon, 26 Aug 2024 02:57:37 +0800 Subject: [PATCH 3/4] Rate limit auto-merge action (#15802) Co-authored-by: UltralyticsAssistant --- .github/workflows/merge-main-into-prs.yml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/merge-main-into-prs.yml b/.github/workflows/merge-main-into-prs.yml index 111c2ca4a..2c04e95b8 100644 --- a/.github/workflows/merge-main-into-prs.yml +++ b/.github/workflows/merge-main-into-prs.yml @@ -31,6 +31,7 @@ jobs: run: | from github import Github import os + import time g = Github(os.getenv('GITHUB_TOKEN')) repo = g.get_repo(os.getenv('GITHUB_REPOSITORY')) @@ -38,6 +39,11 @@ jobs: # Fetch the default branch name default_branch_name = repo.default_branch default_branch = repo.get_branch(default_branch_name) + + # Initialize counters + updated_branches = 0 + up_to_date_branches = 0 + errors = 0 for pr in repo.get_pulls(state='open', sort='created'): try: @@ -49,7 +55,6 @@ jobs: # 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).") @@ -58,13 +63,23 @@ jobs: 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}") - print(" This might be due to branch protection rules or insufficient permissions.") + errors += 1 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}.") + 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 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 || secrets.GITHUB_TOKEN }} From 0b0bc56675997fe66b13aa0d250b777c8a467e32 Mon Sep 17 00:00:00 2001 From: Burhan <62214284+Burhan-Q@users.noreply.github.com> Date: Sun, 25 Aug 2024 20:27:24 -0400 Subject: [PATCH 4/4] Auto-label PR if above threshold for positive reactions (#13605) Co-authored-by: Glenn Jocher Co-authored-by: Ultralytics Assistant <135830346+UltralyticsAssistant@users.noreply.github.com> Co-authored-by: UltralyticsAssistant --- .github/workflows/merge-main-into-prs.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/merge-main-into-prs.yml b/.github/workflows/merge-main-into-prs.yml index 2c04e95b8..328775a22 100644 --- a/.github/workflows/merge-main-into-prs.yml +++ b/.github/workflows/merge-main-into-prs.yml @@ -47,6 +47,11 @@ jobs: for pr in repo.get_pulls(state='open', sort='created'): try: + # 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