一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
436 行
42 KiB
JSON
436 行
42 KiB
JSON
{
|
||
"issue": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/14433",
|
||
"repository_url": "https://api.github.com/repos/laurent22/joplin",
|
||
"labels_url": "https://api.github.com/repos/laurent22/joplin/issues/14433/labels{/name}",
|
||
"comments_url": "https://api.github.com/repos/laurent22/joplin/issues/14433/comments",
|
||
"events_url": "https://api.github.com/repos/laurent22/joplin/issues/14433/events",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14433",
|
||
"id": 3978121701,
|
||
"node_id": "PR_kwDOBLftOs7FpRi-",
|
||
"number": 14433,
|
||
"title": "Desktop: Resolves #14251 : Improved the new version popup window when there is an update",
|
||
"user": {
|
||
"login": "fadexadex",
|
||
"id": 118044106,
|
||
"node_id": "U_kgDOBwk1yg",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/118044106?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/fadexadex",
|
||
"html_url": "https://github.com/fadexadex",
|
||
"followers_url": "https://api.github.com/users/fadexadex/followers",
|
||
"following_url": "https://api.github.com/users/fadexadex/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/fadexadex/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/fadexadex/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/fadexadex/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/fadexadex/orgs",
|
||
"repos_url": "https://api.github.com/users/fadexadex/repos",
|
||
"events_url": "https://api.github.com/users/fadexadex/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/fadexadex/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"labels": [
|
||
{
|
||
"id": 519700743,
|
||
"node_id": "MDU6TGFiZWw1MTk3MDA3NDM=",
|
||
"url": "https://api.github.com/repos/laurent22/joplin/labels/enhancement",
|
||
"name": "enhancement",
|
||
"color": "5ebeff",
|
||
"default": true,
|
||
"description": "Feature requests and code enhancements"
|
||
},
|
||
{
|
||
"id": 1080341216,
|
||
"node_id": "MDU6TGFiZWwxMDgwMzQxMjE2",
|
||
"url": "https://api.github.com/repos/laurent22/joplin/labels/desktop",
|
||
"name": "desktop",
|
||
"color": "ffc274",
|
||
"default": false,
|
||
"description": "All desktop platforms"
|
||
}
|
||
],
|
||
"state": "closed",
|
||
"locked": false,
|
||
"assignees": [],
|
||
"milestone": null,
|
||
"comments": 4,
|
||
"created_at": "2026-02-23T13:10:35Z",
|
||
"updated_at": "2026-02-23T13:35:30Z",
|
||
"closed_at": "2026-02-23T13:35:18Z",
|
||
"assignee": null,
|
||
"author_association": "NONE",
|
||
"active_lock_reason": null,
|
||
"draft": false,
|
||
"pull_request": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/pulls/14433",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14433",
|
||
"diff_url": "https://github.com/laurent22/joplin/pull/14433.diff",
|
||
"patch_url": "https://github.com/laurent22/joplin/pull/14433.patch",
|
||
"merged_at": null
|
||
},
|
||
"body": "Resolves #14251 \r\n\r\nThis feature introduces an improved version of the pop up window when there is an update. \r\n\r\n<img width=\"1512\" height=\"982\" alt=\"Screenshot 2026-02-23 at 13 17 45\" src=\"https://github.com/user-attachments/assets/9787346f-3376-433f-b73c-798dbe116c04\" />\r\n\r\n## Changes\r\n\r\n- **Rich Release Notes Display:** Replaced the native, often-truncated OS message box with a custom, React-based dialog that displays the full, cleanly formatted release notes in a scrollable view.\r\n- **Media Link Extraction:** Updated the version extraction logic in [checkForUpdatesUtils.ts](cci:7://file:///Users/fadex/Downloads/coding-apps/joplin/packages/app-desktop/utils/checkForUpdatesUtils.ts:0:0-0:0) to automatically detect and extract media links (like YouTube or Twitter/X URLs) directly from the GitHub release body.\r\n- **Quick Links:** Added intuitive footer links to the new dialog, allowing users to quickly open the full GitHub changelog or view any associated release announcement media in their browser.\r\n\r\n## Manual Testing Plan\r\n\r\nTo thoroughly test these changes locally, please follow these steps:\r\n\r\n### Test 1: Simulating the Popup display (Manual Check)\r\n1. Run the app in development mode (`cd packages/app-desktop && yarn start`).\r\n2. Temporarily open `packages/app-desktop/gui/MainScreen.tsx`.\r\n3. Add the following import to the top of the file:\r\n```typescript\r\nimport { extractVersionInfo } from '../utils/checkForUpdatesUtils';\r\n```\r\n4. Add the following `setTimeout` to `componentDidMount` to force the dialog to appear with real release data:\r\n```typescript\r\n\t\tsetTimeout(() => {\r\n\t\t\tvoid (async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst response = await shim.fetch('https://api.github.com/repos/laurent22/joplin/releases');\r\n\t\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\t\tthrow new Error(`Cannot get latest release info: ${await response.text()}`);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst releases = await response.json();\r\n\t\t\t\t\tconst release = extractVersionInfo(releases, process.platform, process.arch, shim.isPortable(), { includePreReleases: true });\r\n\r\n\t\t\t\t\t(this.props.dispatch as any)({\r\n\t\t\t\t\t\ttype: 'DIALOG_OPEN',\r\n\t\t\t\t\t\tname: 'whatsNew',\r\n\t\t\t\t\t\tprops: {\r\n\t\t\t\t\t\t\trelease,\r\n\t\t\t\t\t\t\tisAutoUpdate: false,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t});\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\tconsole.error('Failed to fetch test update releases:', error);\r\n\t\t\t\t}\r\n\t\t\t})();\r\n\t\t}, 2000);\r\n```\r\n5. Save the file. The dialog should appear 2 seconds after the app reloads.\r\n4. **Verify:** The \"What's New in Joplin 3.2.0\" title appears, the notes are visible, and the \"View announcement video/images\" link is present.\r\n\r\n### Test 2: Button Actions\r\n1. While the dialog from Test 1 is open, click **Later**. Verify the dialog closes.\r\n2. Trigger the dialog again. Click **Skip This Version**. Verify the dialog closes (and underneath, it records the skipped version).\r\n3. Trigger the dialog again. Click **Download**. Verify it attempts to trigger the version's download, and the dialog closes.\r\n\r\n### Test 3: Media & Changelog Links\r\n*(Note: Because we are testing with live GitHub release data, the latest release might not contain any media links. If it doesn't, the announcement link will be correctly hidden.)*\r\n1. If the **\"View announcement video/images\"** link is present, click it. Verify it opens the media URL (e.g., Twitter/YouTube) in your external browser.\r\n2. Click the **\"View full release notes\"** link. Verify it opens the GitHub release page.\r\n3. If you'd like to explicitly test the media link, you can temporarily add `release.mediaUrl = 'https://twitter.com/joplinapp/status/12345';` in your `MainScreen.tsx` test block right before the `dispatch` call. Reload and verify the link appears and works.\r\n\r\n### Test 4: Theming\r\n1. You can attempt to change your system settings.\r\n2. Verify the dialog's text, background, and button colors adapt correctly to the active theme.\r\n\r\n\r\n\r\n### AI Assistance Disclosure\r\n\r\n- **Parts generated or significantly modified using AI**: The React-based updates to the \"What's New\" dialog, the `extractVersionInfo` utility refactoring, and the `MainScreen.tsx` test blocks, were drafted using AI assistance. \r\n- **How AI was used**: I utilized Claude and Gemini to assist with drafting the component code, refactoring the GitHub API parsing logic to support dynamic updates, and improving the wording and clarity of my tests.\r\n- **Review and Understanding**: I can confirm that I have reviewed the generated output carefully, fully understand the generated code and text, and have tested it extensively to ensure the code is correct, runs as it should, and completely aligns with Joplin's existing architectural practices.",
|
||
"closed_by": {
|
||
"login": "laurent22",
|
||
"id": 1285584,
|
||
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/laurent22",
|
||
"html_url": "https://github.com/laurent22",
|
||
"followers_url": "https://api.github.com/users/laurent22/followers",
|
||
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
||
"repos_url": "https://api.github.com/users/laurent22/repos",
|
||
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/14433/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"timeline_url": "https://api.github.com/repos/laurent22/joplin/issues/14433/timeline",
|
||
"performed_via_github_app": null,
|
||
"state_reason": null
|
||
},
|
||
"comments": [
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944707625",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14433#issuecomment-3944707625",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14433",
|
||
"id": 3944707625,
|
||
"node_id": "IC_kwDOBLftOs7rH3Yp",
|
||
"user": {
|
||
"login": "github-actions[bot]",
|
||
"id": 41898282,
|
||
"node_id": "MDM6Qm90NDE4OTgyODI=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/github-actions%5Bbot%5D",
|
||
"html_url": "https://github.com/apps/github-actions",
|
||
"followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers",
|
||
"following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs",
|
||
"repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos",
|
||
"events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events",
|
||
"type": "Bot",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-02-23T13:10:47Z",
|
||
"updated_at": "2026-02-23T13:35:30Z",
|
||
"body": "****CLA Assistant Lite bot**** All contributors have signed the CLA ✍️ ✅",
|
||
"author_association": "CONTRIBUTOR",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944707625/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": {
|
||
"id": 15368,
|
||
"client_id": "Iv1.05c79e9ad1f6bdfa",
|
||
"slug": "github-actions",
|
||
"node_id": "MDM6QXBwMTUzNjg=",
|
||
"owner": {
|
||
"login": "github",
|
||
"id": 9919,
|
||
"node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/github",
|
||
"html_url": "https://github.com/github",
|
||
"followers_url": "https://api.github.com/users/github/followers",
|
||
"following_url": "https://api.github.com/users/github/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/github/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/github/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/github/orgs",
|
||
"repos_url": "https://api.github.com/users/github/repos",
|
||
"events_url": "https://api.github.com/users/github/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/github/received_events",
|
||
"type": "Organization",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"name": "GitHub Actions",
|
||
"description": "Automate your workflow from idea to production",
|
||
"external_url": "https://help.github.com/en/actions",
|
||
"html_url": "https://github.com/apps/github-actions",
|
||
"created_at": "2018-07-30T09:30:17Z",
|
||
"updated_at": "2026-05-05T14:51:38Z",
|
||
"permissions": {
|
||
"actions": "write",
|
||
"administration": "read",
|
||
"artifact_metadata": "write",
|
||
"attestations": "write",
|
||
"checks": "write",
|
||
"code_quality": "write",
|
||
"contents": "write",
|
||
"copilot_requests": "write",
|
||
"deployments": "write",
|
||
"discussions": "write",
|
||
"issues": "write",
|
||
"merge_queues": "write",
|
||
"metadata": "read",
|
||
"models": "read",
|
||
"packages": "write",
|
||
"pages": "write",
|
||
"pull_requests": "write",
|
||
"repository_hooks": "write",
|
||
"repository_projects": "write",
|
||
"security_events": "write",
|
||
"statuses": "write",
|
||
"vulnerability_alerts": "read"
|
||
},
|
||
"events": [
|
||
"branch_protection_rule",
|
||
"check_run",
|
||
"check_suite",
|
||
"create",
|
||
"delete",
|
||
"deployment",
|
||
"deployment_status",
|
||
"discussion",
|
||
"discussion_comment",
|
||
"fork",
|
||
"gollum",
|
||
"issues",
|
||
"issue_comment",
|
||
"label",
|
||
"merge_group",
|
||
"milestone",
|
||
"page_build",
|
||
"public",
|
||
"pull_request",
|
||
"pull_request_review",
|
||
"pull_request_review_comment",
|
||
"push",
|
||
"registry_package",
|
||
"release",
|
||
"repository",
|
||
"repository_dispatch",
|
||
"status",
|
||
"watch",
|
||
"workflow_dispatch",
|
||
"workflow_run"
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944709189",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14433#issuecomment-3944709189",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14433",
|
||
"id": 3944709189,
|
||
"node_id": "IC_kwDOBLftOs7rH3xF",
|
||
"user": {
|
||
"login": "coderabbitai[bot]",
|
||
"id": 136622811,
|
||
"node_id": "BOT_kgDOCCSy2w",
|
||
"avatar_url": "https://avatars.githubusercontent.com/in/347564?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/coderabbitai%5Bbot%5D",
|
||
"html_url": "https://github.com/apps/coderabbitai",
|
||
"followers_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/followers",
|
||
"following_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/orgs",
|
||
"repos_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/repos",
|
||
"events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/coderabbitai%5Bbot%5D/received_events",
|
||
"type": "Bot",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-02-23T13:11:08Z",
|
||
"updated_at": "2026-02-23T13:20:40Z",
|
||
"body": "<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nA new \"What's New\" dialog has been introduced to display release notes and media when desktop app updates are available. The update checking flow has been modified to dispatch dialog-open actions instead of relying solely on system dialogs, with utilities updated to extract media URLs from release bodies.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Ignore configuration** <br> `.eslintignore`, `.gitignore`|Two WhatsNewDialog files added to ignore rules for linting and version control.|\n|**Update check flow** <br> `packages/app-desktop/app.ts`, `packages/app-desktop/checkForUpdates.ts`, `packages/app-desktop/gui/MenuBar.tsx`|Added optional dispatch callback parameter to checkForUpdates function. When dispatch is provided and a new release is available, a DIALOG_OPEN action is dispatched to display the what's new dialog instead of the native update prompt.|\n|**Notification and dialog components** <br> `packages/app-desktop/gui/UpdateNotification/UpdateNotification.tsx`, `packages/app-desktop/gui/WhatsNewDialog/ReleaseNotesSection.tsx`, `packages/app-desktop/gui/WhatsNewDialog/WhatsNewDialog.tsx`, `packages/app-desktop/gui/WindowCommandsAndDialogs/utils/appDialogs.tsx`|New ReleaseNotesSection and WhatsNewDialog components introduced to render release notes, media links, and download options. UpdateNotification updated to accept dispatch prop and conditionally render a \"What's New\" button. Dialog registry updated with whatsNew entry.|\n|**Update utilities** <br> `packages/app-desktop/utils/checkForUpdatesUtils.ts`, `packages/app-desktop/utils/checkForUpdatesUtils.test.ts`|Added extractMediaUrl function to parse media URLs (Twitter, YouTube) from release bodies. Release interface extended with optional mediaUrl field. extractVersionInfo updated to populate mediaUrl.|\n\n## Suggested labels\n\n`desktop`, `enhancement`\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 4 | ❌ 1</summary>\n\n### ❌ Failed checks (1 warning)\n\n| Check name | Status | Explanation | Resolution |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n<details>\n<summary>✅ Passed checks (4 passed)</summary>\n\n| Check name | Status | Explanation |\n| :------------------------: | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Title check | ✅ Passed | The title clearly describes the main change: improving the new version popup window when there is an update, directly addressing the linked issue `#14251`. |\n| Description check | ✅ Passed | The description provides clear context about the improvements, including rich release notes display, media link extraction, and quick links, all related to the changeset. |\n| Linked Issues check | ✅ Passed | The PR fully implements the objectives from issue `#14251`: displays full release notes in a custom dialog, provides links to the full changelog, and extracts and displays media URLs from release bodies. |\n| Out of Scope Changes check | ✅ Passed | All changes are directly related to improving the update notification dialog and the underlying utilities needed to support this feature, with no extraneous modifications. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings (stacked PR)\n- [ ] <!-- {\"checkboxId\": \"3e1879ae-f29b-4d0d-8e06-d12b7ba33d98\"} --> 📝 Generate docstrings (commit on current branch)\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} --> Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} --> Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- announcements_start -->\n\n> [!TIP]\n> [Issue Planner](https://www.coderabbit.ai/issue-planner) is now in beta. Read the [docs](https://docs.coderabbit.ai/issues/planning) and try it out! Share your feedback on [Discord](https://discord.com/invite/coderabbit).\n\n<!-- announcements_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=laurent22/joplin&utm_content=14433)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->",
|
||
"author_association": "CONTRIBUTOR",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944709189/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": {
|
||
"id": 347564,
|
||
"client_id": "Iv1.6aaafe4fe882736b",
|
||
"slug": "coderabbitai",
|
||
"node_id": "A_kwHOB96YWc4ABU2s",
|
||
"owner": {
|
||
"login": "coderabbitai",
|
||
"id": 132028505,
|
||
"node_id": "O_kgDOB96YWQ",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/132028505?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/coderabbitai",
|
||
"html_url": "https://github.com/coderabbitai",
|
||
"followers_url": "https://api.github.com/users/coderabbitai/followers",
|
||
"following_url": "https://api.github.com/users/coderabbitai/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/coderabbitai/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/coderabbitai/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/coderabbitai/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/coderabbitai/orgs",
|
||
"repos_url": "https://api.github.com/users/coderabbitai/repos",
|
||
"events_url": "https://api.github.com/users/coderabbitai/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/coderabbitai/received_events",
|
||
"type": "Organization",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"name": "coderabbitai",
|
||
"description": "# Transforming Code Reviews with AI\r\n\r\n## Features\r\n\r\n**Automated Reviews**: Continuous reviews of the pull requests including incremental commits. \r\n\r\n**Summarization**: Generates high-level summary and a technical walkthrough of the PR changes. \r\n\r\n**Line-by-line review**: Provides line-by-line suggestions committable with one click.\r\n\r\n**Codebase verification**: Verifies the impact on the overall codebase and identifies missing changes.\r\n\r\n**Insights into your code**: Ask any questions on your codebase within the pull request \r\n\r\n**Chat about your code** : Chat with the bot around your code. The more you chat, the smarter it gets.\r\n\r\n**Issue Validation**: Validates the PR against the linked issues and identifies other related issues \r\n\r\n\r\n\r\n",
|
||
"external_url": "https://coderabbit.ai?utm_source=cr_app&utm_medium=github",
|
||
"html_url": "https://github.com/apps/coderabbitai",
|
||
"created_at": "2023-06-14T15:47:27Z",
|
||
"updated_at": "2026-03-14T07:58:44Z",
|
||
"permissions": {
|
||
"actions": "read",
|
||
"checks": "write",
|
||
"contents": "write",
|
||
"discussions": "read",
|
||
"issues": "write",
|
||
"members": "read",
|
||
"metadata": "read",
|
||
"pull_requests": "write",
|
||
"statuses": "write"
|
||
},
|
||
"events": [
|
||
"issues",
|
||
"issue_comment",
|
||
"label",
|
||
"organization",
|
||
"pull_request",
|
||
"pull_request_review",
|
||
"pull_request_review_comment",
|
||
"pull_request_review_thread",
|
||
"release",
|
||
"repository"
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944729363",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14433#issuecomment-3944729363",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14433",
|
||
"id": 3944729363,
|
||
"node_id": "IC_kwDOBLftOs7rH8sT",
|
||
"user": {
|
||
"login": "fadexadex",
|
||
"id": 118044106,
|
||
"node_id": "U_kgDOBwk1yg",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/118044106?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/fadexadex",
|
||
"html_url": "https://github.com/fadexadex",
|
||
"followers_url": "https://api.github.com/users/fadexadex/followers",
|
||
"following_url": "https://api.github.com/users/fadexadex/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/fadexadex/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/fadexadex/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/fadexadex/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/fadexadex/orgs",
|
||
"repos_url": "https://api.github.com/users/fadexadex/repos",
|
||
"events_url": "https://api.github.com/users/fadexadex/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/fadexadex/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-02-23T13:15:33Z",
|
||
"updated_at": "2026-02-23T13:15:33Z",
|
||
"body": "I have read the CLA Document and I hereby sign the CLA",
|
||
"author_association": "NONE",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944729363/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": null
|
||
},
|
||
{
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944826608",
|
||
"html_url": "https://github.com/laurent22/joplin/pull/14433#issuecomment-3944826608",
|
||
"issue_url": "https://api.github.com/repos/laurent22/joplin/issues/14433",
|
||
"id": 3944826608,
|
||
"node_id": "IC_kwDOBLftOs7rIUbw",
|
||
"user": {
|
||
"login": "laurent22",
|
||
"id": 1285584,
|
||
"node_id": "MDQ6VXNlcjEyODU1ODQ=",
|
||
"avatar_url": "https://avatars.githubusercontent.com/u/1285584?v=4",
|
||
"gravatar_id": "",
|
||
"url": "https://api.github.com/users/laurent22",
|
||
"html_url": "https://github.com/laurent22",
|
||
"followers_url": "https://api.github.com/users/laurent22/followers",
|
||
"following_url": "https://api.github.com/users/laurent22/following{/other_user}",
|
||
"gists_url": "https://api.github.com/users/laurent22/gists{/gist_id}",
|
||
"starred_url": "https://api.github.com/users/laurent22/starred{/owner}{/repo}",
|
||
"subscriptions_url": "https://api.github.com/users/laurent22/subscriptions",
|
||
"organizations_url": "https://api.github.com/users/laurent22/orgs",
|
||
"repos_url": "https://api.github.com/users/laurent22/repos",
|
||
"events_url": "https://api.github.com/users/laurent22/events{/privacy}",
|
||
"received_events_url": "https://api.github.com/users/laurent22/received_events",
|
||
"type": "User",
|
||
"user_view_type": "public",
|
||
"site_admin": false
|
||
},
|
||
"created_at": "2026-02-23T13:35:18Z",
|
||
"updated_at": "2026-02-23T13:35:18Z",
|
||
"body": "Thanks for the submission.\r\n\r\nWe’re closing this PR because it is too large in scope for the GSoC application phase. At this stage, we expect small, focused contributions (bug fixes or limited features) so we can properly assess your skills and approach.\r\n\r\nPRs that attempt to tackle broad or complex changes are not appropriate for this phase and are unlikely to be reviewed.\r\n\r\nAdditionally the issue this PR is based on is underspecified.",
|
||
"author_association": "OWNER",
|
||
"reactions": {
|
||
"url": "https://api.github.com/repos/laurent22/joplin/issues/comments/3944826608/reactions",
|
||
"total_count": 0,
|
||
"+1": 0,
|
||
"-1": 0,
|
||
"laugh": 0,
|
||
"hooray": 0,
|
||
"confused": 0,
|
||
"heart": 0,
|
||
"rocket": 0,
|
||
"eyes": 0
|
||
},
|
||
"performed_via_github_app": null
|
||
}
|
||
]
|
||
} |