Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
fb1cb4f
version bump
jjw24 Jul 13, 2025
b08cb22
Merge pull request #3758 from Flow-Launcher/release_workflow_mileston…
jjw24 Jul 13, 2025
d409e3d
Merge pull request #3729 from Flow-Launcher/skip_tag_build
jjw24 Jun 14, 2025
cbbd357
Merge pull request #3734 from Flow-Launcher/shell_plugin_issue
Jack251970 Jun 16, 2025
a4acf07
Merge pull request #3566 from Flow-Launcher/winform_language_issue
jjw24 Jun 16, 2025
bcb8c39
Merge pull request #3737 from Flow-Launcher/tab_sequence
Jack251970 Jun 17, 2025
cf8e91b
Merge pull request #3743 from Flow-Launcher/update_prerelease_message
jjw24 Jun 18, 2025
679dc3b
Fix false failing spell check rules (#3745)
jjw24 Jun 19, 2025
1df4c73
Merge pull request #3779 from onesounds/FixXamlError
jjw24 Jul 13, 2025
3b8bc94
Merge pull request #3784 from Flow-Launcher/explorer_preview_margin
jjw24 Jul 13, 2025
15dbb0f
Merge pull request #3785 from Flow-Launcher/row_issue
Jack251970 Jun 30, 2025
4fd7e29
Merge pull request #3786 from Flow-Launcher/removePluginSettings
Jack251970 Jun 30, 2025
6dfc09f
Merge pull request #3791 from Flow-Launcher/modified_plugins
Jack251970 Jul 1, 2025
def4c07
New Crowdin updates (#3730)
jjw24 Jul 3, 2025
d384e7a
Merge pull request #3802 from Flow-Launcher/action_keyword_check
Jack251970 Jul 6, 2025
0747f0b
Merge pull request #3795 from Flow-Launcher/check_plugin_modified
Jack251970 Jul 6, 2025
4bebab0
Merge pull request #3805 from OrigamiDev-Pete/dev
Jack251970 Jul 7, 2025
dc34a38
Merge pull request #3572 from Flow-Launcher/plugin_store_item_vm_null
jjw24 Jul 13, 2025
1c43e45
Merge pull request #3811 from Flow-Launcher/refresh_home_page
jjw24 Jul 10, 2025
ced9603
Merge pull request #3803 from Flow-Launcher/CustomQueryHotkeySetting_…
jjw24 Jul 10, 2025
575236d
Merge pull request #3810 from Flow-Launcher/quick_access_link_type
jjw24 Jul 13, 2025
0d36688
Merge pull request #3816 from Flow-Launcher/clipboard_invalid
Jack251970 Jul 11, 2025
d8f5314
Merge pull request #3806 from Flow-Launcher/nuget_package_document
Jack251970 Jul 12, 2025
def868f
Merge pull request #3819 from Flow-Launcher/home_page_update
Jack251970 Jul 13, 2025
f083ca8
Revert "Merge pull request #3572 from Flow-Launcher/plugin_store_item…
jjw24 Jul 13, 2025
c259950
Merge pull request #3572 from Flow-Launcher/plugin_store_item_vm_null
jjw24 Jul 13, 2025
4d44ec4
Revert "Merge pull request #3810 from Flow-Launcher/quick_access_link…
jjw24 Jul 13, 2025
992c434
New Crowdin updates (#3807)
jjw24 Jul 13, 2025
7b25a70
version bump Plugin project
jjw24 Jul 13, 2025
c520ac0
Merge pull request #3821 from Flow-Launcher/fix-uwp-package-monitoring
jjw24 Jul 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 6 additions & 13 deletions .github/actions/spelling/expect.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# This file should contain names of products, companies, or individuals that aren't in a standard dictionary (e.g., GitHub, Keptn, VSCode).

crowdin
DWM
workflows
Expand Down Expand Up @@ -34,7 +36,6 @@ mscorlib
pythonw
dotnet
winget
jjw24
wolframalpha
gmail
duckduckgo
Expand All @@ -49,15 +50,13 @@ srchadmin
EWX
dlgtext
CMD
appref-ms
appref
TSource
runas
dpi
popup
ptr
pluginindicator
TobiasSekan
img
resx
bak
Expand All @@ -68,9 +67,6 @@ dlg
ddd
dddd
clearlogfolder
ACCENT_ENABLE_TRANSPARENTGRADIENT
ACCENT_ENABLE_BLURBEHIND
WCA_ACCENT_POLICY
HGlobal
dopusrt
firefox
Expand All @@ -91,22 +87,19 @@ keyevent
KListener
requery
vkcode
čeština
Polski
Srpski
Português
Português (Brasil)
Italiano
Slovenský
quicklook
Tiếng Việt
Droplex
Preinstalled
errormetadatafile
noresult
pluginsmanager
alreadyexists
JsonRPC
JsonRPCV2
Softpedia
img
Reloadable
metadatas
WMP
VSTHRD
13 changes: 13 additions & 0 deletions .github/actions/spelling/patterns.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
# This file should contain strings that contain a mix of letters and numbers, or specific symbols


# Questionably acceptable forms of `in to`
# Personally, I prefer `log into`, but people object
Expand Down Expand Up @@ -121,3 +123,14 @@

# version suffix <word>v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))

\bjjw24\b
\bappref-ms\b
\bTobiasSekan\b
\bJsonRPC\b
\bJsonRPCV2\b
\bTiếng Việt\b
\bPortuguês (Brasil)\b
\bčeština\b
\bPortuguês\b
\bIoc\b
102 changes: 50 additions & 52 deletions .github/update_release_pr.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from os import getenv
from typing import Optional

import requests


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.
Fetches pull requests from a GitHub repository that match a given label and state.

Args:
token (str): GitHub token.
Expand All @@ -23,39 +24,10 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
"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()
milestones = response.json()

if len(milestones) > 2:
print("More than two milestones found, unable to determine the milestone required.")
exit(1)

# milestones.pop()
for ms in milestones:
if ms["title"] != "Future":
milestone_id = ms["number"]
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)

except requests.exceptions.RequestException as e:
print(f"Error fetching milestones: {e}")
exit(1)

# This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue.
# This endpoint allows filtering by label(and milestone). 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,
}
Expand Down Expand Up @@ -83,14 +55,18 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st
return all_prs


def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[dict]:
def get_prs(
pull_request_items: list[dict], label: str = "", state: str = "all", milestone_title: Optional[str] = None
) -> list[dict]:
"""
Returns a list of pull requests after applying the label and state filters.

Args:
pull_request_items (list[dict]): List of PR items.
label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
milestone_title (Optional[str]): The milestone title to filter by. This is the milestone number you created
in GitHub, e.g. '1.20.0'. If None, no milestone filtering is applied.

Returns:
list: A list of dictionaries, where each dictionary represents a pull request.
Expand All @@ -99,22 +75,32 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all")
pr_list = []
count = 0
for pr in pull_request_items:
if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]):
pr_list.append(pr)
count += 1
if state not in [pr["state"], "all"]:
continue

if label and not [item for item in pr["labels"] if item["name"] == label]:
continue

print(f"Found {count} PRs with {label if label else 'no filter on'} label and state as {state}")
if milestone_title:
if pr["milestone"] is None or pr["milestone"]["title"] != milestone_title:
continue

pr_list.append(pr)
count += 1

print(
f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr["milestone"] if pr["milestone"] is not None else "None"}"
)

return pr_list

def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[str]:

def get_prs_assignees(pull_request_items: list[dict]) -> list[str]:
"""
Returns a list of pull request assignees after applying the label and state filters, excludes jjw24.
Returns a list of pull request assignees, excludes jjw24.

Args:
pull_request_items (list[dict]): List of PR items.
label (str): The label name. Filter is not applied when empty string.
state (str): State of PR, e.g. open, closed, all
pull_request_items (list[dict]): List of PR items to get the assignees from.

Returns:
list: A list of strs, where each string is an assignee name. List is not distinct, so can contain
Expand All @@ -123,13 +109,13 @@ def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: st
"""
assignee_list = []
for pr in pull_request_items:
if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]):
[assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ]
[assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24"]

print(f"Found {len(assignee_list)} assignees with {label if label else 'no filter on'} label and state as {state}")
print(f"Found {len(assignee_list)} assignees")

return assignee_list


def get_pr_descriptions(pull_request_items: list[dict]) -> str:
"""
Returns the concatenated string of pr title and number in the format of
Expand Down Expand Up @@ -207,30 +193,42 @@ def update_pull_request_description(token: str, owner: str, repo: str, pr_number

print(f"Fetching {state} PRs for {repository_owner}/{repository_name} ...")

pull_requests = get_github_prs(github_token, repository_owner, repository_name)
# First, get all PRs to find the release PR and determine the milestone
all_pull_requests = get_github_prs(github_token, repository_owner, repository_name)

if not pull_requests:
print("No matching pull requests found")
if not all_pull_requests:
print("No pull requests found")
exit(1)

print(f"\nFound total of {len(pull_requests)} pull requests")
print(f"\nFound total of {len(all_pull_requests)} pull requests")

release_pr = get_prs(pull_requests, "release", "open")
release_pr = get_prs(all_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")
bug_fix_prs = get_prs(pull_requests, "bug", "closed")
release_milestone_title = release_pr[0].get("milestone", {}).get("title", None)

if not release_milestone_title:
print("Release PR does not have a milestone assigned.")
exit(1)

print(f"Using milestone number: {release_milestone_title}")

enhancement_prs = get_prs(all_pull_requests, "enhancement", "closed", release_milestone_title)
bug_fix_prs = get_prs(all_pull_requests, "bug", "closed", release_milestone_title)

if len(enhancement_prs) == 0 and len(bug_fix_prs) == 0:
print(f"No PRs with {release_milestone_title} milestone were found")

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 ""

assignees = list(set(get_prs_assignees(pull_requests, "enhancement", "closed") + get_prs_assignees(pull_requests, "bug", "closed")))
assignees = list(set(get_prs_assignees(enhancement_prs) + get_prs_assignees(bug_fix_prs)))
assignees.sort(key=str.lower)

description_content += f"### Authors:\n{', '.join(assignees)}"
Expand Down
Loading
Loading