From 489699ca89a86047509a1dc8a8dd180d986d22b1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 27 May 2025 10:46:07 +0000 Subject: [PATCH 01/18] add update PR script --- .github/update_release_pr.py | 103 +++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 .github/update_release_pr.py diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py new file mode 100644 index 00000000000..a9d11651b9a --- /dev/null +++ b/.github/update_release_pr.py @@ -0,0 +1,103 @@ +import os +import requests + +def get_github_prs(token, owner, repo, milestone, label, state): + """ + Fetches pull requests from a GitHub repository that match a given milestone and label. + + Args: + token (str): GitHub token. + owner (str): The owner of the repository. + repo (str): The name of the repository. + milestone (str): The milestone title. + label (str): The label name. + state (str): State of PR, e.g. open + + Returns: + list: A list of dictionaries, where each dictionary represents a pull request. + Returns an empty list if no PRs are found or an error occurs. + """ + headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", + } + + milestone_id = None + milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" + params = {"state": state} + + try: + response = requests.get(milestone_url, headers=headers, params=params) + response.raise_for_status() + milestones = response.json() + for ms in milestones: + if ms["title"] == milestone: + milestone_id = ms["number"] + break + + if not milestone_id: + print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") + return [] + + except requests.exceptions.RequestException as e: + print(f"Error fetching milestones: {e}") + return [] + + prs_url = f"https://api.github.com/repos/{owner}/{repo}/pulls" + params = { + "state": state, + "milestone": milestone_id, + "labels": label, + } + + all_prs = [] + page = 1 + while True: + try: + params["page"] = page + response = requests.get(prs_url, headers=headers, params=params) + response.raise_for_status() # Raise an exception for HTTP errors + prs = response.json() + + if not prs: + break # No more PRs to fetch + + all_prs.extend(prs) + page += 1 + + except requests.exceptions.RequestException as e: + print(f"Error fetching pull requests: {e}") + break + + return all_prs + +if __name__ == "__main__": + github_token = os.environ.get("GITHUB_TOKEN") + + if not github_token: + print("Error: GITHUB_TOKEN environment variable not set.") + exit(1) + + repository_owner = "flow-launcher" + repository_name = "flow.launcher" + target_milestone = "1.20.0" + target_label = "enhancement" + state = "closed" + + print(f"Fetching PRs for {repository_owner}/{repository_name} with milestone '{target_milestone}' and label '{target_label}'...") + + pull_requests = get_github_prs( + github_token, + repository_owner, + repository_name, + target_milestone, + target_label, + state + ) + + if pull_requests: + print(f"\nFound {len(pull_requests)} pull requests:") + for pr in pull_requests: + print(f"- {pr['state']} #{pr['number']}: {pr['title']} (URL: {pr['html_url']})") + else: + print("No matching pull requests found.") From f79a2d24674d7f6f208a6c09c8a60ba98618ea84 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Tue, 27 May 2025 11:36:38 +0000 Subject: [PATCH 02/18] change to issues endpoint --- .github/update_release_pr.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index a9d11651b9a..b51620d730f 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -24,7 +24,7 @@ def get_github_prs(token, owner, repo, milestone, label, state): milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": state} + params = {"state": open} try: response = requests.get(milestone_url, headers=headers, params=params) @@ -37,17 +37,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): if not milestone_id: print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") - return [] + exit(1) except requests.exceptions.RequestException as e: print(f"Error fetching milestones: {e}") - return [] + exit(1) - prs_url = f"https://api.github.com/repos/{owner}/{repo}/pulls" + # This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue. + prs_url = f"https://api.github.com/repos/{owner}/{repo}/issues" params = { "state": state, "milestone": milestone_id, "labels": label, + "per_page": 100, } all_prs = [] @@ -61,18 +63,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): if not prs: break # No more PRs to fetch - - all_prs.extend(prs) + + # Check for pr key since we are using issues endpoint instead. + all_prs.extend([item for item in prs if "pull_request" in item]) page += 1 except requests.exceptions.RequestException as e: print(f"Error fetching pull requests: {e}") - break + exit(1) return all_prs if __name__ == "__main__": - github_token = os.environ.get("GITHUB_TOKEN") + github_token = os.environ.get("GITHUB_TOKEN") if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") From 55b69c601a12899f054cedab4956a2cb0dcf95e5 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 28 May 2025 11:20:39 +0000 Subject: [PATCH 03/18] get milestone dynamically --- .github/update_release_pr.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b51620d730f..c00683439ff 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,7 @@ import os import requests -def get_github_prs(token, owner, repo, milestone, label, state): +def get_github_prs(token, owner, repo, label, state): """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -9,7 +9,6 @@ def get_github_prs(token, owner, repo, milestone, label, state): token (str): GitHub token. owner (str): The owner of the repository. repo (str): The name of the repository. - milestone (str): The milestone title. label (str): The label name. state (str): State of PR, e.g. open @@ -30,13 +29,19 @@ def get_github_prs(token, owner, repo, milestone, label, state): response = requests.get(milestone_url, headers=headers, params=params) response.raise_for_status() milestones = response.json() + + if len(milestones) > 2: + print("More than two milestones found, unable to determine the milestone required.") + + # milestones.pop() for ms in milestones: - if ms["title"] == milestone: + if ms["title"] != "Future": milestone_id = ms["number"] + print(f"Gathering PRs with milestone {ms['title']}..." ) break if not milestone_id: - print(f"Milestone '{milestone}' not found in repository '{owner}/{repo}'.") + print(f"No suitable milestone found in repository '{owner}/{repo}'.") exit(1) except requests.exceptions.RequestException as e: @@ -83,17 +88,15 @@ def get_github_prs(token, owner, repo, milestone, label, state): repository_owner = "flow-launcher" repository_name = "flow.launcher" - target_milestone = "1.20.0" target_label = "enhancement" state = "closed" - print(f"Fetching PRs for {repository_owner}/{repository_name} with milestone '{target_milestone}' and label '{target_label}'...") + print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") pull_requests = get_github_prs( github_token, repository_owner, repository_name, - target_milestone, target_label, state ) From 0b616d8721d432fe940c2683c2edfb9695641bf3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Wed, 28 May 2025 12:03:13 +0000 Subject: [PATCH 04/18] add pr update --- .github/update_release_pr.py | 84 +++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index c00683439ff..b03b0c425ce 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -79,6 +79,53 @@ def get_github_prs(token, owner, repo, label, state): return all_prs +def update_pull_request_description(token, owner, repo, pr_number, new_description): + """ + Updates the description (body) of a GitHub Pull Request. + + Args: + token (str): Token. + owner (str): The owner of the repository. + repo (str): The name of the repository. + pr_number (int): The number of the pull request to update. + new_description (str): The new content for the PR's description. + + Returns: + dict or None: The updated PR object (as a dictionary) if successful, + None otherwise. + """ + headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", + "Content-Type": "application/json" + } + + url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}" + + payload = { + "body": new_description + } + + print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") + print(f"URL: {url}") + # print(f"Payload: {payload}") # Uncomment for detailed payload debug + + try: + response = requests.patch(url, headers=headers, json=payload) + response.raise_for_status() + + updated_pr_data = response.json() + print(f"Successfully updated PR #{pr_number}.") + return updated_pr_data + + except requests.exceptions.RequestException as e: + print(f"Error updating pull request #{pr_number}: {e}") + if response is not None: + print(f"Response status code: {response.status_code}") + print(f"Response text: {response.text}") + return None + + if __name__ == "__main__": github_token = os.environ.get("GITHUB_TOKEN") @@ -92,7 +139,7 @@ def get_github_prs(token, owner, repo, label, state): state = "closed" print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") - + pull_requests = get_github_prs( github_token, repository_owner, @@ -101,9 +148,32 @@ def get_github_prs(token, owner, repo, label, state): state ) - if pull_requests: - print(f"\nFound {len(pull_requests)} pull requests:") - for pr in pull_requests: - print(f"- {pr['state']} #{pr['number']}: {pr['title']} (URL: {pr['html_url']})") - else: - print("No matching pull requests found.") + if not pull_requests: + print("No matching pull requests found") + exit(1) + + print(f"\nFound {len(pull_requests)} pull requests:") + + description_content = "" + for pr in pull_requests: + description_content+= f"- {pr['title']} #{pr['number']}\n" + + returned_pr = pull_requests = get_github_prs( + github_token, + repository_owner, + repository_name, + "release", + "open" + ) + + if len(returned_pr) != 1: + print(f"Unable to find the exact release PR. Returned result: {returned_pr}") + exit(1) + + release_pr = returned_pr[0] + + print(f"Found release PR: {release_pr['title']}") + + update_pull_request_description(github_token, repository_owner, repository_name, release_pr["number"], description_content) + + print(description_content) \ No newline at end of file From 93731d8bc1f0ce8db5ab5a5757c861569b7feeca Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 1 Jun 2025 12:14:21 +0000 Subject: [PATCH 05/18] combine into single api call --- .github/update_release_pr.py | 57 +++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b03b0c425ce..b1136c5233d 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,7 @@ import os import requests -def get_github_prs(token, owner, repo, label, state): +def get_github_prs(token, owner, repo, label = "", state ="all"): """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -79,6 +79,25 @@ def get_github_prs(token, owner, repo, label, state): return all_prs +def get_prs(pull_request_items, label= "", state= "all"): + pr_list = [] + count = 0 + for pr in pull_request_items: + if pr["state"] == state and [item for item in pr["labels"] if item["name"] == label]: + pr_list.append(pr) + count += 1 + + print(f"Found {count} PRs with {label if label else "no"} label and state as {state}") + + return pr_list + +def get_pr_descriptions(pull_request_items): + description_content = "" + for pr in pull_request_items: + description_content+= f"- {pr['title']} #{pr['number']}\n" + + return description_content + def update_pull_request_description(token, owner, repo, pr_number, new_description): """ Updates the description (body) of a GitHub Pull Request. @@ -108,7 +127,6 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") print(f"URL: {url}") - # print(f"Payload: {payload}") # Uncomment for detailed payload debug try: response = requests.patch(url, headers=headers, json=payload) @@ -136,44 +154,41 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti repository_owner = "flow-launcher" repository_name = "flow.launcher" target_label = "enhancement" - state = "closed" + state = "all" print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") pull_requests = get_github_prs( github_token, repository_owner, - repository_name, - target_label, - state + repository_name ) if not pull_requests: print("No matching pull requests found") exit(1) - print(f"\nFound {len(pull_requests)} pull requests:") + print(f"\nFound total of {len(pull_requests)} pull requests") - description_content = "" - for pr in pull_requests: - description_content+= f"- {pr['title']} #{pr['number']}\n" - - returned_pr = pull_requests = get_github_prs( - github_token, - repository_owner, - repository_name, + release_pr = get_prs( + pull_requests, "release", "open" ) - if len(returned_pr) != 1: - print(f"Unable to find the exact release PR. Returned result: {returned_pr}") + if len(release_pr) != 1: + print(f"Unable to find the exact release PR. Returned result: {release_pr}") exit(1) - release_pr = returned_pr[0] + print(f"Found release PR: {release_pr[0]['title']}") + + enhancement_prs = get_prs(pull_requests, "enhancement", "closed") + bug_fix_prs = get_prs(pull_requests, "bug", "closed") - print(f"Found release PR: {release_pr['title']}") + description_content = "# Release notes\n" + description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" + description_content += f"## Bug fixes\n{get_pr_descriptions(bug_fix_prs)}" if bug_fix_prs else "" - update_pull_request_description(github_token, repository_owner, repository_name, release_pr["number"], description_content) + update_pull_request_description(github_token, repository_owner, repository_name, release_pr[0]["number"], description_content) - print(description_content) \ No newline at end of file + print(f"PR content updated to:\n{description_content}") \ No newline at end of file From 72639fa5782d104847bbe69278913a152533113c Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:17:19 +0000 Subject: [PATCH 06/18] formatting --- .github/update_release_pr.py | 96 ++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index b1136c5233d..1eb07fa02c2 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,7 +1,9 @@ import os + import requests -def get_github_prs(token, owner, repo, label = "", state ="all"): + +def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: str = "all") -> list[dict]: """ Fetches pull requests from a GitHub repository that match a given milestone and label. @@ -10,7 +12,7 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): owner (str): The owner of the repository. repo (str): The name of the repository. label (str): The label name. - state (str): State of PR, e.g. open + state (str): State of PR, e.g. open, close, all Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -20,11 +22,11 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json", } - + milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" params = {"state": open} - + try: response = requests.get(milestone_url, headers=headers, params=params) response.raise_for_status() @@ -37,9 +39,9 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): for ms in milestones: if ms["title"] != "Future": milestone_id = ms["number"] - print(f"Gathering PRs with milestone {ms['title']}..." ) + print(f"Gathering PRs with milestone {ms['title']}...") break - + if not milestone_id: print(f"No suitable milestone found in repository '{owner}/{repo}'.") exit(1) @@ -63,12 +65,12 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): try: params["page"] = page response = requests.get(prs_url, headers=headers, params=params) - response.raise_for_status() # Raise an exception for HTTP errors + response.raise_for_status() # Raise an exception for HTTP errors prs = response.json() - + if not prs: - break # No more PRs to fetch - + break # No more PRs to fetch + # Check for pr key since we are using issues endpoint instead. all_prs.extend([item for item in prs if "pull_request" in item]) page += 1 @@ -76,29 +78,57 @@ def get_github_prs(token, owner, repo, label = "", state ="all"): except requests.exceptions.RequestException as e: print(f"Error fetching pull requests: {e}") exit(1) - + return all_prs -def get_prs(pull_request_items, label= "", state= "all"): + +def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[dict]: + """ + Returns a list of pull requests after applying the label and state filters. + + Args: + pull_request_items (str): List of PR items. + label (str): The label name. + state (str): State of PR, e.g. open, close, all + + Returns: + list: A list of dictionaries, where each dictionary represents a pull request. + Returns an empty list if no PRs are found. + """ pr_list = [] count = 0 for pr in pull_request_items: if pr["state"] == state and [item for item in pr["labels"] if item["name"] == label]: pr_list.append(pr) count += 1 - + print(f"Found {count} PRs with {label if label else "no"} label and state as {state}") return pr_list -def get_pr_descriptions(pull_request_items): + +def get_pr_descriptions(pull_request_items: list[dict]) -> str: + """ + Returns the concatenated string of pr title and number in the format of + '- PR title 1 #3651 + - PR title 2 #3652 + - PR title 3 #3653 + ' + + Args: + pull_request_items (list[dict]): List of PR items. + + Returns: + str: a string of PR titles and numbers + """ description_content = "" for pr in pull_request_items: - description_content+= f"- {pr['title']} #{pr['number']}\n" + description_content += f"- {pr['title']} #{pr['number']}\n" return description_content -def update_pull_request_description(token, owner, repo, pr_number, new_description): + +def update_pull_request_description(token: str, owner: str, repo: str, pr_number: int, new_description: str) -> None: """ Updates the description (body) of a GitHub Pull Request. @@ -116,14 +146,12 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti headers = { "Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json", - "Content-Type": "application/json" + "Content-Type": "application/json", } url = f"https://api.github.com/repos/{owner}/{repo}/pulls/{pr_number}" - payload = { - "body": new_description - } + payload = {"body": new_description} print(f"Attempting to update PR #{pr_number} in {owner}/{repo}...") print(f"URL: {url}") @@ -132,21 +160,19 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti response = requests.patch(url, headers=headers, json=payload) response.raise_for_status() - updated_pr_data = response.json() print(f"Successfully updated PR #{pr_number}.") - return updated_pr_data except requests.exceptions.RequestException as e: print(f"Error updating pull request #{pr_number}: {e}") if response is not None: print(f"Response status code: {response.status_code}") print(f"Response text: {response.text}") - return None + exit(1) if __name__ == "__main__": - github_token = os.environ.get("GITHUB_TOKEN") - + github_token = os.environ.get("PR_GET_TOKEN") + if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") exit(1) @@ -158,11 +184,7 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") - pull_requests = get_github_prs( - github_token, - repository_owner, - repository_name - ) + pull_requests = get_github_prs(github_token, repository_owner, repository_name) if not pull_requests: print("No matching pull requests found") @@ -170,16 +192,12 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti print(f"\nFound total of {len(pull_requests)} pull requests") - release_pr = get_prs( - pull_requests, - "release", - "open" - ) + release_pr = get_prs(pull_requests, "release", "open") if len(release_pr) != 1: print(f"Unable to find the exact release PR. Returned result: {release_pr}") exit(1) - + print(f"Found release PR: {release_pr[0]['title']}") enhancement_prs = get_prs(pull_requests, "enhancement", "closed") @@ -189,6 +207,8 @@ def update_pull_request_description(token, owner, repo, pr_number, new_descripti description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" description_content += f"## Bug fixes\n{get_pr_descriptions(bug_fix_prs)}" if bug_fix_prs else "" - update_pull_request_description(github_token, repository_owner, repository_name, release_pr[0]["number"], description_content) + update_pull_request_description( + github_token, repository_owner, repository_name, release_pr[0]["number"], description_content + ) - print(f"PR content updated to:\n{description_content}") \ No newline at end of file + print(f"PR content updated to:\n{description_content}") From f83f70205e2b8d22c4e13ef70934136e4eb65477 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:21:16 +0000 Subject: [PATCH 07/18] formatting --- .github/update_release_pr.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 1eb07fa02c2..40bc80b2f1e 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,5 +1,3 @@ -import os - import requests From 124130a7ae747ef509fe212ce3cac52f6d7b25ab Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:35:43 +0000 Subject: [PATCH 08/18] formatting --- .github/update_release_pr.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 40bc80b2f1e..9c1557ad0e8 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,3 +1,5 @@ +from os import getenv + import requests @@ -169,7 +171,7 @@ def update_pull_request_description(token: str, owner: str, repo: str, pr_number if __name__ == "__main__": - github_token = os.environ.get("PR_GET_TOKEN") + github_token = getenv("GITHUB_TOKEN") if not github_token: print("Error: GITHUB_TOKEN environment variable not set.") From ef8f43f4da3f2b811b64a7a2f0100aae9247ca55 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:39:55 +0000 Subject: [PATCH 09/18] add workflow for update release pr --- .github/workflows/release_pr.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/release_pr.yml diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml new file mode 100644 index 00000000000..12a6b911dd6 --- /dev/null +++ b/.github/workflows/release_pr.yml @@ -0,0 +1,22 @@ +name: Update release PR + +on: + push: + workflow_dispatch: + +jobs: + update-pr: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Run release PR update + env: + GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} + run: | + pwd + python ./.github/update)release_pr.py From 88a2ba4176cdbf5bf0cfb3730d48c409eee38ab1 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:41:34 +0000 Subject: [PATCH 10/18] fix typo --- .github/workflows/release_pr.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index 12a6b911dd6..d96a7271262 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -18,5 +18,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | - pwd - python ./.github/update)release_pr.py + python ./.github/update_release_pr.py From 4e22e20c66b8eb79a828d3e6da65b4065e2556b3 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:43:10 +0000 Subject: [PATCH 11/18] install requests library --- .github/workflows/release_pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index d96a7271262..3a3a4d8264f 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -18,4 +18,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | + pip install requests python ./.github/update_release_pr.py From f72eae2220262b3373b80b5abd237c990a966337 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:45:21 +0000 Subject: [PATCH 12/18] pip install silent --- .github/workflows/release_pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index 3a3a4d8264f..c801f68d0c7 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -18,5 +18,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | - pip install requests + pip install requests -q python ./.github/update_release_pr.py From a9a212e4dec018bdf09ba24fcbe335ca9567563e Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:52:12 +0000 Subject: [PATCH 13/18] add trigger only run when pr exists --- .github/workflows/release_pr.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index c801f68d0c7..dafc77b8144 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -1,11 +1,15 @@ name: Update release PR on: - push: + pull_request: + types: [opened, reopened, synchronize] + branches: + - master workflow_dispatch: jobs: update-pr: + if: github.head_ref == 'dev' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From a52ceb1caf316eda02f39175392f30c998d721a0 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:56:36 +0000 Subject: [PATCH 14/18] add exit when more than two milestones found --- .github/update_release_pr.py | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 9c1557ad0e8..e528e45035d 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -34,6 +34,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st if len(milestones) > 2: print("More than two milestones found, unable to determine the milestone required.") + exit(1) # milestones.pop() for ms in milestones: From f7e473cee3fe8d4e439be60514f996fe525c2b2e Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 11:59:55 +0000 Subject: [PATCH 15/18] typo --- .github/update_release_pr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index e528e45035d..a79005141e7 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -25,7 +25,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st milestone_id = None milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": open} + params = {"state": "open"} try: response = requests.get(milestone_url, headers=headers, params=params) @@ -103,7 +103,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") pr_list.append(pr) count += 1 - print(f"Found {count} PRs with {label if label else "no"} label and state as {state}") + print(f"Found {count} PRs with {label if label else 'no'} label and state as {state}") return pr_list From a1a4ef6b2255c9824a777127709871704a816a26 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 2 Jun 2025 20:05:59 +0800 Subject: [PATCH 16/18] Fix comment typos --- .github/update_release_pr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index a79005141e7..bc16f20bc08 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -12,7 +12,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st owner (str): The owner of the repository. repo (str): The name of the repository. label (str): The label name. - state (str): State of PR, e.g. open, close, all + state (str): State of PR, e.g. open, closed, all Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -90,7 +90,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") Args: pull_request_items (str): List of PR items. label (str): The label name. - state (str): State of PR, e.g. open, close, all + state (str): State of PR, e.g. open, closed, all Returns: list: A list of dictionaries, where each dictionary represents a pull request. From dfbc84780a148aa53dca0627d4cbfc1ece59ff50 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 12:19:06 +0000 Subject: [PATCH 17/18] remove dev source branch condition --- .github/workflows/release_pr.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index dafc77b8144..b0a1783046f 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -9,7 +9,6 @@ on: jobs: update-pr: - if: github.head_ref == 'dev' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From ef84add35ce82c3ffb2267208a1a7743a5c00a31 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 2 Jun 2025 12:27:38 +0000 Subject: [PATCH 18/18] minor adjustments --- .github/update_release_pr.py | 6 +++--- .github/workflows/release_pr.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index bc16f20bc08..f90f6181d01 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -88,7 +88,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") Returns a list of pull requests after applying the label and state filters. Args: - pull_request_items (str): List of PR items. + pull_request_items (list[dict]): List of PR items. label (str): The label name. state (str): State of PR, e.g. open, closed, all @@ -158,6 +158,7 @@ def update_pull_request_description(token: str, owner: str, repo: str, pr_number print(f"URL: {url}") try: + response = None response = requests.patch(url, headers=headers, json=payload) response.raise_for_status() @@ -180,10 +181,9 @@ def update_pull_request_description(token: str, owner: str, repo: str, pr_number repository_owner = "flow-launcher" repository_name = "flow.launcher" - target_label = "enhancement" state = "all" - print(f"Fetching PRs for {repository_owner}/{repository_name} with label '{target_label}'...") + print(f"Fetching {state} PRs for {repository_owner}/{repository_name} ...") pull_requests = get_github_prs(github_token, repository_owner, repository_name) diff --git a/.github/workflows/release_pr.yml b/.github/workflows/release_pr.yml index b0a1783046f..451bf386c92 100644 --- a/.github/workflows/release_pr.yml +++ b/.github/workflows/release_pr.yml @@ -22,4 +22,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.PR_TOKEN }} run: | pip install requests -q - python ./.github/update_release_pr.py + python3 ./.github/update_release_pr.py