diff --git a/package.json b/package.json index b01b7011f..42492c1f1 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "contribCommentEditorActionsMenu", "shareProvider", "quickDiffProvider", - "quickPickItemIcon" + "quickPickItemIcon", + "readonlyMessage" ], "version": "0.66.0", "publisher": "GitHub", @@ -949,6 +950,11 @@ "category": "%command.pull.request.category%", "icon": "$(comment)" }, + { + "command": "pr.checkoutFromReadonlyFile", + "title": "%command.pr.pick.title%", + "category": "%command.pull.request.category%" + }, { "command": "review.diffWithPrHead", "title": "%command.review.diffWithPrHead.title%", @@ -2349,7 +2355,7 @@ "@types/react-dom": "^16.8.2", "@types/sinon": "7.0.11", "@types/temp": "0.8.34", - "@types/vscode": "1.69.0", + "@types/vscode": "1.79.0", "@types/webpack-env": "^1.16.0", "@typescript-eslint/eslint-plugin": "4.18.0", "@typescript-eslint/parser": "4.18.0", diff --git a/src/@types/vscode.proposed.readonlyMessage.d.ts b/src/@types/vscode.proposed.readonlyMessage.d.ts new file mode 100644 index 000000000..19befbb81 --- /dev/null +++ b/src/@types/vscode.proposed.readonlyMessage.d.ts @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// https://github.com/microsoft/vscode/issues/166971 + +declare module 'vscode' { + + export namespace workspace { + + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options?: { readonly isCaseSensitive?: boolean; readonly isReadonly?: boolean | MarkdownString }): Disposable; + } +} diff --git a/src/commands.ts b/src/commands.ts index 6b72e5506..5f90d952d 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -13,7 +13,7 @@ import { IComment } from './common/comment'; import Logger from './common/logger'; import { FILE_LIST_LAYOUT, PR_SETTINGS_NAMESPACE } from './common/settingKeys'; import { ITelemetry } from './common/telemetry'; -import { asTempStorageURI, fromReviewUri, Schemes, toPRUri } from './common/uri'; +import { asTempStorageURI, fromPRUri, fromReviewUri, Schemes, toPRUri } from './common/uri'; import { formatError } from './common/utils'; import { EXTENSION_ID } from './constants'; import { FolderRepositoryManager } from './github/folderRepositoryManager'; @@ -511,6 +511,29 @@ export function registerCommands( }), ); + context.subscriptions.push(vscode.commands.registerCommand('pr.checkoutFromReadonlyFile', async () => { + const uri = vscode.window.activeTextEditor?.document.uri; + if (uri?.scheme !== Schemes.Pr) { + return; + } + const prUriPropserties = fromPRUri(uri); + if (prUriPropserties === undefined) { + return; + } + let githubRepository: GitHubRepository | undefined; + const folderManager = reposManager.folderManagers.find(folderManager => { + githubRepository = folderManager.gitHubRepositories.find(githubRepo => githubRepo.remote.remoteName === prUriPropserties.remoteName); + return !!githubRepository; + }); + if (!folderManager || !githubRepository) { + return; + } + const prModel = await folderManager.fetchById(githubRepository, Number(prUriPropserties.prNumber)); + if (prModel) { + return ReviewManager.getReviewManagerForFolderManager(reviewsManager.reviewManagers, folderManager)?.switch(prModel); + } + })); + context.subscriptions.push( vscode.commands.registerCommand('pr.pickOnVscodeDev', async (pr: PRNode | DescriptionNode | PullRequestModel) => { if (pr === undefined) { diff --git a/src/extension.ts b/src/extension.ts index 82ec90cdb..a47a1b003 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -368,7 +368,9 @@ async function deferredActivate(context: vscode.ExtensionContext, apiImpl: GitAp const reposManager = new RepositoriesManager(folderManagers, credentialStore, telemetry); context.subscriptions.push(reposManager); const inMemPRFileSystemProvider = getInMemPRFileSystemProvider({ reposManager, gitAPI: apiImpl, credentialStore })!; - context.subscriptions.push(vscode.workspace.registerFileSystemProvider(Schemes.Pr, inMemPRFileSystemProvider, { isReadonly: true })); + const readOnlyMessage = new vscode.MarkdownString(vscode.l10n.t('Cannot edit this pull request file. [Check out](command:pr.checkoutFromReadonlyFile) this pull request to edit.')); + readOnlyMessage.isTrusted = { enabledCommands: ['pr.checkoutFromReadonlyFile'] }; + context.subscriptions.push(vscode.workspace.registerFileSystemProvider(Schemes.Pr, inMemPRFileSystemProvider, { isReadonly: readOnlyMessage })); await init(context, apiImpl, credentialStore, repositories, prTree, liveshareApiPromise, showPRController, reposManager); } diff --git a/yarn.lock b/yarn.lock index f9a4aa9d4..67c22127a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -618,10 +618,10 @@ dependencies: "@types/node" "*" -"@types/vscode@1.69.0": - version "1.69.0" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.69.0.tgz#a472011af392fbcf82cbb82f60b4c239c21b921c" - integrity sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA== +"@types/vscode@1.79.0": + version "1.79.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.79.0.tgz#e2aed1bb3946ae2bebbc3b88020d0efe18f941a9" + integrity sha512-Tfowu2rSW8hVGbqzQLSPlOEiIOYYryTkgJ+chMecpYiJcnw9n0essvSiclnK+Qh/TcSVJHgaK4EMrQDZjZJ/Sw== "@types/webpack-env@^1.16.0": version "1.16.2"