mirror of
https://github.com/penpot/penpot.git
synced 2026-06-09 08:52:05 +00:00
Merge remote-tracking branch 'origin/staging' into develop
This commit is contained in:
commit
88f50b6ddd
@ -49,6 +49,7 @@ python3 tools/gh.py issues "2.16.0" --exclude "release blocker,no changelog"
|
||||
- `no changelog` label — Chore/refactor work that doesn't need a changelog entry
|
||||
- `release blocker` label — Blocked issues not yet ready for changelog
|
||||
- `Task` issue type — Internal chores are not user-facing; filter these out after fetching
|
||||
- **Rejected project status** — Issues with a "Rejected" status in the "Main" project board are automatically excluded by `gh.py`. This project-level status (independent of the GitHub issue `state`) indicates the issue was rejected from the release. Use `--include-rejected` to override.
|
||||
|
||||
**Exclusion rules (PR-level):**
|
||||
In addition to issue-level exclusions, PRs with these labels should be
|
||||
@ -57,7 +58,9 @@ excluded regardless of their linked issue's labels:
|
||||
- `no issue required` — Trivial fix not tracked as an issue
|
||||
|
||||
The script outputs JSON with each entry containing `number`, `title`, `state`,
|
||||
`issue_type`, `labels`, and `closing_prs` (the PRs that fix each issue).
|
||||
`issue_type`, `labels`, `closing_prs` (the PRs that fix each issue), and
|
||||
`project_status` (the "Main" project board status, e.g. "Done", "Rejected",
|
||||
or `null` if not tracked in a project).
|
||||
|
||||
### 3. Identify missing entries (optional)
|
||||
|
||||
@ -426,7 +429,11 @@ if closed:
|
||||
between the description and the issue link. Use the **PR author** (not the
|
||||
issue author) for the attribution.
|
||||
- **Only closed issues.** An issue must have `state: "closed"` to appear in
|
||||
the changelog. Open unresolved issues are omitted.
|
||||
the changelog. Open/unresolved issues are omitted.
|
||||
- **Rejected project status.** Issues marked as "Rejected" in the "Main"
|
||||
project board are automatically excluded by `gh.py`, even if they are
|
||||
closed. The project status is distinct from the GitHub issue state.
|
||||
Use `--include-rejected` to override this behavior.
|
||||
- **Excluded issues.** Issues with `no changelog` label must be excluded.
|
||||
Issues with `issue_type: "Task"` must also be excluded — they are internal
|
||||
chores, not user-facing changes.
|
||||
|
||||
@ -124,6 +124,7 @@
|
||||
- Clarify self-hosted OIDC configuration for containerized (by @sancfc) [#9764](https://github.com/penpot/penpot/issues/9764) (PR: [#9758](https://github.com/penpot/penpot/pull/9758))
|
||||
- Update User Guide with 2.16 features (by @myfunnyandy) [#9767](https://github.com/penpot/penpot/issues/9767) (PR: [#9768](https://github.com/penpot/penpot/pull/9768))
|
||||
- Improve file validation performance and fix orphan shape detection [#9790](https://github.com/penpot/penpot/issues/9790) (PR: [#9789](https://github.com/penpot/penpot/pull/9789))
|
||||
- Add v2.16 release notes (What's new modal) [#9945](https://github.com/penpot/penpot/issues/9945) (PR: [#9940](https://github.com/penpot/penpot/pull/9940))
|
||||
|
||||
### :bug: Bugs fixed
|
||||
|
||||
@ -206,6 +207,7 @@
|
||||
- Fix delete invitation modal readability in light theme [#9737](https://github.com/penpot/penpot/issues/9737) (PR: [#9747](https://github.com/penpot/penpot/pull/9747))
|
||||
- Fix team invitation not automatically accepted after account validation [#9776](https://github.com/penpot/penpot/issues/9776) (PR: [#9782](https://github.com/penpot/penpot/pull/9782))
|
||||
- Fix design tokens vanishing from the sidebar when a token name collides with a token-group prefix from another active set (e.g. `a` in one set and `a.b` in another); the colliding token is now kept and rendered as a broken pill [Github #9584](https://github.com/penpot/penpot/issues/9584)
|
||||
- Fix Plugin API addRulerGuide creating guides on page instead of board (by @girafic) [#8225](https://github.com/penpot/penpot/issues/8225) (PR: [#8632](https://github.com/penpot/penpot/pull/8632))
|
||||
|
||||
|
||||
## 2.15.4
|
||||
|
||||
30
tools/gh.py
30
tools/gh.py
@ -115,6 +115,16 @@ query($owner: String!, $repo: String!, $milestone: Int!, $cursor: String) {
|
||||
issueType { name }
|
||||
labels(first: 20) { nodes { name } }
|
||||
closedByPullRequestsReferences(first: 5) { nodes { number } }
|
||||
projectItems(first: 10) {
|
||||
nodes {
|
||||
project { title }
|
||||
fieldValueByName(name: "Status") {
|
||||
... on ProjectV2ItemFieldSingleSelectValue {
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -154,6 +164,14 @@ def fetch_milestone_issues(milestone_num: int, states: str) -> list[dict]:
|
||||
if node is None:
|
||||
continue
|
||||
issue_type = node.get("issueType")
|
||||
# Extract project status from the "Main" project board (if present)
|
||||
project_status = None
|
||||
for pi in (node.get("projectItems") or {}).get("nodes") or []:
|
||||
project = pi.get("project") or {}
|
||||
if project.get("title") == "Main":
|
||||
status_field = pi.get("fieldValueByName") or {}
|
||||
project_status = status_field.get("name")
|
||||
break
|
||||
all_nodes.append({
|
||||
"number": node["number"],
|
||||
"title": node["title"],
|
||||
@ -161,6 +179,7 @@ def fetch_milestone_issues(milestone_num: int, states: str) -> list[dict]:
|
||||
"issue_type": issue_type["name"] if issue_type else None,
|
||||
"labels": [lbl["name"] for lbl in node["labels"]["nodes"]],
|
||||
"closing_prs": [pr["number"] for pr in node["closedByPullRequestsReferences"]["nodes"]],
|
||||
"project_status": project_status,
|
||||
})
|
||||
|
||||
total = len(all_nodes)
|
||||
@ -210,6 +229,13 @@ def cmd_issues(args: argparse.Namespace) -> None:
|
||||
print(f"After excluding labels: {len(filtered)} issues", file=sys.stderr)
|
||||
issues = filtered
|
||||
|
||||
# Filter out issues with "Rejected" project status (unless --include-rejected)
|
||||
if not args.include_rejected:
|
||||
rejected = [iss for iss in issues if iss.get("project_status") == "Rejected"]
|
||||
if rejected:
|
||||
issues = [iss for iss in issues if iss.get("project_status") != "Rejected"]
|
||||
print(f"After excluding rejected: {len(issues)} issues (removed {len(rejected)}: {[r['number'] for r in rejected]})", file=sys.stderr)
|
||||
|
||||
# Filter to issues NOT yet in the comparison file (if --compare given)
|
||||
if args.compare:
|
||||
existing_nums = load_existing_issue_numbers(args.compare)
|
||||
@ -452,6 +478,10 @@ def main() -> None:
|
||||
"--compare",
|
||||
help="Path to CHANGES.md; only show issues NOT yet referenced in that file"
|
||||
)
|
||||
p_issues.add_argument(
|
||||
"--include-rejected", action="store_true",
|
||||
help="Include issues with 'Rejected' project status (excluded by default)"
|
||||
)
|
||||
p_issues.set_defaults(func=cmd_issues)
|
||||
|
||||
# --- prs ---
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user