Write the forge's name as OxygenHub in everything people read 092b8bf9f2ac
- Author
- Andy McCall @andymccall <[email protected]>
- When
- · 2026-09-28 11:16 UTC
- Signature
- ✔ signed by Andy McCall
- Hash
092b8bf9f2acaf35cfa9afe209d25235f9ad08b4f3a7e3471fb7263e174f521e- Depends on
- 1cc0ff44e5ca 486c15b00314 52cef00143db 6e249bbf7777 95f69b4a3ac2 b2dd082c57e4 bf73998c5198 f0b06deac4b9
- Depended on by
- 991516a107fa d21a85954a34 85a87a2d7d5b d41ae0fdfae6 d8ac8f93fd34 b03ac49048d6 d8c9bdc51ee0 bd69712343d2 b1047516e064 263de209e5ba 5888949525ec e04950748142 426ddc5039b5
- In bookmarks
- main
- In tags
- v0.10.0 v0.10.1 v0.10.2 v0.11.0 v0.11.1 v0.11.2 v0.13.0
- Edits
- 88 atoms, 0 tree operations, 14 files
Browse the tree at this change
modified CHANGELOG.md +6 −2
| 1 | 1 | # Changelog |
|
| 2 | 2 | ||
| 3 | + | ## 0.6.1 |
|
| 4 | + | ||
| 5 | + | - The name is written OxygenHub throughout. |
|
| 6 | + | ||
| 3 | 7 | ## 0.6.0 |
|
| 4 | 8 | ||
| 5 | 9 | - A **Releases** view: each repository's releases with their assets and source archives, to open or download. |
|
| … | 13 unchanged lines |
||
| 19 | 23 | ||
| 20 | 24 | - A bell in the status bar with your unread notifications across every hub you are signed in to, and a message when new ones arrive (`oxygenhub.announceNotifications`). |
|
| 21 | 25 | - **Open Inbox**: your notifications, unread first; pick one to mark it read and open it, in the editor for proposals and issues of your workspace's repositories. Mark all as read from the top of the list. |
|
| 22 | - | - Needs Oxygenhub with the notifications API (2026-09-28) and a token with `user:read`. |
|
| 26 | + | - Needs OxygenHub with the notifications API (2026-09-28) and a token with `user:read`. |
|
| 23 | 27 | ||
| 24 | 28 | ## 0.2.0 |
|
| 25 | 29 | ||
| 26 | 30 | - Proposals expand to their changed files. Click one to open it in VS Code's diff editor: the target's state against the projected state, straight from the hub, no checkout needed. |
|
| 27 | 31 | - **View Changes** on a proposal (inline button, or in the detail) opens every file in one multi-file diff editor. |
|
| 28 | 32 | - Review threads appear in those diff editors on the projected side, and new comments there are anchored to the line's atom on the hub. |
|
| 29 | - | - Needs Oxygenhub with the proposal files and content API (2026-09-28). |
|
| 33 | + | - Needs OxygenHub with the proposal files and content API (2026-09-28). |
|
| 30 | 34 | ||
| 31 | 35 | ## 0.1.2 |
|
| 32 | 36 | ||
| … | 17 unchanged lines |
modified README.md +2 −2
| 1 | - | # Oxygenhub for Visual Studio Code |
|
| 1 | + | # OxygenHub for Visual Studio Code |
|
| 2 | 2 | ||
| 3 | - | Proposals, reviews, issues and checks from an Oxygenhub in |
|
| 3 | + | Proposals, reviews, issues and checks from an OxygenHub in |
|
| 4 | 4 | the editor, built on the Oxygen extension the way the |
|
| 5 | 5 | GitHub Pull Requests extension builds on the built-in Git extension. The |
|
| 6 | 6 | specification is docs/spec.md in the repository. |
|
| … | 14 unchanged lines |
modified docs/spec.md +6 −6
| 1 | - | # Oxygenhub for Visual Studio Code |
|
| 1 | + | # OxygenHub for Visual Studio Code |
|
| 2 | 2 | ||
| 3 | 3 | | | | |
|
| 4 | 4 | |---|---| |
|
| 5 | 5 | | **Status** | Draft 0.1 | |
|
| 6 | - | | **Scope** | The forge in the editor: sign in to an Oxygenhub, see and review proposals with comments anchored to atoms, approve with a seal, land, work with issues, watch checks, and open anything on the hub. The counterpart of the GitHub Pull Requests and Issues extension. | |
|
| 7 | - | | **Depends on** | `oxygen-vscode` ≥ 0.7.0 (its exported API and remote providers), Oxygenhub ≥ 0.5 (`/api/v1`), `oxy` with `seal --proposal` and `proposal land` | |
|
| 6 | + | | **Scope** | The forge in the editor: sign in to an OxygenHub, see and review proposals with comments anchored to atoms, approve with a seal, land, work with issues, watch checks, and open anything on the hub. The counterpart of the GitHub Pull Requests and Issues extension. | |
|
| 7 | + | | **Depends on** | `oxygen-vscode` ≥ 0.7.0 (its exported API and remote providers), OxygenHub ≥ 0.5 (`/api/v1`), `oxy` with `seal --proposal` and `proposal land` | |
|
| 8 | 8 | | **Date** | 2026-09-27 | |
|
| 9 | 9 | ||
| 10 | 10 | ## 1. Goals |
|
| … | 7 unchanged lines |
||
| 18 | 18 | ||
| 19 | 19 | ## 2. How it compares |
|
| 20 | 20 | ||
| 21 | - | | GitHub Pull Requests and Issues | Oxygenhub for VS Code | |
|
| 21 | + | | GitHub Pull Requests and Issues | OxygenHub for VS Code | |
|
| 22 | 22 | |---|---| |
|
| 23 | 23 | | Sign in with GitHub (OAuth) | Sign in with a personal access token; an authentication provider `oxygenhub` other extensions can request | |
|
| 24 | 24 | | Pull Requests view: waiting for my review, created by me, all | Proposals view: **Assigned to me** (review requested or approval needed), **Mine**, **Open**, per repository | |
|
| … | 28 unchanged lines |
||
| 53 | 53 | ||
| 54 | 54 | ## 5. Proposals |
|
| 55 | 55 | ||
| 56 | - | The **Oxygenhub: Proposals** view lists, per repository that has a hub remote, proposals in three groups: needing me (open, not mine, where I have not approved or where my approval is pending a seal), mine, and other open ones. Each row shows number, title, author, target, state chips (draft, conflicted, landable) and the check summary. Actions: open detail, open on hub, check out, review (comment / request changes / approve), seal approval, land, close. |
|
| 56 | + | The **OxygenHub: Proposals** view lists, per repository that has a hub remote, proposals in three groups: needing me (open, not mine, where I have not approved or where my approval is pending a seal), mine, and other open ones. Each row shows number, title, author, target, state chips (draft, conflicted, landable) and the check summary. Actions: open detail, open on hub, check out, review (comment / request changes / approve), seal approval, land, close. |
|
| 57 | 57 | ||
| 58 | 58 | **Detail** is a webview: description, blockers, approvals (sealed or pending), checks, the changes list with signatures, and buttons for the actions. **Check out** fetches from the hub remote and sets a local bookmark `proposal/N` to the projected heads, then switches to it, so the files in the editor are the projected state; review threads then appear in place. |
|
| 59 | 59 | ||
| … | 17 unchanged lines |
||
| 77 | 77 | ||
| 78 | 78 | ## 8. Issues |
|
| 79 | 79 | ||
| 80 | - | The **Oxygenhub: Issues** view lists open issues per repository (assigned to me first). Actions: open detail (webview with the timeline and a comment box), open on hub, create issue (title and body inputs), close, reopen, assign to me. |
|
| 80 | + | The **OxygenHub: Issues** view lists open issues per repository (assigned to me first). Actions: open detail (webview with the timeline and a comment box), open on hub, create issue (title and body inputs), close, reopen, assign to me. |
|
| 81 | 81 | ||
| 82 | 82 | ### 8.1 Issues from the editor |
|
| 83 | 83 | ||
| … | 33 unchanged lines |
modified package.json +32 −32
| 1 | 1 | { |
|
| 2 | 2 | "name": "oxygenhub-vscode", |
|
| 3 | - | "displayName": "Oxygenhub", |
|
| 4 | - | "description": "Proposals, reviews, issues and checks from an Oxygenhub, in the editor. Builds on the Oxygen extension.", |
|
| 5 | - | "version": "0.6.0", |
|
| 3 | + | "displayName": "OxygenHub", |
|
| 4 | + | "description": "Proposals, reviews, issues and checks from an OxygenHub, in the editor. Builds on the Oxygen extension.", |
|
| 5 | + | "version": "0.6.1", |
|
| 6 | 6 | "publisher": "andymccall", |
|
| 7 | 7 | "license": "MIT OR Apache-2.0", |
|
| 8 | 8 | "icon": "assets/images/oxygenhub.png", |
|
| … | 24 unchanged lines |
||
| 33 | 33 | "authentication": [ |
|
| 34 | 34 | { |
|
| 35 | 35 | "id": "oxygenhub", |
|
| 36 | - | "label": "Oxygenhub" |
|
| 36 | + | "label": "OxygenHub" |
|
| 37 | 37 | } |
|
| 38 | 38 | ], |
|
| 39 | 39 | "configuration": { |
|
| 40 | - | "title": "Oxygenhub", |
|
| 40 | + | "title": "OxygenHub", |
|
| 41 | 41 | "properties": { |
|
| 42 | 42 | "oxygenhub.hubs": { |
|
| 43 | 43 | "type": "array", |
|
| … | 24 unchanged lines |
||
| 68 | 68 | "activitybar": [ |
|
| 69 | 69 | { |
|
| 70 | 70 | "id": "oxygenhub", |
|
| 71 | - | "title": "Oxygenhub", |
|
| 71 | + | "title": "OxygenHub", |
|
| 72 | 72 | "icon": "assets/images/oxygenhub-activity.svg" |
|
| 73 | 73 | } |
|
| 74 | 74 | ] |
|
| … | 17 unchanged lines |
||
| 92 | 92 | "viewsWelcome": [ |
|
| 93 | 93 | { |
|
| 94 | 94 | "view": "oxygenhub.proposals", |
|
| 95 | - | "contents": "Sign in to an Oxygenhub to see proposals.\n[Sign in](command:oxygenhub.signIn)" |
|
| 95 | + | "contents": "Sign in to an OxygenHub to see proposals.\n[Sign in](command:oxygenhub.signIn)" |
|
| 96 | 96 | } |
|
| 97 | 97 | ], |
|
| 98 | 98 | "commands": [ |
|
| 99 | 99 | { |
|
| 100 | 100 | "command": "oxygenhub.signIn", |
|
| 101 | 101 | "title": "Sign in", |
|
| 102 | - | "category": "Oxygenhub" |
|
| 102 | + | "category": "OxygenHub" |
|
| 103 | 103 | }, |
|
| 104 | 104 | { |
|
| 105 | 105 | "command": "oxygenhub.signOut", |
|
| 106 | 106 | "title": "Sign out", |
|
| 107 | - | "category": "Oxygenhub" |
|
| 107 | + | "category": "OxygenHub" |
|
| 108 | 108 | }, |
|
| 109 | 109 | { |
|
| 110 | 110 | "command": "oxygenhub.refresh", |
|
| 111 | 111 | "title": "Refresh", |
|
| 112 | - | "category": "Oxygenhub", |
|
| 112 | + | "category": "OxygenHub", |
|
| 113 | 113 | "icon": "$(refresh)" |
|
| 114 | 114 | }, |
|
| 115 | 115 | { |
|
| 116 | 116 | "command": "oxygenhub.inbox", |
|
| 117 | 117 | "title": "Open Inbox", |
|
| 118 | - | "category": "Oxygenhub", |
|
| 118 | + | "category": "OxygenHub", |
|
| 119 | 119 | "icon": "$(bell)" |
|
| 120 | 120 | }, |
|
| 121 | 121 | { |
|
| 122 | 122 | "command": "oxygenhub.openProposal", |
|
| 123 | 123 | "title": "Open Proposal", |
|
| 124 | - | "category": "Oxygenhub" |
|
| 124 | + | "category": "OxygenHub" |
|
| 125 | 125 | }, |
|
| 126 | 126 | { |
|
| 127 | 127 | "command": "oxygenhub.openOnHub", |
|
| 128 | 128 | "title": "Open on Hub", |
|
| 129 | - | "category": "Oxygenhub", |
|
| 129 | + | "category": "OxygenHub", |
|
| 130 | 130 | "icon": "$(link-external)" |
|
| 131 | 131 | }, |
|
| 132 | 132 | { |
|
| 133 | 133 | "command": "oxygenhub.openProposalFile", |
|
| 134 | 134 | "title": "Open Proposal File Diff", |
|
| 135 | - | "category": "Oxygenhub" |
|
| 135 | + | "category": "OxygenHub" |
|
| 136 | 136 | }, |
|
| 137 | 137 | { |
|
| 138 | 138 | "command": "oxygenhub.openProposalChanges", |
|
| 139 | 139 | "title": "View Changes", |
|
| 140 | - | "category": "Oxygenhub", |
|
| 140 | + | "category": "OxygenHub", |
|
| 141 | 141 | "icon": "$(diff-multiple)" |
|
| 142 | 142 | }, |
|
| 143 | 143 | { |
|
| 144 | 144 | "command": "oxygenhub.checkoutProposal", |
|
| 145 | 145 | "title": "Check Out Proposal", |
|
| 146 | - | "category": "Oxygenhub", |
|
| 146 | + | "category": "OxygenHub", |
|
| 147 | 147 | "icon": "$(git-branch)" |
|
| 148 | 148 | }, |
|
| 149 | 149 | { |
|
| 150 | 150 | "command": "oxygenhub.review", |
|
| 151 | 151 | "title": "Review\u2026", |
|
| 152 | - | "category": "Oxygenhub", |
|
| 152 | + | "category": "OxygenHub", |
|
| 153 | 153 | "icon": "$(comment-discussion)" |
|
| 154 | 154 | }, |
|
| 155 | 155 | { |
|
| 156 | 156 | "command": "oxygenhub.sealApproval", |
|
| 157 | 157 | "title": "Seal My Approval (oxy seal --proposal)", |
|
| 158 | - | "category": "Oxygenhub" |
|
| 158 | + | "category": "OxygenHub" |
|
| 159 | 159 | }, |
|
| 160 | 160 | { |
|
| 161 | 161 | "command": "oxygenhub.land", |
|
| 162 | 162 | "title": "Land Proposal", |
|
| 163 | - | "category": "Oxygenhub" |
|
| 163 | + | "category": "OxygenHub" |
|
| 164 | 164 | }, |
|
| 165 | 165 | { |
|
| 166 | 166 | "command": "oxygenhub.closeProposal", |
|
| 167 | 167 | "title": "Close Proposal", |
|
| 168 | - | "category": "Oxygenhub" |
|
| 168 | + | "category": "OxygenHub" |
|
| 169 | 169 | }, |
|
| 170 | 170 | { |
|
| 171 | 171 | "command": "oxygenhub.createProposal", |
|
| 172 | 172 | "title": "Propose Current Bookmark\u2026", |
|
| 173 | - | "category": "Oxygenhub" |
|
| 173 | + | "category": "OxygenHub" |
|
| 174 | 174 | }, |
|
| 175 | 175 | { |
|
| 176 | 176 | "command": "oxygenhub.newIssue", |
|
| 177 | 177 | "title": "New Issue\u2026", |
|
| 178 | - | "category": "Oxygenhub", |
|
| 178 | + | "category": "OxygenHub", |
|
| 179 | 179 | "icon": "$(add)" |
|
| 180 | 180 | }, |
|
| 181 | 181 | { |
|
| 182 | 182 | "command": "oxygenhub.draftRelease", |
|
| 183 | 183 | "title": "Draft Release\u2026", |
|
| 184 | - | "category": "Oxygenhub", |
|
| 184 | + | "category": "OxygenHub", |
|
| 185 | 185 | "icon": "$(tag)" |
|
| 186 | 186 | }, |
|
| 187 | 187 | { |
|
| 188 | 188 | "command": "oxygenhub.issueFromSelection", |
|
| 189 | 189 | "title": "New Issue from Selection\u2026", |
|
| 190 | - | "category": "Oxygenhub" |
|
| 190 | + | "category": "OxygenHub" |
|
| 191 | 191 | }, |
|
| 192 | 192 | { |
|
| 193 | 193 | "command": "oxygenhub.openIssue", |
|
| 194 | 194 | "title": "Open Issue", |
|
| 195 | - | "category": "Oxygenhub" |
|
| 195 | + | "category": "OxygenHub" |
|
| 196 | 196 | }, |
|
| 197 | 197 | { |
|
| 198 | 198 | "command": "oxygenhub.commentIssue", |
|
| 199 | 199 | "title": "Comment on Issue\u2026", |
|
| 200 | - | "category": "Oxygenhub" |
|
| 200 | + | "category": "OxygenHub" |
|
| 201 | 201 | }, |
|
| 202 | 202 | { |
|
| 203 | 203 | "command": "oxygenhub.closeIssue", |
|
| 204 | 204 | "title": "Close Issue", |
|
| 205 | - | "category": "Oxygenhub" |
|
| 205 | + | "category": "OxygenHub" |
|
| 206 | 206 | }, |
|
| 207 | 207 | { |
|
| 208 | 208 | "command": "oxygenhub.reopenIssue", |
|
| 209 | 209 | "title": "Reopen Issue", |
|
| 210 | - | "category": "Oxygenhub" |
|
| 210 | + | "category": "OxygenHub" |
|
| 211 | 211 | }, |
|
| 212 | 212 | { |
|
| 213 | 213 | "command": "oxygenhub.assignMe", |
|
| 214 | 214 | "title": "Assign to Me", |
|
| 215 | - | "category": "Oxygenhub" |
|
| 215 | + | "category": "OxygenHub" |
|
| 216 | 216 | }, |
|
| 217 | 217 | { |
|
| 218 | 218 | "command": "oxygenhub.newThread", |
|
| 219 | 219 | "title": "Start Review Thread", |
|
| 220 | - | "category": "Oxygenhub" |
|
| 220 | + | "category": "OxygenHub" |
|
| 221 | 221 | }, |
|
| 222 | 222 | { |
|
| 223 | 223 | "command": "oxygenhub.reply", |
|
| 224 | 224 | "title": "Reply", |
|
| 225 | - | "category": "Oxygenhub" |
|
| 225 | + | "category": "OxygenHub" |
|
| 226 | 226 | }, |
|
| 227 | 227 | { |
|
| 228 | 228 | "command": "oxygenhub.resolveThread", |
|
| 229 | 229 | "title": "Resolve", |
|
| 230 | - | "category": "Oxygenhub" |
|
| 230 | + | "category": "OxygenHub" |
|
| 231 | 231 | } |
|
| 232 | 232 | ], |
|
| 233 | 233 | "menus": { |
|
| … | 141 unchanged lines |
modified src/auth.ts +2 −2
| … | 15 unchanged lines |
||
| 16 | 16 | private readonly disposables: vscode.Disposable[] = []; |
|
| 17 | 17 | ||
| 18 | 18 | constructor(private readonly secrets: vscode.SecretStorage) { |
|
| 19 | - | this.disposables.push(vscode.authentication.registerAuthenticationProvider("oxygenhub", "Oxygenhub", this, { supportsMultipleAccounts: true })); |
|
| 19 | + | this.disposables.push(vscode.authentication.registerAuthenticationProvider("oxygenhub", "OxygenHub", this, { supportsMultipleAccounts: true })); |
|
| 20 | 20 | } |
|
| 21 | 21 | ||
| 22 | 22 | async load(): Promise<void> { |
|
| … | 64 unchanged lines |
||
| 87 | 87 | try { |
|
| 88 | 88 | username = (await client.me()).username; |
|
| 89 | 89 | } catch (e) { |
|
| 90 | - | const pick = await vscode.window.showWarningMessage(`Oxygenhub: could not read your account (${(e as Error).message}); the token may lack user:read. Keep it anyway?`, "Keep", "Cancel"); |
|
| 90 | + | const pick = await vscode.window.showWarningMessage(`OxygenHub: could not read your account (${(e as Error).message}); the token may lack user:read. Keep it anyway?`, "Keep", "Cancel"); |
|
| 91 | 91 | if (pick !== "Keep") { |
|
| 92 | 92 | return undefined; |
|
| 93 | 93 | } |
|
| … | 12 unchanged lines |
modified src/diff.ts +2 −2
| … | 37 unchanged lines |
||
| 38 | 38 | try { |
|
| 39 | 39 | return (await this.auth.clientFor(r.base).proposalContent(r.owner, r.name, r.number, r.side, r.path)) ?? ""; |
|
| 40 | 40 | } catch (e) { |
|
| 41 | - | void vscode.window.showWarningMessage(`Oxygenhub: could not load ${r.path}: ${(e as Error).message}`); |
|
| 41 | + | void vscode.window.showWarningMessage(`OxygenHub: could not load ${r.path}: ${(e as Error).message}`); |
|
| 42 | 42 | return ""; |
|
| 43 | 43 | } |
|
| 44 | 44 | } |
|
| … | 27 unchanged lines |
||
| 72 | 72 | /** Every file of a proposal in one multi-file diff editor. */ |
|
| 73 | 73 | export async function openAllChanges(repo: RepoRef, p: api.Proposal, files: api.ProposalFile[]): Promise<void> { |
|
| 74 | 74 | if (!files.length) { |
|
| 75 | - | void vscode.window.showInformationMessage(`Oxygenhub: #${p.number} changes no files.`); |
|
| 75 | + | void vscode.window.showInformationMessage(`OxygenHub: #${p.number} changes no files.`); |
|
| 76 | 76 | return; |
|
| 77 | 77 | } |
|
| 78 | 78 | const resources = files.map((f) => { |
|
| … | 5 unchanged lines |
modified src/extension.ts +17 −17
| … | 34 unchanged lines |
||
| 35 | 35 | const ext = vscode.extensions.getExtension<OxygenAPI>("oxygen.oxygen-vscode"); |
|
| 36 | 36 | oxygen = ext ? ((await ext.activate()) as OxygenAPI | undefined) : undefined; |
|
| 37 | 37 | if (!oxygen) { |
|
| 38 | - | void vscode.window.showWarningMessage("Oxygenhub: the Oxygen extension is not available; install oxygen.oxygen-vscode 0.7.0 or later."); |
|
| 38 | + | void vscode.window.showWarningMessage("OxygenHub: the Oxygen extension is not available; install oxygen.oxygen-vscode 0.7.0 or later."); |
|
| 39 | 39 | } else { |
|
| 40 | 40 | context.subscriptions.push(oxygen.registerRemoteProvider(makeProvider({ bases: () => auth.bases() }))); |
|
| 41 | 41 | context.subscriptions.push(oxygen.onDidChangeRepositories(() => refreshAll())); |
|
| … | 55 unchanged lines |
||
| 97 | 97 | const r = await draftRelease(auth, repo); |
|
| 98 | 98 | if (r) { |
|
| 99 | 99 | releases.refresh(); |
|
| 100 | - | const open = await vscode.window.showInformationMessage(`Oxygenhub: released ${r.tag}.`, "Open on Hub"); |
|
| 100 | + | const open = await vscode.window.showInformationMessage(`OxygenHub: released ${r.tag}.`, "Open on Hub"); |
|
| 101 | 101 | if (open) { |
|
| 102 | 102 | void vscode.env.openExternal(vscode.Uri.parse(r.url)); |
|
| 103 | 103 | } |
|
| 104 | 104 | } |
|
| 105 | 105 | } catch (e) { |
|
| 106 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 106 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 107 | 107 | } |
|
| 108 | 108 | }), |
|
| 109 | 109 | vscode.commands.registerCommand("oxygenhub.openProposal", async (node?: ProposalNode) => { |
|
| … | 23 unchanged lines |
||
| 133 | 133 | await openAllChanges(repo, p, files); |
|
| 134 | 134 | await review.loadDiff(repo, number); |
|
| 135 | 135 | } catch (e) { |
|
| 136 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 136 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 137 | 137 | } |
|
| 138 | 138 | }), |
|
| 139 | 139 | ), |
|
| … | 23 unchanged lines |
||
| 163 | 163 | vscode.commands.registerCommand("oxygenhub.reopenIssue", (...args: unknown[]) => withIssue(args, async (repo, number) => (await auth.clientFor(repo.base).setIssueState(repo.owner, repo.name, number, "open"), issues.refresh()))), |
|
| 164 | 164 | vscode.commands.registerCommand("oxygenhub.assignMe", (...args: unknown[]) => |
|
| 165 | 165 | withIssue(args, async (repo, number) => { |
|
| 166 | - | void vscode.window.showInformationMessage(`Oxygenhub: assigning is on the hub for now: ${hubUrl(repo.base, repo.owner, repo.name, { kind: "issue", number })}`); |
|
| 166 | + | void vscode.window.showInformationMessage(`OxygenHub: assigning is on the hub for now: ${hubUrl(repo.base, repo.owner, repo.name, { kind: "issue", number })}`); |
|
| 167 | 167 | }), |
|
| 168 | 168 | ), |
|
| 169 | 169 | vscode.commands.registerCommand("oxygenhub.reply", (reply: vscode.CommentReply) => review.reply(reply)), |
|
| … | 88 unchanged lines |
||
| 258 | 258 | } |
|
| 259 | 259 | ||
| 260 | 260 | function runInTerminal(repo: HubRepo, command: string): Promise<void> { |
|
| 261 | - | const t = vscode.window.createTerminal({ name: "Oxygenhub", cwd: repo.handle.root }); |
|
| 261 | + | const t = vscode.window.createTerminal({ name: "OxygenHub", cwd: repo.handle.root }); |
|
| 262 | 262 | t.show(); |
|
| 263 | 263 | t.sendText(command); |
|
| 264 | 264 | return Promise.resolve(); |
|
| … | 14 unchanged lines |
||
| 279 | 279 | await repo.handle.json(["bookmark", "switch", bookmark, "--json"]); |
|
| 280 | 280 | await repo.handle.refresh(); |
|
| 281 | 281 | await review.load(repo, number); |
|
| 282 | - | void vscode.window.showInformationMessage(`Oxygenhub: checked out #${number} as ${bookmark}; review threads are in place.`); |
|
| 282 | + | void vscode.window.showInformationMessage(`OxygenHub: checked out #${number} as ${bookmark}; review threads are in place.`); |
|
| 283 | 283 | } catch (e) { |
|
| 284 | - | void vscode.window.showErrorMessage(`Oxygenhub: could not check out #${number}: ${(e as Error).message}`); |
|
| 284 | + | void vscode.window.showErrorMessage(`OxygenHub: could not check out #${number}: ${(e as Error).message}`); |
|
| 285 | 285 | } |
|
| 286 | 286 | } |
|
| 287 | 287 | ||
| … | 13 unchanged lines |
||
| 301 | 301 | try { |
|
| 302 | 302 | await auth.clientFor(repo.base).review(repo.owner, repo.name, number, verdict.value, body); |
|
| 303 | 303 | } catch (e) { |
|
| 304 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 304 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 305 | 305 | return; |
|
| 306 | 306 | } |
|
| 307 | 307 | proposals.refresh(); |
|
| … | 13 unchanged lines |
||
| 321 | 321 | } |
|
| 322 | 322 | const source = repo.handle.currentBookmark; |
|
| 323 | 323 | if (!source) { |
|
| 324 | - | void vscode.window.showWarningMessage("Oxygenhub: no current bookmark."); |
|
| 324 | + | void vscode.window.showWarningMessage("OxygenHub: no current bookmark."); |
|
| 325 | 325 | return; |
|
| 326 | 326 | } |
|
| 327 | 327 | const remoteBookmarks = await auth.clientFor(repo.base).bookmarks(repo.owner, repo.name).catch(() => []); |
|
| … | 11 unchanged lines |
||
| 339 | 339 | proposals.refresh(); |
|
| 340 | 340 | void vscode.env.openExternal(vscode.Uri.parse(p.url)); |
|
| 341 | 341 | } catch (e) { |
|
| 342 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 342 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 343 | 343 | } |
|
| 344 | 344 | } |
|
| 345 | 345 | ||
| … | 11 unchanged lines |
||
| 357 | 357 | try { |
|
| 358 | 358 | const i = await auth.clientFor(repo.base).createIssue(repo.owner, repo.name, title, body); |
|
| 359 | 359 | issues.refresh(); |
|
| 360 | - | void vscode.window.showInformationMessage(`Oxygenhub: opened #${i.number}.`); |
|
| 360 | + | void vscode.window.showInformationMessage(`OxygenHub: opened #${i.number}.`); |
|
| 361 | 361 | } catch (e) { |
|
| 362 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 362 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 363 | 363 | } |
|
| 364 | 364 | } |
|
| 365 | 365 | ||
| … | 5 unchanged lines |
||
| 371 | 371 | async function issueFromSelection(): Promise<void> { |
|
| 372 | 372 | const editor = vscode.window.activeTextEditor; |
|
| 373 | 373 | if (!editor || editor.document.uri.scheme !== "file") { |
|
| 374 | - | void vscode.window.showWarningMessage("Oxygenhub: open a file of the repository first."); |
|
| 374 | + | void vscode.window.showWarningMessage("OxygenHub: open a file of the repository first."); |
|
| 375 | 375 | return; |
|
| 376 | 376 | } |
|
| 377 | 377 | const doc = editor.document; |
|
| 378 | 378 | const file = doc.uri.fsPath; |
|
| 379 | 379 | const repo = (await proposals.repos()).filter((r) => file.startsWith(r.handle.root + "/") || file.startsWith(r.handle.root + "\\")).sort((a, b) => b.handle.root.length - a.handle.root.length)[0]; |
|
| 380 | 380 | if (!repo) { |
|
| 381 | - | void vscode.window.showWarningMessage("Oxygenhub: this file is not in a repository with a hub remote."); |
|
| 381 | + | void vscode.window.showWarningMessage("OxygenHub: this file is not in a repository with a hub remote."); |
|
| 382 | 382 | return; |
|
| 383 | 383 | } |
|
| 384 | 384 | const sel = editor.selection; |
|
| … | 21 unchanged lines |
||
| 406 | 406 | const line = doc.lineAt(todoLine); |
|
| 407 | 407 | const annotated = annotateTodo(line.text, issue.number); |
|
| 408 | 408 | if (annotated !== line.text) { |
|
| 409 | - | const pick = await vscode.window.showInformationMessage(`Oxygenhub: opened #${issue.number}. Record it in the TODO?`, "Add (#" + issue.number + ")"); |
|
| 409 | + | const pick = await vscode.window.showInformationMessage(`OxygenHub: opened #${issue.number}. Record it in the TODO?`, "Add (#" + issue.number + ")"); |
|
| 410 | 410 | if (pick) { |
|
| 411 | 411 | await editor.edit((e) => e.replace(line.range, annotated)); |
|
| 412 | 412 | } |
|
| … | 1 unchanged lines |
||
| 414 | 414 | } |
|
| 415 | 415 | await showIssue(auth, repo, issue); |
|
| 416 | 416 | } catch (e) { |
|
| 417 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 417 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 418 | 418 | } |
|
| 419 | 419 | } |
|
| 420 | 420 | ||
| … | 1 unchanged lines |
modified src/hubapi.d.ts +1 −1
| 1 | 1 | // Generated by `cargo run -p hub-api --bin hub-api-typescript`; do not edit. |
|
| 2 | - | // Types of the Oxygenhub JSON API (hub spec §12.1). |
|
| 2 | + | // Types of the OxygenHub JSON API (hub spec §12.1). |
|
| 3 | 3 | ||
| 4 | 4 | export type Visibility = "public" | "internal" | "private"; |
|
| 5 | 5 | ||
| … | 406 unchanged lines |
modified src/inbox.ts +4 −4
| … | 26 unchanged lines |
||
| 27 | 27 | private readonly open: Opener, |
|
| 28 | 28 | ) { |
|
| 29 | 29 | this.item.command = "oxygenhub.inbox"; |
|
| 30 | - | this.item.name = "Oxygenhub notifications"; |
|
| 30 | + | this.item.name = "OxygenHub notifications"; |
|
| 31 | 31 | } |
|
| 32 | 32 | ||
| 33 | 33 | /** Every hub's inbox; hubs that fail (offline, token without user:read) are skipped. */ |
|
| … | 28 unchanged lines |
||
| 62 | 62 | if (announce && this.lastUnread !== undefined && unread > this.lastUnread) { |
|
| 63 | 63 | const newest = entries.find((e) => !e.n.read); |
|
| 64 | 64 | const more = unread - this.lastUnread; |
|
| 65 | - | const text = more === 1 && newest ? `Oxygenhub: ${newest.n.actor ? newest.n.actor + ": " : ""}${newest.n.title}` : `Oxygenhub: ${more} new notifications`; |
|
| 65 | + | const text = more === 1 && newest ? `OxygenHub: ${newest.n.actor ? newest.n.actor + ": " : ""}${newest.n.title}` : `OxygenHub: ${more} new notifications`; |
|
| 66 | 66 | void vscode.window.showInformationMessage(text, "Open Inbox").then((pick) => pick && vscode.commands.executeCommand("oxygenhub.inbox")); |
|
| 67 | 67 | } |
|
| 68 | 68 | this.lastUnread = unread; |
|
| … | 13 unchanged lines |
||
| 82 | 82 | items.unshift({ label: "$(check-all) Mark all as read", all: true, alwaysShow: true }); |
|
| 83 | 83 | } |
|
| 84 | 84 | if (!entries.length) { |
|
| 85 | - | void vscode.window.showInformationMessage("Oxygenhub: your inbox is empty."); |
|
| 85 | + | void vscode.window.showInformationMessage("OxygenHub: your inbox is empty."); |
|
| 86 | 86 | return; |
|
| 87 | 87 | } |
|
| 88 | - | const pick = await vscode.window.showQuickPick(items, { placeHolder: "Oxygenhub inbox", matchOnDescription: true, matchOnDetail: true }); |
|
| 88 | + | const pick = await vscode.window.showQuickPick(items, { placeHolder: "OxygenHub inbox", matchOnDescription: true, matchOnDetail: true }); |
|
| 89 | 89 | if (!pick) { |
|
| 90 | 90 | return; |
|
| 91 | 91 | } |
|
| … | 37 unchanged lines |
modified src/issues.ts +1 −1
| … | 48 unchanged lines |
||
| 49 | 49 | list.sort((a, b) => Number(b.assignees.includes(me ?? "")) - Number(a.assignees.includes(me ?? "")) || b.updated_ms - a.updated_ms); |
|
| 50 | 50 | return list.map((i) => ({ kind: "issue", repo: node.repo, i })); |
|
| 51 | 51 | } catch (e) { |
|
| 52 | - | void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 52 | + | void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 53 | 53 | return []; |
|
| 54 | 54 | } |
|
| 55 | 55 | } |
|
| … | 19 unchanged lines |
modified src/proposals.ts +2 −2
| … | 143 unchanged lines |
||
| 144 | 144 | try { |
|
| 145 | 145 | list = await this.proposalsOf(node.repo); |
|
| 146 | 146 | } catch (e) { |
|
| 147 | - | void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 147 | + | void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 148 | 148 | return []; |
|
| 149 | 149 | } |
|
| 150 | 150 | const me = this.auth.sessionFor(node.repo.base)?.username; |
|
| … | 14 unchanged lines |
||
| 165 | 165 | const files = await this.filesOf(node.repo, node.p); |
|
| 166 | 166 | return files.map((f) => ({ kind: "file", repo: node.repo, p: node.p, f })); |
|
| 167 | 167 | } catch (e) { |
|
| 168 | - | void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 168 | + | void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 169 | 169 | } |
|
| 170 | 170 | } |
|
| 171 | 171 | return []; |
|
| … | 28 unchanged lines |
modified src/provider.ts +1 −1
| … | 10 unchanged lines |
||
| 11 | 11 | export function makeProvider(hubs: KnownHubs) { |
|
| 12 | 12 | return { |
|
| 13 | 13 | id: "oxygenhub", |
|
| 14 | - | label: "Oxygenhub", |
|
| 14 | + | label: "OxygenHub", |
|
| 15 | 15 | matches(remoteUrl: string): boolean { |
|
| 16 | 16 | const p = parseRepoUrl(remoteUrl); |
|
| 17 | 17 | return !!p && hubs.bases().some((b) => b.replace(/\/$/, "") === p.base); |
|
| … | 7 unchanged lines |
modified src/releases.ts +2 −2
| … | 63 unchanged lines |
||
| 64 | 64 | const list = await this.auth.clientFor(node.repo.base).releases(node.repo.owner, node.repo.name); |
|
| 65 | 65 | return list.map((r) => ({ kind: "release", repo: node.repo, r })); |
|
| 66 | 66 | } catch (e) { |
|
| 67 | - | void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 67 | + | void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 68 | 68 | return []; |
|
| 69 | 69 | } |
|
| 70 | 70 | } |
|
| … | 17 unchanged lines |
||
| 88 | 88 | const released = new Set(releases.map((r) => r.tag)); |
|
| 89 | 89 | const open = tags.filter((t) => !released.has(t.name)); |
|
| 90 | 90 | if (!open.length) { |
|
| 91 | - | void vscode.window.showInformationMessage(`Oxygenhub: every tag of ${repo.owner}/${repo.name} has a release. Tag a state with \`oxy tag create\` and push it first.`); |
|
| 91 | + | void vscode.window.showInformationMessage(`OxygenHub: every tag of ${repo.owner}/${repo.name} has a release. Tag a state with \`oxy tag create\` and push it first.`); |
|
| 92 | 92 | return undefined; |
|
| 93 | 93 | } |
|
| 94 | 94 | const pick = await vscode.window.showQuickPick( |
|
| … | 26 unchanged lines |
modified src/review.ts +2 −2
| … | 15 unchanged lines |
||
| 16 | 16 | ||
| 17 | 17 | /** The hub's comments as threads on files under the repository root. */ |
|
| 18 | 18 | export class ReviewController implements vscode.Disposable { |
|
| 19 | - | private readonly controller = vscode.comments.createCommentController("oxygenhub", "Oxygenhub review"); |
|
| 19 | + | private readonly controller = vscode.comments.createCommentController("oxygenhub", "OxygenHub review"); |
|
| 20 | 20 | private threads: vscode.CommentThread[] = []; |
|
| 21 | 21 | private active: { repo: HubRepo; number: number } | undefined; |
|
| 22 | 22 | /** Threads in diff editors, per proposal (`base/owner/name#n`). */ |
|
| … | 89 unchanged lines |
||
| 112 | 112 | try { |
|
| 113 | 113 | await postLineComment(this.auth, repo, r.number, r.path, line, reply.text); |
|
| 114 | 114 | } catch (e) { |
|
| 115 | - | void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`); |
|
| 115 | + | void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`); |
|
| 116 | 116 | return; |
|
| 117 | 117 | } |
|
| 118 | 118 | // A new thread from the gutter is replaced by the hub's copy. |
|
| … | 39 unchanged lines |