resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.1.tgz#8118a32b02735dccd14f893b495fa5389ad7de79" integrity sha512-zQ5U/nuXAAMsh691FtV0wPz89nSkHbs+IQV8FDk+wew9BlSDhf4UmWGlWJfTR2Ti6xZv87Tj5fENzKf6Qk7aLw== <del> xterm-addon-canvas@0.2.0-beta.15: version "0.2.0-beta.15" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.2.0-beta.15.tgz#de863e46410b1de357b153abf1984227777760e4" integrity sha512-E1pNCDSVTINchwWLysZ9ZD/BPv1WLGV52xRHB00US1PHHELbhtvms+6dZ44WZEDXhtfpptRZ1VBx+QpvfJIuvw== xterm-addon-search@0.10.0-beta.3: version "0.10.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.10.0-beta.3.tgz#5194434d86105637c71f6f20139a9d0b5c1a956a" integrity sha512-UeGm/ymnp7HUYJJtsP0D+bljOWbdk3MctcLJ+0jv8AmU6YlAzJFtouvYSQrD5SAMyht5CRsvjzFgqic9X02JYg== xterm-addon-unicode11@0.4.0-beta.3: version "0.4.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== xterm-addon-webgl@0.13.0-beta.32: version "0.13.0-beta.32" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.13.0-beta.32.tgz#ae7335f788ae611733e03f6ca38280ab7b86d212" integrity sha512-xOudNzYXaRh9QZ+IigXM5EB3bM8l3/F8F35EpJRYvvsylVxiB6Km8X8l7+nxlWt+uYdnHZs0ka2rvtL8kOP/uw== xterm@5.0.0-beta.32: version "5.0.0-beta.32" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.0.0-beta.32.tgz#62bb9902429c0055fd2fd85c9eecfbf1756ed31c" integrity sha512-OAM1GaBs/chK63Cr86XbVhfVCLLXLpNxxFrv3RK9xoyb9dwiY3gaMxK9jeGzTnrbGLWJb+k5nxaC0rx2YsHvUA== </del> <ins> xterm-addon-canvas@0.2.0-beta.17: version "0.2.0-beta.17" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.2.0-beta.17.tgz#e84a86530b20bd3edcce16b4566f346cd186ab4d" integrity sha512-2ukPdCA92VTFYQRE56ylzvI3cfaQYDWd/Mc4jlEItI6sV/EA5RnUbbP+2sFIx0JlmHK6nVYXXNY2p6QRB7MRew== xterm-addon-search@0.10.0-beta.5: version "0.10.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.10.0-beta.5.tgz#a2cb16bda4ddf8783b80433155ad94f5822271f8" integrity sha512-kjog7cm1iEZ2XyQFVs3KAvoI2pKoX0cq2WWjL0FuXYXpKQ9vXmfrWSR7PiJ6zpTIRvr6UtaSGKhmZVHLNA79WA== xterm-addon-unicode11@0.4.0-beta.5: version "0.4.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.5.tgz#3900e66f10d2e506133b61d7421aab6878d32665" integrity sha512-+g+fuxAd/tkCEJ/jhdnebXKtdPrhsu4VKWNnB/3qM35GbuGQOasmYFYnKL+HYZMpbQ6YqeZcXTVg/wnCTttz0g== xterm-addon-webgl@0.13.0-beta.35: version "0.13.0-beta.35" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.13.0-beta.35.tgz#98b5dc102583120de25c7c6e0f35cd34ab6bef98" integrity sha512-powgeb3ifEZK7zWwLJuE8YRz/Z0UzDrrVA9NTx9mH7+vWxrGt9ZgroychoeCqZBvKMofiUM5vlf1oWdSmsMfzw== xterm@5.0.0-beta.35: version "5.0.0-beta.35" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.0.0-beta.35.tgz#3bbf5780c98aaaa6476e7590dff1d8f5014fce9d" integrity sha512-tzJTel1E/FmB0VQDb44xApVB+ln+BifIbHD4V9x9Z3D9m1cMmPHy8J8efdILkn1TxXGlCl7VC35nG122Qq5exw== </ins>


resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= <del> xterm-addon-canvas@0.2.0-beta.15: version "0.2.0-beta.15" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.2.0-beta.15.tgz#de863e46410b1de357b153abf1984227777760e4" integrity sha512-E1pNCDSVTINchwWLysZ9ZD/BPv1WLGV52xRHB00US1PHHELbhtvms+6dZ44WZEDXhtfpptRZ1VBx+QpvfJIuvw== xterm-addon-search@0.10.0-beta.3: version "0.10.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.10.0-beta.3.tgz#5194434d86105637c71f6f20139a9d0b5c1a956a" integrity sha512-UeGm/ymnp7HUYJJtsP0D+bljOWbdk3MctcLJ+0jv8AmU6YlAzJFtouvYSQrD5SAMyht5CRsvjzFgqic9X02JYg== xterm-addon-serialize@0.8.0-beta.3: version "0.8.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.8.0-beta.3.tgz#47ade3fedacbb75bd26e63cfe0120586623e0e4f" integrity sha512-gvfempZCYuAhLqN4O6fA2TuoavPjOxFKlh8hLcOzPackiLUhwKr1jQpDXcnq8VgqUiGgb+XNZpPEbI0Q7EhTgA== xterm-addon-unicode11@0.4.0-beta.3: version "0.4.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== xterm-addon-webgl@0.13.0-beta.32: version "0.13.0-beta.32" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.13.0-beta.32.tgz#ae7335f788ae611733e03f6ca38280ab7b86d212" integrity sha512-xOudNzYXaRh9QZ+IigXM5EB3bM8l3/F8F35EpJRYvvsylVxiB6Km8X8l7+nxlWt+uYdnHZs0ka2rvtL8kOP/uw== </del> <ins> xterm-addon-canvas@0.2.0-beta.17: version "0.2.0-beta.17" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.2.0-beta.17.tgz#e84a86530b20bd3edcce16b4566f346cd186ab4d" integrity sha512-2ukPdCA92VTFYQRE56ylzvI3cfaQYDWd/Mc4jlEItI6sV/EA5RnUbbP+2sFIx0JlmHK6nVYXXNY2p6QRB7MRew== xterm-addon-search@0.10.0-beta.5: version "0.10.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.10.0-beta.5.tgz#a2cb16bda4ddf8783b80433155ad94f5822271f8" integrity sha512-kjog7cm1iEZ2XyQFVs3KAvoI2pKoX0cq2WWjL0FuXYXpKQ9vXmfrWSR7PiJ6zpTIRvr6UtaSGKhmZVHLNA79WA== xterm-addon-serialize@0.8.0-beta.5: version "0.8.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.8.0-beta.5.tgz#3d2f3be173f4f1c31ae7bf25179e8ecddf2b33b2" integrity sha512-rkSUaO1XBcy3ipScZMA5PrOKu/DfXo8XC/V7hZlhMiBNbZKlbk2rFb3X0FB1f07hw7oEkHLjuIJEY5Qtxfe9/w== xterm-addon-unicode11@0.4.0-beta.5: version "0.4.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.5.tgz#3900e66f10d2e506133b61d7421aab6878d32665" integrity sha512-+g+fuxAd/tkCEJ/jhdnebXKtdPrhsu4VKWNnB/3qM35GbuGQOasmYFYnKL+HYZMpbQ6YqeZcXTVg/wnCTttz0g== xterm-addon-webgl@0.13.0-beta.35: version "0.13.0-beta.35" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.13.0-beta.35.tgz#98b5dc102583120de25c7c6e0f35cd34ab6bef98" integrity sha512-powgeb3ifEZK7zWwLJuE8YRz/Z0UzDrrVA9NTx9mH7+vWxrGt9ZgroychoeCqZBvKMofiUM5vlf1oWdSmsMfzw== </ins> xterm-headless@5.0.0-beta.5: version "5.0.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.0.0-beta.5.tgz#e29b6c5081f31f887122b7263ba996b0c46b3c22" integrity sha512-CMQ1+prBNF92oBMeZzc2rfTcmOaCGfwwSaoPYNTjyziZT6mZsEg7amajYkb0YAnqJ29MFm4kPGZbU78/dX4k2A== <del> xterm@5.0.0-beta.32: version "5.0.0-beta.32" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.0.0-beta.32.tgz#62bb9902429c0055fd2fd85c9eecfbf1756ed31c" integrity sha512-OAM1GaBs/chK63Cr86XbVhfVCLLXLpNxxFrv3RK9xoyb9dwiY3gaMxK9jeGzTnrbGLWJb+k5nxaC0rx2YsHvUA== </del> <ins> xterm@5.0.0-beta.35: version "5.0.0-beta.35" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.0.0-beta.35.tgz#3bbf5780c98aaaa6476e7590dff1d8f5014fce9d" integrity sha512-tzJTel1E/FmB0VQDb44xApVB+ln+BifIbHD4V9x9Z3D9m1cMmPHy8J8efdILkn1TxXGlCl7VC35nG122Qq5exw== </ins> yallist@^4.0.0: version "4.0.0"


dependencies: object-keys "~0.4.0" <del> xterm-addon-canvas@0.2.0-beta.15: version "0.2.0-beta.15" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.2.0-beta.15.tgz#de863e46410b1de357b153abf1984227777760e4" integrity sha512-E1pNCDSVTINchwWLysZ9ZD/BPv1WLGV52xRHB00US1PHHELbhtvms+6dZ44WZEDXhtfpptRZ1VBx+QpvfJIuvw== xterm-addon-search@0.10.0-beta.3: version "0.10.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.10.0-beta.3.tgz#5194434d86105637c71f6f20139a9d0b5c1a956a" integrity sha512-UeGm/ymnp7HUYJJtsP0D+bljOWbdk3MctcLJ+0jv8AmU6YlAzJFtouvYSQrD5SAMyht5CRsvjzFgqic9X02JYg== xterm-addon-serialize@0.8.0-beta.3: version "0.8.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.8.0-beta.3.tgz#47ade3fedacbb75bd26e63cfe0120586623e0e4f" integrity sha512-gvfempZCYuAhLqN4O6fA2TuoavPjOxFKlh8hLcOzPackiLUhwKr1jQpDXcnq8VgqUiGgb+XNZpPEbI0Q7EhTgA== xterm-addon-unicode11@0.4.0-beta.3: version "0.4.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== xterm-addon-webgl@0.13.0-beta.32: version "0.13.0-beta.32" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.13.0-beta.32.tgz#ae7335f788ae611733e03f6ca38280ab7b86d212" integrity sha512-xOudNzYXaRh9QZ+IigXM5EB3bM8l3/F8F35EpJRYvvsylVxiB6Km8X8l7+nxlWt+uYdnHZs0ka2rvtL8kOP/uw== </del> <ins> xterm-addon-canvas@0.2.0-beta.17: version "0.2.0-beta.17" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.2.0-beta.17.tgz#e84a86530b20bd3edcce16b4566f346cd186ab4d" integrity sha512-2ukPdCA92VTFYQRE56ylzvI3cfaQYDWd/Mc4jlEItI6sV/EA5RnUbbP+2sFIx0JlmHK6nVYXXNY2p6QRB7MRew== xterm-addon-search@0.10.0-beta.5: version "0.10.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.10.0-beta.5.tgz#a2cb16bda4ddf8783b80433155ad94f5822271f8" integrity sha512-kjog7cm1iEZ2XyQFVs3KAvoI2pKoX0cq2WWjL0FuXYXpKQ9vXmfrWSR7PiJ6zpTIRvr6UtaSGKhmZVHLNA79WA== xterm-addon-serialize@0.8.0-beta.5: version "0.8.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.8.0-beta.5.tgz#3d2f3be173f4f1c31ae7bf25179e8ecddf2b33b2" integrity sha512-rkSUaO1XBcy3ipScZMA5PrOKu/DfXo8XC/V7hZlhMiBNbZKlbk2rFb3X0FB1f07hw7oEkHLjuIJEY5Qtxfe9/w== xterm-addon-unicode11@0.4.0-beta.5: version "0.4.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.5.tgz#3900e66f10d2e506133b61d7421aab6878d32665" integrity sha512-+g+fuxAd/tkCEJ/jhdnebXKtdPrhsu4VKWNnB/3qM35GbuGQOasmYFYnKL+HYZMpbQ6YqeZcXTVg/wnCTttz0g== xterm-addon-webgl@0.13.0-beta.35: version "0.13.0-beta.35" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.13.0-beta.35.tgz#98b5dc102583120de25c7c6e0f35cd34ab6bef98" integrity sha512-powgeb3ifEZK7zWwLJuE8YRz/Z0UzDrrVA9NTx9mH7+vWxrGt9ZgroychoeCqZBvKMofiUM5vlf1oWdSmsMfzw== </ins> xterm-headless@5.0.0-beta.5: version "5.0.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.0.0-beta.5.tgz#e29b6c5081f31f887122b7263ba996b0c46b3c22" integrity sha512-CMQ1+prBNF92oBMeZzc2rfTcmOaCGfwwSaoPYNTjyziZT6mZsEg7amajYkb0YAnqJ29MFm4kPGZbU78/dX4k2A== <del> xterm@5.0.0-beta.32: version "5.0.0-beta.32" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.0.0-beta.32.tgz#62bb9902429c0055fd2fd85c9eecfbf1756ed31c" integrity sha512-OAM1GaBs/chK63Cr86XbVhfVCLLXLpNxxFrv3RK9xoyb9dwiY3gaMxK9jeGzTnrbGLWJb+k5nxaC0rx2YsHvUA== </del> <ins> xterm@5.0.0-beta.35: version "5.0.0-beta.35" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.0.0-beta.35.tgz#3bbf5780c98aaaa6476e7590dff1d8f5014fce9d" integrity sha512-tzJTel1E/FmB0VQDb44xApVB+ln+BifIbHD4V9x9Z3D9m1cMmPHy8J8efdILkn1TxXGlCl7VC35nG122Qq5exw== </ins> y18n@^3.2.1: version "3.2.2"


); } <del> async cloneRepository(url?: string, parentPath?: string, options: { recursive?: boolean } = {}): Promise<void> { </del> <ins> async cloneRepository(url?: string, parentPath?: string, options: { recursive?: boolean; ref?: string } = {}): Promise<void> { </ins> if (!url || typeof url !== 'string') { url = await pickRemoteSource({ providerLabel: provider => localize('clonefrom', "Clone from {0}", provider.name),


(progress, token) => this.git.clone(url!, { parentPath: parentPath!, progress, recursive: options.recursive }, token) ); <ins> if (options.ref !== undefined) { const repository = this.model.getRepository(Uri.file(repositoryPath)); await repository?.checkout(options.ref); } </ins> const config = workspace.getConfiguration('git'); const openAfterClone = config.get<'always' | 'alwaysNewWindow' | 'whenNoFolderOpen' | 'prompt'>('openAfterClone');


} @command('git.clone') <del> async clone(url?: string, parentPath?: string): Promise<void> { await this.cloneRepository(url, parentPath); </del> <ins> async clone(url?: string, parentPath?: string, options?: { ref?: string }): Promise<void> { await this.cloneRepository(url, parentPath, options); </ins> } @command('git.cloneRecursive')


private clone(uri: Uri): void { const data = querystring.parse(uri.query); <ins> const ref = data.ref; </ins> if (!data.url) { console.warn('Failed to open URI:', uri);


return; } <ins> if (ref !== undefined && typeof ref !== 'string') { console.warn('Failed to open URI:', uri); return; } </ins> let cloneUri: Uri; try { let rawUri = Array.isArray(data.url) ? data.url[0] : data.url;


return; } <del> commands.executeCommand('git.clone', cloneUri.toString(true)); </del> <ins> commands.executeCommand('git.clone', cloneUri.toString(true), undefined, { ref: ref }); </ins> } dispose(): void {


import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; <del> import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; </del> <ins> import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; </ins> import { Action2, IAction2Options, MenuRegistry, registerAction2 } from 'vs/platform/actions/common/actions'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { localize } from 'vs/nls';


@IQuickInputService private readonly quickInputService: IQuickInputService, @ICommandService private commandService: ICommandService, @IContextKeyService private readonly contextKeyService: IContextKeyService, <del> @IFileDialogService private readonly fileDialogService: IFileDialogService </del> <ins> @IFileDialogService private readonly fileDialogService: IFileDialogService, @ILifecycleService private readonly lifecycleService: ILifecycleService </ins> ) { super();


this.shouldShowViewsContext = EDIT_SESSIONS_SHOW_VIEW.bindTo(this.contextKeyService); this._register(this.fileService.registerProvider(EditSessionsFileSystemProvider.SCHEMA, new EditSessionsFileSystemProvider(this.editSessionsWorkbenchService))); <ins> this.lifecycleService.onWillShutdown((e) => e.join(this.autoStoreEditSession(), { id: 'autoStoreEditSession', label: localize('autoStoreEditSession', 'Storing current edit session...') })); } private async autoStoreEditSession() { if (this.configurationService.getValue('workbench.experimental.editSessions.autoStore') === 'onShutdown') { await this.progressService.withProgress({ location: ProgressLocation.Window, type: 'syncing', title: localize('store edit session', 'Storing edit session...') }, async () => this.storeEditSession(false)); } </ins> } private registerViews() {


Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerConfiguration({ ...workbenchConfigurationNodeBase, 'properties': { <ins> 'workbench.experimental.editSessions.autoStore': { enum: ['onShutdown', 'off'], enumDescriptions: [ localize('autoStore.onShutdown', "Automatically store current edit session on window close."), localize('autoStore.off', "Never attempt to automatically store an edit session.") ], 'type': 'string', 'tags': ['experimental', 'usesOnlineServices'], 'default': 'off', 'markdownDescription': localize('autoStore', "Controls whether to automatically store an available edit session for the current workspace."), }, </ins> 'workbench.experimental.editSessions.enabled': { 'type': 'boolean', 'tags': ['experimental', 'usesOnlineServices'],


import { Event } from 'vs/base/common/event'; import { IViewDescriptorService } from 'vs/workbench/common/views'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; <ins> import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; </ins> const folderName = 'test-folder'; const folderUri = URI.file(`/${folderName}`);


// Stub out all services instantiationService.stub(IEditSessionsLogService, logService); instantiationService.stub(IFileService, fileService); <ins> instantiationService.stub(ILifecycleService, new class extends mock<ILifecycleService>() { override onWillShutdown = Event.None; }); </ins> instantiationService.stub(INotificationService, new TestNotificationService()); instantiationService.stub(IEditSessionsWorkbenchService, new class extends mock<IEditSessionsWorkbenchService>() { }); instantiationService.stub(IProgressService, ProgressService);


const codeActionGroups = Object.freeze<CodeActionGroup[]>([ { kind: CodeActionKind.QuickFix, title: localize('codeAction.widget.id.quickfix', 'Quick Fix...') }, <del> { kind: CodeActionKind.Extract, title: localize('codeAction.widget.id.extract', 'Extract...'), icon: { codicon: Codicon.wrench } }, { kind: CodeActionKind.Convert, title: localize('codeAction.widget.id.convert', 'Convert...'), icon: { codicon: Codicon.zap, color: 'var(--vscode-editorLightBulbAutoFix-foreground)' } }, { kind: CodeActionKind.SurroundWith, title: localize('codeAction.widget.id.surround', 'Surround With...'), icon: { codicon: Codicon.symbolArray } }, { kind: CodeActionKind.Source, title: localize('codeAction.widget.id.source', 'Source Action...'), icon: { codicon: Codicon.lightBulb, color: 'var(--vscode-editorLightBulb-foreground)' } }, </del> <ins> { kind: CodeActionKind.RefactorExtract, title: localize('codeAction.widget.id.extract', 'Extract...'), icon: { codicon: Codicon.wrench } }, { kind: CodeActionKind.RefactorInline, title: localize('codeAction.widget.id.inline', 'Inline...'), icon: { codicon: Codicon.wrench } }, { kind: CodeActionKind.RefactorRewrite, title: localize('codeAction.widget.id.convert', 'Rewrite...'), icon: { codicon: Codicon.wrench } }, { kind: CodeActionKind.RefactorMove, title: localize('codeAction.widget.id.move', 'Move...'), icon: { codicon: Codicon.wrench } }, { kind: CodeActionKind.SurroundWith, title: localize('codeAction.widget.id.surround', 'Surround With...'), icon: { codicon: Codicon.symbolSnippet } }, { kind: CodeActionKind.Source, title: localize('codeAction.widget.id.source', 'Source Action...'), icon: { codicon: Codicon.symbolFile } }, </ins> uncategorizedCodeActionGroup, ]);


public static readonly Empty = new CodeActionKind(''); public static readonly QuickFix = new CodeActionKind('quickfix'); public static readonly Refactor = new CodeActionKind('refactor'); <del> public static readonly Extract = CodeActionKind.Refactor.append('extract'); public static readonly Convert = CodeActionKind.Refactor.append('rewrite'); </del> <ins> public static readonly RefactorExtract = CodeActionKind.Refactor.append('extract'); public static readonly RefactorInline = CodeActionKind.Refactor.append('inline'); public static readonly RefactorMove = CodeActionKind.Refactor.append('move'); public static readonly RefactorRewrite = CodeActionKind.Refactor.append('rewrite'); </ins> public static readonly Source = new CodeActionKind('source'); public static readonly SourceOrganizeImports = CodeActionKind.Source.append('organizeImports'); public static readonly SourceFixAll = CodeActionKind.Source.append('fixAll');


"vscode-proxy-agent": "^0.12.0", "vscode-regexpp": "^3.1.0", "vscode-textmate": "8.0.0", <del> "xterm": "5.2.0-beta.2", "xterm-addon-canvas": "0.4.0-beta.1", "xterm-addon-search": "0.11.0-beta.7", </del> <ins> "xterm": "5.2.0-beta.10", "xterm-addon-canvas": "0.4.0-beta.6", "xterm-addon-search": "0.11.0", </ins> "xterm-addon-serialize": "0.9.0", <del> "xterm-addon-unicode11": "0.5.0-beta.5", "xterm-addon-webgl": "0.15.0-beta.1", "xterm-headless": "5.2.0-beta.2", </del> <ins> "xterm-addon-unicode11": "0.5.0", "xterm-addon-webgl": "0.15.0-beta.4", "xterm-headless": "5.2.0-beta.10", </ins> "yauzl": "^2.9.2", "yazl": "^2.4.3" },


"tas-client-umd": "0.1.6", "vscode-oniguruma": "1.7.0", "vscode-textmate": "8.0.0", <del> "xterm": "5.2.0-beta.2", "xterm-addon-canvas": "0.4.0-beta.1", "xterm-addon-search": "0.11.0-beta.7", "xterm-addon-unicode11": "0.5.0-beta.5", "xterm-addon-webgl": "0.15.0-beta.1" </del> <ins> "xterm": "5.2.0-beta.10", "xterm-addon-canvas": "0.4.0-beta.6", "xterm-addon-search": "0.11.0", "xterm-addon-unicode11": "0.5.0", "xterm-addon-webgl": "0.15.0-beta.4" </ins> } }


resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== <del> xterm-addon-canvas@0.4.0-beta.1: version "0.4.0-beta.1" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0-beta.1.tgz#f2742b88cd3eb1840b9e7f986c4bfe31e0f4684f" integrity sha512-EfjaN0ujHJ4D8CsVpBig3xPvfRhbzAyOh8piAbNpePZmTpBzc2OQQQvEeklPriKVNDv28WbmY0Zzl5tgYM7vwg== xterm-addon-search@0.11.0-beta.7: version "0.11.0-beta.7" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0-beta.7.tgz#d90bcbe9e8f9238c18ba6145bd7ec2f8e3240052" integrity sha512-i/c774V0/Eon3BIFRsRR3OjKTnMGkccBo12yDkOa40tnAD4aa8FjspE3bxW/Hh1mUEhCSgBSLnMDlK/GwnUC+g== xterm-addon-unicode11@0.5.0-beta.5: version "0.5.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0-beta.5.tgz#6992a6f56349e67b903201d52b1ad41ba3469d93" integrity sha512-MaqnU34WTHCUAo7moB4KhynGn03RckI0JJ8E/gXe96EzuCP6bVJIKSc5pc9iFeLF4BX1SuemOqIHYl2Q3u3NTA== xterm-addon-webgl@0.15.0-beta.1: version "0.15.0-beta.1" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.1.tgz#bc3f784c3c467a70542b8a9a8998dbe996287796" integrity sha512-8f4cNXG0+dBMqp+Nvk/ZQ8Wo8s4/KbF24b2VTHTt8DuY5QXt4wSA6+NEdnABV98VYDoHl+KfXl9yyFqkcJYr8Q== xterm@5.2.0-beta.2: version "5.2.0-beta.2" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.2.tgz#67369235a54f41179922e662df40ff4c7c974787" integrity sha512-MRAdWRfV80ae0Q3Caq/mfmCwnZZZ89Z8i/sAleio5g5dpsst9IXc0zeFpPnOvUWmtVy5P1LbfU9YCy47449DWw== </del> <ins> xterm-addon-canvas@0.4.0-beta.6: version "0.4.0-beta.6" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0-beta.6.tgz#f8cb09ef980f1fa9d73f067e00f7a879c374ad68" integrity sha512-x5OY0VOJxqvXdyXpW9aug3vaeQX/+r7TZk13MujReuJRLRAjCHaH6ep6g9ZOVlqa8VCBWPwmm/eXH05SGUbnQQ== xterm-addon-search@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0.tgz#2a00ff7f9848f6140e7c4d1782486b0b18b06e0d" integrity sha512-6U4uHXcQ7G5igsdaGqrJ9ehm7vep24bXqWxuy3AnIosXF2Z5uy2MvmYRyTGNembIqPV/x1YhBQ7uShtuqBHhOQ== xterm-addon-unicode11@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0.tgz#41c0d96acc1e3bb6c6596eee64e163b6bca74be7" integrity sha512-Jm4/g4QiTxiKiTbYICQgC791ubhIZyoIwxAIgOW8z8HWFNY+lwk+dwaKEaEeGBfM48Vk8fklsUW9u/PlenYEBg== xterm-addon-webgl@0.15.0-beta.4: version "0.15.0-beta.4" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.4.tgz#d03a98e446372a5dbb7d92075d1f125eec23b030" integrity sha512-W9N0+5i3trQhgBOHDsnNiBbBiJpleFenY668wWaZ9GlvWseCTnjnWis1kfnM9WASDh/0+7aOjWrD089o+QeHGQ== xterm@5.2.0-beta.10: version "5.2.0-beta.10" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.10.tgz#33e67a8397937dd8b731a2f315c67f4bd63f3c28" integrity sha512-3zVxU/0XrUWpvOIU/KkXREweq7hCxNGFt4asT4D/SsRlRKYOnO+vooz1CjLO6USY++iHXicgf8PdgRDeYj5fFQ== </ins>


resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= <del> xterm-addon-canvas@0.4.0-beta.1: version "0.4.0-beta.1" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0-beta.1.tgz#f2742b88cd3eb1840b9e7f986c4bfe31e0f4684f" integrity sha512-EfjaN0ujHJ4D8CsVpBig3xPvfRhbzAyOh8piAbNpePZmTpBzc2OQQQvEeklPriKVNDv28WbmY0Zzl5tgYM7vwg== </del> <ins> xterm-addon-canvas@0.4.0-beta.6: version "0.4.0-beta.6" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0-beta.6.tgz#f8cb09ef980f1fa9d73f067e00f7a879c374ad68" integrity sha512-x5OY0VOJxqvXdyXpW9aug3vaeQX/+r7TZk13MujReuJRLRAjCHaH6ep6g9ZOVlqa8VCBWPwmm/eXH05SGUbnQQ== </ins> <del> xterm-addon-search@0.11.0-beta.7: version "0.11.0-beta.7" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0-beta.7.tgz#d90bcbe9e8f9238c18ba6145bd7ec2f8e3240052" integrity sha512-i/c774V0/Eon3BIFRsRR3OjKTnMGkccBo12yDkOa40tnAD4aa8FjspE3bxW/Hh1mUEhCSgBSLnMDlK/GwnUC+g== </del> <ins> xterm-addon-search@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0.tgz#2a00ff7f9848f6140e7c4d1782486b0b18b06e0d" integrity sha512-6U4uHXcQ7G5igsdaGqrJ9ehm7vep24bXqWxuy3AnIosXF2Z5uy2MvmYRyTGNembIqPV/x1YhBQ7uShtuqBHhOQ== </ins> xterm-addon-serialize@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.9.0.tgz#3eee5f5c34b16e48891ec59b213716bab2354bf4" integrity sha512-qJju2YJFh8c8pbtCYtHaG7gDDHBpDJ4a4JQZvOzuiMxOjgeM1oCnFNjbhzMuK/fOUa59FmvIUGQyqn3WL9q7qw== <del> xterm-addon-unicode11@0.5.0-beta.5: version "0.5.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0-beta.5.tgz#6992a6f56349e67b903201d52b1ad41ba3469d93" integrity sha512-MaqnU34WTHCUAo7moB4KhynGn03RckI0JJ8E/gXe96EzuCP6bVJIKSc5pc9iFeLF4BX1SuemOqIHYl2Q3u3NTA== xterm-addon-webgl@0.15.0-beta.1: version "0.15.0-beta.1" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.1.tgz#bc3f784c3c467a70542b8a9a8998dbe996287796" integrity sha512-8f4cNXG0+dBMqp+Nvk/ZQ8Wo8s4/KbF24b2VTHTt8DuY5QXt4wSA6+NEdnABV98VYDoHl+KfXl9yyFqkcJYr8Q== xterm-headless@5.2.0-beta.2: version "5.2.0-beta.2" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.2.tgz#db8d4cc45a2bba062622d7784a2264030aa7d56d" integrity sha512-aP3+K47bJu5AkdtekML5LZZUh/zAkDc5ONNFgQ+7eUBh7RkFy3JYRuaG5Nj3LbdkUMjWqQZXzc3BW5Vo9KQNgA== xterm@5.2.0-beta.2: version "5.2.0-beta.2" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.2.tgz#67369235a54f41179922e662df40ff4c7c974787" integrity sha512-MRAdWRfV80ae0Q3Caq/mfmCwnZZZ89Z8i/sAleio5g5dpsst9IXc0zeFpPnOvUWmtVy5P1LbfU9YCy47449DWw== </del> <ins> xterm-addon-unicode11@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0.tgz#41c0d96acc1e3bb6c6596eee64e163b6bca74be7" integrity sha512-Jm4/g4QiTxiKiTbYICQgC791ubhIZyoIwxAIgOW8z8HWFNY+lwk+dwaKEaEeGBfM48Vk8fklsUW9u/PlenYEBg== xterm-addon-webgl@0.15.0-beta.4: version "0.15.0-beta.4" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.4.tgz#d03a98e446372a5dbb7d92075d1f125eec23b030" integrity sha512-W9N0+5i3trQhgBOHDsnNiBbBiJpleFenY668wWaZ9GlvWseCTnjnWis1kfnM9WASDh/0+7aOjWrD089o+QeHGQ== xterm-headless@5.2.0-beta.10: version "5.2.0-beta.10" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.10.tgz#fc7b11b0395f6bb934b0c9373b412bc4d3247148" integrity sha512-jjylqERzLWWrPLpehL1v0Y3JaZqQksoqE04g5H+tNceQemoBlIpbA5OgPrbcjz5xxFIR9mVWppFR7klWox5/Sg== xterm@5.2.0-beta.10: version "5.2.0-beta.10" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.10.tgz#33e67a8397937dd8b731a2f315c67f4bd63f3c28" integrity sha512-3zVxU/0XrUWpvOIU/KkXREweq7hCxNGFt4asT4D/SsRlRKYOnO+vooz1CjLO6USY++iHXicgf8PdgRDeYj5fFQ== </ins> yallist@^4.0.0: version "4.0.0"


dependencies: object-keys "~0.4.0" <del> xterm-addon-canvas@0.4.0-beta.1: version "0.4.0-beta.1" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0-beta.1.tgz#f2742b88cd3eb1840b9e7f986c4bfe31e0f4684f" integrity sha512-EfjaN0ujHJ4D8CsVpBig3xPvfRhbzAyOh8piAbNpePZmTpBzc2OQQQvEeklPriKVNDv28WbmY0Zzl5tgYM7vwg== </del> <ins> xterm-addon-canvas@0.4.0-beta.6: version "0.4.0-beta.6" resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0-beta.6.tgz#f8cb09ef980f1fa9d73f067e00f7a879c374ad68" integrity sha512-x5OY0VOJxqvXdyXpW9aug3vaeQX/+r7TZk13MujReuJRLRAjCHaH6ep6g9ZOVlqa8VCBWPwmm/eXH05SGUbnQQ== </ins> <del> xterm-addon-search@0.11.0-beta.7: version "0.11.0-beta.7" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0-beta.7.tgz#d90bcbe9e8f9238c18ba6145bd7ec2f8e3240052" integrity sha512-i/c774V0/Eon3BIFRsRR3OjKTnMGkccBo12yDkOa40tnAD4aa8FjspE3bxW/Hh1mUEhCSgBSLnMDlK/GwnUC+g== </del> <ins> xterm-addon-search@0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0.tgz#2a00ff7f9848f6140e7c4d1782486b0b18b06e0d" integrity sha512-6U4uHXcQ7G5igsdaGqrJ9ehm7vep24bXqWxuy3AnIosXF2Z5uy2MvmYRyTGNembIqPV/x1YhBQ7uShtuqBHhOQ== </ins> xterm-addon-serialize@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.9.0.tgz#3eee5f5c34b16e48891ec59b213716bab2354bf4" integrity sha512-qJju2YJFh8c8pbtCYtHaG7gDDHBpDJ4a4JQZvOzuiMxOjgeM1oCnFNjbhzMuK/fOUa59FmvIUGQyqn3WL9q7qw== <del> xterm-addon-unicode11@0.5.0-beta.5: version "0.5.0-beta.5" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0-beta.5.tgz#6992a6f56349e67b903201d52b1ad41ba3469d93" integrity sha512-MaqnU34WTHCUAo7moB4KhynGn03RckI0JJ8E/gXe96EzuCP6bVJIKSc5pc9iFeLF4BX1SuemOqIHYl2Q3u3NTA== xterm-addon-webgl@0.15.0-beta.1: version "0.15.0-beta.1" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.1.tgz#bc3f784c3c467a70542b8a9a8998dbe996287796" integrity sha512-8f4cNXG0+dBMqp+Nvk/ZQ8Wo8s4/KbF24b2VTHTt8DuY5QXt4wSA6+NEdnABV98VYDoHl+KfXl9yyFqkcJYr8Q== xterm-headless@5.2.0-beta.2: version "5.2.0-beta.2" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.2.tgz#db8d4cc45a2bba062622d7784a2264030aa7d56d" integrity sha512-aP3+K47bJu5AkdtekML5LZZUh/zAkDc5ONNFgQ+7eUBh7RkFy3JYRuaG5Nj3LbdkUMjWqQZXzc3BW5Vo9KQNgA== xterm@5.2.0-beta.2: version "5.2.0-beta.2" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.2.tgz#67369235a54f41179922e662df40ff4c7c974787" integrity sha512-MRAdWRfV80ae0Q3Caq/mfmCwnZZZ89Z8i/sAleio5g5dpsst9IXc0zeFpPnOvUWmtVy5P1LbfU9YCy47449DWw== </del> <ins> xterm-addon-unicode11@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0.tgz#41c0d96acc1e3bb6c6596eee64e163b6bca74be7" integrity sha512-Jm4/g4QiTxiKiTbYICQgC791ubhIZyoIwxAIgOW8z8HWFNY+lwk+dwaKEaEeGBfM48Vk8fklsUW9u/PlenYEBg== xterm-addon-webgl@0.15.0-beta.4: version "0.15.0-beta.4" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.15.0-beta.4.tgz#d03a98e446372a5dbb7d92075d1f125eec23b030" integrity sha512-W9N0+5i3trQhgBOHDsnNiBbBiJpleFenY668wWaZ9GlvWseCTnjnWis1kfnM9WASDh/0+7aOjWrD089o+QeHGQ== xterm-headless@5.2.0-beta.10: version "5.2.0-beta.10" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.2.0-beta.10.tgz#fc7b11b0395f6bb934b0c9373b412bc4d3247148" integrity sha512-jjylqERzLWWrPLpehL1v0Y3JaZqQksoqE04g5H+tNceQemoBlIpbA5OgPrbcjz5xxFIR9mVWppFR7klWox5/Sg== xterm@5.2.0-beta.10: version "5.2.0-beta.10" resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.2.0-beta.10.tgz#33e67a8397937dd8b731a2f315c67f4bd63f3c28" integrity sha512-3zVxU/0XrUWpvOIU/KkXREweq7hCxNGFt4asT4D/SsRlRKYOnO+vooz1CjLO6USY++iHXicgf8PdgRDeYj5fFQ== </ins> y18n@^3.2.1: version "3.2.2"


invokeProtocolHandler(); <del> // We cannot know whether the protocol handler succeeded. // Display guidance in case it did not, e.g. the app is not installed locally. if (matchesScheme(href, this.productService.urlProtocol)) { </del> <ins> const showProtocolUrlOpenedDialog = async () => { </ins> const showResult = await this.dialogService.show( Severity.Info, localize('openExternalDialogTitle', "All done. You can close this tab now."),


if (showResult.choice === 0) { invokeProtocolHandler(); } else if (showResult.choice === 1) { <del> await this.openerService.open(URI.parse(`http://aka.ms/vscode-install`)); </del> <ins> // Route the user to the appropriate install link await this.openerService.open(URI.parse( this.productService.quality === 'stable' ? `http://aka.ms/vscode-install` : `http://aka.ms/vscode-install-insiders` )); // Re-show the dialog so that the user can come back after installing and try again showProtocolUrlOpenedDialog(); </ins> } <ins> }; // We cannot know whether the protocol handler succeeded. // Display guidance in case it did not, e.g. the app is not installed locally. if (matchesScheme(href, this.productService.urlProtocol)) { await showProtocolUrlOpenedDialog(); </ins> } }


} if (runSource === TaskRunSource.User) { const workspaceTasks = await this.getWorkspaceTasks(); <del> RunAutomaticTasks.promptForPermission(this, this._storageService, this._notificationService, this._workspaceTrustManagementService, this._openerService, this._configurationService, workspaceTasks); </del> <ins> RunAutomaticTasks.runWithPermission(this, this._storageService, this._notificationService, this._workspaceTrustManagementService, this._openerService, this._configurationService, workspaceTasks); </ins> } return executeTaskResult; } catch (error) {


@ITaskService private readonly _taskService: ITaskService, @IConfigurationService private readonly _configurationService: IConfigurationService, @IWorkspaceTrustManagementService private readonly _workspaceTrustManagementService: IWorkspaceTrustManagementService, <del> @ILogService private readonly _logService: ILogService) { </del> <ins> @ILogService private readonly _logService: ILogService, @IStorageService private readonly _storageService: IStorageService, @IOpenerService private readonly _openerService: IOpenerService, @INotificationService private readonly _notificationService: INotificationService) { </ins> super(); this._tryRunTasks(); }


await Event.toPromise(Event.once(this._taskService.onDidChangeTaskSystemInfo)); } <del> this._logService.trace('RunAutomaticTasks: Checking if automatic tasks should run.'); const isFolderAutomaticAllowed = this._configurationService.getValue(ALLOW_AUTOMATIC_TASKS) !== 'off'; await this._workspaceTrustManagementService.workspaceTrustInitialized; const isWorkspaceTrusted = this._workspaceTrustManagementService.isWorkspaceTrusted(); // Only run if allowed. Prompting for permission occurs when a user first tries to run a task. if (isFolderAutomaticAllowed && isWorkspaceTrusted) { this._taskService.getWorkspaceTasks(TaskRunSource.FolderOpen).then(workspaceTaskResult => { const { tasks } = RunAutomaticTasks._findAutoTasks(this._taskService, workspaceTaskResult); this._logService.trace(`RunAutomaticTasks: Found ${tasks.length} automatic tasks tasks`); if (tasks.length > 0) { RunAutomaticTasks._runTasks(this._taskService, tasks); } }); } </del> <ins> const workspaceTasks = await this._taskService.getWorkspaceTasks(TaskRunSource.FolderOpen); this._logService.trace(`RunAutomaticTasks: Found ${workspaceTasks.size} automatic tasks`); await RunAutomaticTasks.runWithPermission(this._taskService, this._storageService, this._notificationService, this._workspaceTrustManagementService, this._openerService, this._configurationService, workspaceTasks); </ins> } private static _runTasks(taskService: ITaskService, tasks: Array<Task | Promise<Task | undefined>>) {


return { tasks, taskNames, locations }; } <del> public static async promptForPermission(taskService: ITaskService, storageService: IStorageService, notificationService: INotificationService, workspaceTrustManagementService: IWorkspaceTrustManagementService, </del> <ins> public static async runWithPermission(taskService: ITaskService, storageService: IStorageService, notificationService: INotificationService, workspaceTrustManagementService: IWorkspaceTrustManagementService, </ins> openerService: IOpenerService, configurationService: IConfigurationService, workspaceTaskResult: Map<string, IWorkspaceFolderTaskResult>) { const isWorkspaceTrusted = workspaceTrustManagementService.isWorkspaceTrusted; <del> if (!isWorkspaceTrusted) { </del> <ins> if (!isWorkspaceTrusted || configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'off') { </ins> return; } <del> if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'off') { </del> <ins> const hasShownPromptForAutomaticTasks = storageService.getBoolean(HAS_PROMPTED_FOR_AUTOMATIC_TASKS, StorageScope.WORKSPACE, false); const { tasks, taskNames, locations } = RunAutomaticTasks._findAutoTasks(taskService, workspaceTaskResult); if (taskNames.length === 0) { </ins> return; } <del> const hasShownPromptForAutomaticTasks = storageService.getBoolean(HAS_PROMPTED_FOR_AUTOMATIC_TASKS, StorageScope.WORKSPACE, undefined); const { tasks, taskNames, locations } = RunAutomaticTasks._findAutoTasks(taskService, workspaceTaskResult); if (taskNames.length > 0) { if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'on') { RunAutomaticTasks._runTasks(taskService, tasks); } else if (!hasShownPromptForAutomaticTasks) { // We have automatic tasks, prompt to allow. this._showPrompt(notificationService, storageService, openerService, configurationService, taskNames, locations).then(allow => { if (allow) { RunAutomaticTasks._runTasks(taskService, tasks); } }); } </del> <ins> if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'on') { RunAutomaticTasks._runTasks(taskService, tasks); } else if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'auto' && !hasShownPromptForAutomaticTasks) { // by default, only prompt once per folder // otherwise, this can be configured via the setting this._showPrompt(notificationService, storageService, openerService, configurationService, taskNames, locations).then(allow => { if (allow) { storageService.store(HAS_PROMPTED_FOR_AUTOMATIC_TASKS, true, StorageScope.WORKSPACE, StorageTarget.USER); RunAutomaticTasks._runTasks(taskService, tasks); } }); </ins> } }


type: 'string', enum: ['on', 'auto', 'off'], enumDescriptions: [ <del> nls.localize('ttask.allowAutomaticTasks.on', "Always"), </del> <ins> nls.localize('task.allowAutomaticTasks.on', "Always"), </ins> nls.localize('task.allowAutomaticTasks.auto', "Prompt for permission for each folder"), nls.localize('task.allowAutomaticTasks.off', "Never"), ], <del> description: nls.localize('task.allowAutomaticTasks', "Enable automatic tasks in the folder."), </del> <ins> description: nls.localize('task.allowAutomaticTasks', "Enable automatic tasks in the folder - note that tasks won't run in an untrusted workspace."), </ins> default: 'auto', restricted: true },


"brackets": [ ["{", "}"], ["[", "]"], <del> ["(", ")"] </del> <ins> ["(", ")"], ["#if","#endif"], </ins> ], "autoClosingPairs": [ { "open": "[", "close": "]" },


.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item { display: flex; <ins> align-items: center; </ins> height: 22px; line-height: 22px; flex: 1;


display: block; } <ins> .timeline-tree-view .monaco-list .monaco-list-row .custom-view-tree-node-item > .custom-view-tree-node-item-icon, </ins> .customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item > .custom-view-tree-node-item-resourceLabel > .custom-view-tree-node-item-icon { background-size: 16px; background-position: left center;


.customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .custom-view-tree-node-item-resourceLabel::after { padding-right: 0px; <ins> margin-right: 4px; </ins> } .customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .actions {


constructor(controllerId: string, controllerLabel: string, editors: ExtHostDocumentsAndEditors) { super({ controllerId, <del> getDocumentVersion: (uri: URI) => editors.getDocument(uri)?.version, </del> <ins> getDocumentVersion: uri => uri && editors.getDocument(uri)?.version, </ins> getApiFor: getPrivateApiFor as (impl: TestItemImpl) => ITestItemApi<TestItemImpl>, getChildren: (item) => item.children as ITestChildrenLike<TestItemImpl>, root: new TestItemRootImpl(controllerId, controllerLabel),


super({ id: 'editor.createFoldingRangeFromSelection', label: nls.localize('createManualFoldRange.label', "Create Manual Folding Range from Selection"), <del> alias: 'Create Folding Range from Selection', </del> <ins> alias: 'Create Manual Folding Range from Selection', </ins> precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus,


private _headerVisible = true; private _minimumBodySize: number; private _maximumBodySize: number; <del> private ariaHeaderLabel: string; </del> <ins> private _ariaHeaderLabel: string; </ins> private styles: IPaneStyles = {}; private animationTimer: number | undefined = undefined;


private readonly _onDidChangeExpansionState = this._register(new Emitter<boolean>()); readonly onDidChangeExpansionState: Event<boolean> = this._onDidChangeExpansionState.event; <ins> get ariaHeaderLabel(): string { return this._ariaHeaderLabel; } set ariaHeaderLabel(newLabel: string) { this._ariaHeaderLabel = newLabel; this.header.setAttribute('aria-label', this.ariaHeaderLabel); } </ins> get draggableElement(): HTMLElement { return this.header; }


super(); this._expanded = typeof options.expanded === 'undefined' ? true : !!options.expanded; this._orientation = typeof options.orientation === 'undefined' ? Orientation.VERTICAL : options.orientation; <del> this.ariaHeaderLabel = localize('viewSection', "{0} Section", options.title); </del> <ins> this._ariaHeaderLabel = localize('viewSection', "{0} Section", options.title); </ins> this._minimumBodySize = typeof options.minimumBodySize === 'number' ? options.minimumBodySize : this._orientation === Orientation.HORIZONTAL ? 200 : 120; this._maximumBodySize = typeof options.maximumBodySize === 'number' ? options.maximumBodySize : Number.POSITIVE_INFINITY;


const title = workspace.folders.map(folder => folder.name).join(); titleElement.textContent = this.name; titleElement.title = title; <del> titleElement.setAttribute('aria-label', nls.localize('explorerSection', "Explorer Section: {0}", this.name)); </del> <ins> this.ariaHeaderLabel = nls.localize('explorerSection', "Explorer Section: {0}", this.name); titleElement.setAttribute('aria-label', this.ariaHeaderLabel); </ins> }; this._register(this.contextService.onDidChangeWorkspaceName(setHeader));


NoPathFound = 'NoPathFound', UnknownPath = 'UnknownPath', EmptyCommitMessage = 'EmptyCommitMessage', <del> BranchFastForwardRejected = 'BranchFastForwardRejected' </del> <ins> BranchFastForwardRejected = 'BranchFastForwardRejected', TagConflict = 'TagConflict' </ins> }


} } <ins> async fetchTags(options: { remote: string; tags: string[]; force?: boolean }): Promise<void> { const args = ['fetch']; const spawnOptions: SpawnOptions = { env: { 'GIT_HTTP_USER_AGENT': this.git.userAgent } }; args.push(options.remote); for (const tag of options.tags) { args.push(`refs/tags/${tag}:refs/tags/${tag}`); } if (options.force) { args.push('--force'); } await this.exec(args, spawnOptions); } </ins> async pull(rebase?: boolean, remote?: string, branch?: string, options: PullOptions = {}): Promise<void> { const args = ['pull'];


err.gitErrorCode = GitErrorCodes.CantLockRef; } else if (/cannot rebase onto multiple branches/i.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.CantRebaseMultipleBranches; <ins> } else if (/! [rejected].*(would clobber existing tag)/m.test(err.stderr || '')) { err.gitErrorCode = GitErrorCodes.TagConflict; </ins> } throw err;


import { Branch, Change, ForcePushMode, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status, CommitOptions, BranchQuery, FetchOptions } from './api/git'; import { AutoFetcher } from './autofetch'; import { debounce, memoize, throttle } from './decorators'; <del> import { Commit, GitError, Repository as BaseRepository, Stash, Submodule, LogFileOptions } from './git'; </del> <ins> import { Commit, GitError, Repository as BaseRepository, Stash, Submodule, LogFileOptions, PullOptions } from './git'; </ins> import { StatusBarCommands } from './statusbar'; import { toGitUri } from './uri'; import { anyEvent, combinedDisposable, debounceEvent, dispose, EmptyDisposable, eventToPromise, filterEvent, find, IDisposable, isDescendant, onceEvent, pathEquals, relativePath } from './util';


} if (await this.checkIfMaybeRebased(this.HEAD?.name)) { <del> await this.repository.pull(rebase, remote, branch, { unshallow, tags }); </del> <ins> this._pullAndHandleTagConflict(rebase, remote, branch, { unshallow, tags }); </ins> } }); }); } <ins> private async _pullAndHandleTagConflict(rebase?: boolean, remote?: string, branch?: string, options: PullOptions = {}): Promise<void> { try { await this.repository.pull(rebase, remote, branch, options); } catch (err) { if (err.gitErrorCode !== GitErrorCodes.TagConflict) { throw err; } // Handle tag(s) conflict if (await this.handleTagConflict(remote, err.stderr)) { await this.repository.pull(rebase, remote, branch, options); } } } </ins> @throttle async push(head: Branch, forcePushMode?: ForcePushMode): Promise<void> { let remote: string | undefined;


} if (await this.checkIfMaybeRebased(this.HEAD?.name)) { <del> await this.repository.pull(rebase, remoteName, pullBranch, { tags, cancellationToken }); </del> <ins> this._pullAndHandleTagConflict(rebase, remoteName, pullBranch, { tags, cancellationToken }); </ins> } };


return config.get<boolean>('optimisticUpdate') === true; } <ins> private async handleTagConflict(remote: string | undefined, raw: string): Promise<boolean> { // Ensure there is a remote remote = remote ?? this.HEAD?.upstream?.remote; if (!remote) { throw new Error('Unable to resolve tag conflict due to missing remote.'); } // Extract tag names from message const tags: string[] = []; for (const match of raw.matchAll(/^ ! [rejected]s+([^s]+)s+->s+([^s]+)s+(would clobber existing tag)$/gm)) { if (match.length === 3) { tags.push(match[1]); } } if (tags.length === 0) { throw new Error(`Unable to extract tag names from error message: ${raw}`); } // Notification const replaceLocalTags = l10n.t('Replace Local Tag(s)'); const message = l10n.t('Unable to pull from remote repository due to conflicting tag(s): {0}. Would you like to resolve the conflict by replacing the local tag(s)?', tags.join(', ')); const choice = await window.showErrorMessage(message, { modal: true }, replaceLocalTags); if (choice !== replaceLocalTags) { return false; } // Force fetch tags await this.repository.fetchTags({ remote, tags, force: true }); return true; } </ins> public isBranchProtected(name: string = this.HEAD?.name ?? ''): boolean { return this.isBranchProtectedMatcher ? this.isBranchProtectedMatcher(name) : false; }


description: nls.localize('vscode.extension.contributes.terminal', 'Contributes terminal functionality.'), type: 'object', properties: { <del> types: { type: 'array', description: nls.localize('vscode.extension.contributes.terminal.types', "Defines additional terminal types that the user can create."), items: { type: 'object', required: ['command', 'title'], properties: { command: { description: nls.localize('vscode.extension.contributes.terminal.types.command', "Command to execute when the user creates this type of terminal."), type: 'string', }, title: { description: nls.localize('vscode.extension.contributes.terminal.types.title', "Title for this type of terminal."), type: 'string', }, icon: { description: nls.localize('vscode.extension.contributes.terminal.types.icon', "A codicon, URI, or light and dark URIs to associate with this terminal type."), anyOf: [{ type: 'string', }, { type: 'object', properties: { light: { description: nls.localize('vscode.extension.contributes.terminal.types.icon.light', 'Icon path when a light theme is used'), type: 'string' }, dark: { description: nls.localize('vscode.extension.contributes.terminal.types.icon.dark', 'Icon path when a dark theme is used'), type: 'string' } } }] }, }, }, }, </del> profiles: { type: 'array', description: nls.localize('vscode.extension.contributes.terminal.profiles', "Defines additional terminal profiles that the user can create."),


await timeout(0); const instance = this.activeInstance; if (instance) { <ins> // HACK: Ensure the panel is still visible at this point as there may have been // a request since it was opened to show a different panel if (pane && !pane.isVisible()) { await this._viewsService.openView(TERMINAL_VIEW_ID, focus); } </ins> await instance.focusWhenReady(true); // HACK: as a workaround for https://github.com/microsoft/vscode/issues/134692, // this will trigger a forced refresh of the viewport to sync the viewport and scroll bar.


if (pane && !pane.isVisible()) { await this._viewsService.openView(TERMINAL_VIEW_ID, focus); } <del> await instance.focusWhenReady(true); </del> <ins> // Do not await the focus as setVisible must be called immediately to ensure // something else didn't steal focus instance.focusWhenReady(true); </ins> // HACK: as a workaround for https://github.com/microsoft/vscode/issues/134692, // this will trigger a forced refresh of the viewport to sync the viewport and scroll bar. // This can likely be removed after https://github.com/xtermjs/xterm.js/issues/291 is


import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ResourceMap } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; <del> import { isEqual } from 'vs/base/common/resources'; </del> <ins> import { basename, isEqual } from 'vs/base/common/resources'; </ins> import { isDefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';


import { NotebookOutputRendererInfo, NotebookStaticPreloadInfo as NotebookStaticPreloadInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer'; import { NotebookEditorDescriptor, NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { INotebookSerializer, INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService'; <del> import { DiffEditorInputFactoryFunction, EditorInputFactoryFunction, EditorInputFactoryObject, IEditorResolverService, IEditorType, RegisteredEditorInfo, RegisteredEditorPriority, UntitledEditorInputFactoryFunction } from 'vs/workbench/services/editor/common/editorResolverService'; </del> <ins> import { DiffEditorInputFactoryFunction, EditorInputFactoryFunction, EditorInputFactoryObject, IEditorResolverService, IEditorType, RegisteredEditorInfo, RegisteredEditorPriority, UntitledEditorInputFactoryFunction, type MergeEditorInputFactoryFunction } from 'vs/workbench/services/editor/common/editorResolverService'; </ins> import { IExtensionService, isProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { INotebookDocument, INotebookDocumentService } from 'vs/workbench/services/notebook/common/notebookDocumentService'; <ins> import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput'; import type { EditorInputWithOptions, IResourceMergeEditorInput } from 'vs/workbench/common/editor'; </ins> export class NotebookProviderInfoStore extends Disposable {


const notebookDiffEditorInputFactory: DiffEditorInputFactoryFunction = ({ modified, original, label, description }) => { return { editor: NotebookDiffEditorInput.create(this._instantiationService, modified.resource!, label, description, original.resource!, notebookProviderInfo.id) }; }; <ins> const mergeEditorInputFactory: MergeEditorInputFactoryFunction = (mergeEditor: IResourceMergeEditorInput): EditorInputWithOptions => { return { editor: this._instantiationService.createInstance( MergeEditorInput, mergeEditor.base.resource, { uri: mergeEditor.input1.resource, title: mergeEditor.input1.label ?? basename(mergeEditor.input1.resource), description: mergeEditor.input1.description ?? '', detail: mergeEditor.input1.detail }, { uri: mergeEditor.input2.resource, title: mergeEditor.input2.label ?? basename(mergeEditor.input2.resource), description: mergeEditor.input2.description ?? '', detail: mergeEditor.input2.detail }, mergeEditor.result.resource ) }; }; </ins> const notebookFactoryObject: EditorInputFactoryObject = { createEditorInput: notebookEditorInputFactory, createDiffEditorInput: notebookDiffEditorInputFactory, createUntitledEditorInput: notebookUntitledEditorFactory, <ins> createMergeEditorInput: mergeEditorInputFactory </ins> }; const notebookCellFactoryObject: EditorInputFactoryObject = { createEditorInput: notebookEditorInputFactory,


import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EditSessionsDataViews } from 'vs/workbench/contrib/editSessions/browser/editSessionsViews'; import { EditSessionsFileSystemProvider } from 'vs/workbench/contrib/editSessions/browser/editSessionsFileSystemProvider'; <del> import { isNative } from 'vs/base/common/platform'; </del> <ins> import { isNative, isWeb } from 'vs/base/common/platform'; </ins> import { VirtualWorkspaceContext, WorkspaceFolderCountContext } from 'vs/workbench/common/contextkeys'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { equals } from 'vs/base/common/objects';


} private async autoStoreEditSession() { <del> if (this.configurationService.getValue('workbench.experimental.cloudChanges.autoStore') === 'onShutdown') { </del> <ins> if (this.configurationService.getValue('workbench.experimental.cloudChanges.autoStore') === 'onShutdown' && !isWeb) { </ins> const cancellationTokenSource = new CancellationTokenSource(); await this.progressService.withProgress({ location: ProgressLocation.Window,


'type': 'string', 'tags': ['experimental', 'usesOnlineServices'], 'default': 'off', <del> 'markdownDescription': localize('autoStoreWorkingChangesDescription', "Controls whether to automatically store available working changes in the cloud for the current workspace."), </del> <ins> 'markdownDescription': localize('autoStoreWorkingChangesDescription', "Controls whether to automatically store available working changes in the cloud for the current workspace. This setting has no effect in the web."), </ins> }, 'workbench.cloudChanges.autoResume': { enum: ['onReload', 'off'],


this.shouldShowViewsContext = EDIT_SESSIONS_SHOW_VIEW.bindTo(this.contextKeyService); this._register(this.fileService.registerProvider(EditSessionsFileSystemProvider.SCHEMA, new EditSessionsFileSystemProvider(this.editSessionsStorageService))); <del> this.lifecycleService.onWillShutdown((e) => e.join(this.autoStoreEditSession(), { id: 'autoStoreWorkingChanges', label: localize('autoStoreWorkingChanges', 'Storing current working changes...') })); </del> <ins> this.lifecycleService.onWillShutdown((e) => { if (this.configurationService.getValue('workbench.experimental.cloudChanges.autoStore') === 'onShutdown' && !isWeb) { e.join(this.autoStoreEditSession(), { id: 'autoStoreWorkingChanges', label: localize('autoStoreWorkingChanges', 'Storing current working changes...') }); } }); </ins> this._register(this.editSessionsStorageService.onDidSignIn(() => this.updateAccountsMenuBadge())); this._register(this.editSessionsStorageService.onDidSignOut(() => this.updateAccountsMenuBadge())); }


} private async autoStoreEditSession() { <del> if (this.configurationService.getValue('workbench.experimental.cloudChanges.autoStore') === 'onShutdown' && !isWeb) { const cancellationTokenSource = new CancellationTokenSource(); await this.progressService.withProgress({ location: ProgressLocation.Window, type: 'syncing', title: localize('store working changes', 'Storing working changes...') }, async () => this.storeEditSession(false, cancellationTokenSource.token), () => { cancellationTokenSource.cancel(); cancellationTokenSource.dispose(); }); } </del> <ins> const cancellationTokenSource = new CancellationTokenSource(); await this.progressService.withProgress({ location: ProgressLocation.Window, type: 'syncing', title: localize('store working changes', 'Storing working changes...') }, async () => this.storeEditSession(false, cancellationTokenSource.token), () => { cancellationTokenSource.cancel(); cancellationTokenSource.dispose(); }); </ins> } private registerViews() {


} let resource = EditorResourceAccessor.getCanonicalUri(untypedEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); <del> const options = untypedEditor.options; </del> // If it was resolved before we await for the extensions to activate and then proceed with resolution or else the backing extensions won't be registered if (this.cache && resource && this.resourceMatchesCache(resource)) {


return ResolvedStatus.NONE; } <del> // If it's the currently active editor we shouldn't do anything const activeEditor = group.activeEditor; const isActive = activeEditor ? activeEditor.matches(untypedEditor) : false; if (activeEditor && isActive) { return { editor: activeEditor, options, group }; } </del> const input = await this.doResolveEditor(untypedEditor, group, selectedEditor); if (conflictingDefault && input) { // Show the conflicting default dialog


import { EditorActivation, IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; <del> import { DEFAULT_EDITOR_ASSOCIATION, EditorCloseContext, EditorsOrder, IEditorCloseEvent, EditorInputWithOptions, IEditorPane, IResourceDiffEditorInput, isEditorInputWithOptions, IUntitledTextResourceEditorInput, IUntypedEditorInput, SideBySideEditor } from 'vs/workbench/common/editor'; </del> <ins> import { DEFAULT_EDITOR_ASSOCIATION, EditorCloseContext, EditorsOrder, IEditorCloseEvent, EditorInputWithOptions, IEditorPane, IResourceDiffEditorInput, isEditorInputWithOptions, IUntitledTextResourceEditorInput, IUntypedEditorInput, SideBySideEditor, isEditorInput } from 'vs/workbench/common/editor'; </ins> import { workbenchInstantiationService, TestServiceAccessor, registerTestEditor, TestFileEditorInput, ITestInstantiationService, registerTestResourceEditor, registerTestSideBySideEditor, createEditorPart, registerTestFileEditor, TestTextFileEditor, TestSingletonFileEditorInput } from 'vs/workbench/test/browser/workbenchTestServices'; import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; import { IEditorGroup, IEditorGroupsService, GroupDirection, GroupsArrangement } from 'vs/workbench/services/editor/common/editorGroupsService';


async function openEditor(editor: EditorInputWithOptions | IUntypedEditorInput, group?: PreferredGroup): Promise<IEditorPane | undefined> { if (useOpenEditors) { <ins> // The type safety isn't super good here, so we assist with runtime checks // Open editors expects untyped or editor input with options, you cannot pass a typed editor input // without options if (!isEditorInputWithOptions(editor) && isEditorInput(editor)) { editor = { editor: editor, options: {} }; } </ins> const panes = await service.openEditors([editor], group); return panes[0]; }


assert.ok(typedEditor instanceof TestFileEditorInput); assert.strictEqual(typedEditor?.resource?.toString(), untypedEditorReplacement.resource.toString()); <del> assert.strictEqual(editorFactoryCalled, 2); </del> <ins> assert.strictEqual(editorFactoryCalled, 3); </ins> assert.strictEqual(untitledEditorFactoryCalled, 0); assert.strictEqual(diffEditorFactoryCalled, 0);


assert.strictEqual(untitledEditorFactoryCalled, 0); assert.strictEqual(diffEditorFactoryCalled, 0); <del> assert.ok(!lastEditorFactoryEditor); </del> assert.ok(!lastUntitledEditorFactoryEditor); assert.ok(!lastDiffEditorFactoryEditor);


addNewLine?: boolean; } <ins> /** * A matcher that runs on a sub-section of a terminal command's output */ </ins> export interface ITerminalOutputMatcher { <ins> /** * A string or regex to match against the unwrapped line. */ </ins> lineMatcher: string | RegExp; <del> anchor?: 'top' | 'bottom'; offset?: number; length?: number; </del> <ins> /** * Which side of the output to anchor the {@link offset} and {@link length} against. */ anchor: 'top' | 'bottom'; /** * How far from either the top or the bottom of the butter to start matching against. */ offset: number; /** * The number of rows to match against, this should be as small as possible for performance * reasons. */ length: number; </ins> } export interface IXtermTerminal {


export function gitSimilarCommand(): ITerminalContextualActionOptions { return { commandLineMatcher: GitCommandLineRegex, <del> outputMatcher: { lineMatcher: GitSimilarOutputRegex, anchor: 'bottom' }, </del> <ins> outputMatcher: { lineMatcher: GitSimilarOutputRegex, anchor: 'bottom', offset: 0, length: 3 }, </ins> actionName: (matchResult: ContextualMatchResult) => matchResult.outputMatch ? `Run git ${matchResult.outputMatch[1]}` : ``, exitStatus: false, getActions: (matchResult: ContextualMatchResult, command: ITerminalCommand) => {


return { actionName: (matchResult: ContextualMatchResult) => matchResult.outputMatch ? `Free port ${matchResult.outputMatch[1]}` : '', commandLineMatcher: AnyCommandLineRegex, <del> outputMatcher: !isWindows ? { lineMatcher: FreePortOutputRegex, anchor: 'bottom' } : undefined, </del> <ins> // TODO: Support free port on Windows https://github.com/microsoft/vscode/issues/161775 outputMatcher: isWindows ? undefined : { lineMatcher: FreePortOutputRegex, anchor: 'bottom', offset: 0, length: 20 }, exitStatus: false, </ins> getActions: (matchResult: ContextualMatchResult, command: ITerminalCommand) => { const port = matchResult?.outputMatch?.[1]; if (!port) {


return { actionName: (matchResult: ContextualMatchResult) => matchResult.outputMatch ? `Git push ${matchResult.outputMatch[1]}` : '', commandLineMatcher: GitPushCommandLineRegex, <del> outputMatcher: { lineMatcher: GitPushOutputRegex, anchor: 'bottom' }, </del> <ins> outputMatcher: { lineMatcher: GitPushOutputRegex, anchor: 'bottom', offset: 0, length: 5 }, </ins> exitStatus: false, getActions: (matchResult: ContextualMatchResult, command: ITerminalCommand) => { const branch = matchResult?.outputMatch?.[1];


return { actionName: (matchResult: ContextualMatchResult) => matchResult.outputMatch ? `Create PR for ${matchResult.outputMatch[1]}` : '', commandLineMatcher: GitPushCommandLineRegex, <del> outputMatcher: { lineMatcher: GitCreatePrOutputRegex, anchor: 'bottom' }, </del> <ins> outputMatcher: { lineMatcher: GitCreatePrOutputRegex, anchor: 'bottom', offset: 0, length: 5 }, </ins> exitStatus: true, getActions: (matchResult: ContextualMatchResult, command?: ITerminalCommand) => { if (!command) {


choices.push(addToWorkspace); } <del> const result = await window.showInformationMessage(message, ...choices); </del> <ins> const result = await window.showInformationMessage(message, { modal: true }, ...choices); </ins> action = result === open ? PostCloneAction.Open : result === openNewWindow ? PostCloneAction.OpenNewWindow


"default": false, "description": "%config.rebaseWhenSync%" }, <del> "git.fetchBeforeCheckout": { </del> <ins> "git.pullBeforeCheckout": { </ins> "type": "boolean", "scope": "resource", "default": false, <del> "description": "%config.fetchBeforeCheckout%" </del> <ins> "description": "%config.pullBeforeCheckout%" </ins> }, "git.fetchOnPull": { "type": "boolean",


"config.rebaseWhenSync": "Force git to use rebase when running the sync command.", "config.confirmEmptyCommits": "Always confirm the creation of empty commits for the 'Git: Commit Empty' command.", "config.fetchOnPull": "When enabled, fetch all branches when pulling. Otherwise, fetch just the current one.", <del> "config.fetchBeforeCheckout": "Controls whether a branch that does not have outgoing commits is fast-forwarded before it is checked out.", </del> <ins> "config.pullBeforeCheckout": "Controls whether a branch that does not have outgoing commits is fast-forwarded before it is checked out.", </ins> "config.pullTags": "Fetch all tags when pulling.", "config.pruneOnFetch": "Prune when fetching.", "config.autoStash": "Stash any changes before pulling and restore them after successful pull.",


} const config = workspace.getConfiguration('git', Uri.file(this.repository.root)); <del> const fetchBeforeCheckout = config.get<boolean>('fetchBeforeCheckout', false) === true; </del> <ins> const pullBeforeCheckout = config.get<boolean>('pullBeforeCheckout', false) === true; </ins> <del> if (fetchBeforeCheckout) { </del> <ins> if (pullBeforeCheckout) { </ins> await this.repository.fastForwardBranch(this.ref.name!); }


import { sha1Hex } from 'vs/base/browser/hash'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; <ins> import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; </ins> registerSingleton(IEditSessionsLogService, EditSessionsLogService, InstantiationType.Delayed); registerSingleton(IEditSessionsStorageService, EditSessionsWorkbenchService, InstantiationType.Delayed);


@ILifecycleService private readonly lifecycleService: ILifecycleService, @IStorageService private readonly storageService: IStorageService, @IActivityService private readonly activityService: IActivityService, <ins> @IEditorService private readonly editorService: IEditorService, </ins> ) { super();


// Run the store action to get back a ref let ref: string | undefined; if (shouldStoreEditSession) { <del> ref = await that.progressService.withProgress({ location: ProgressLocation.Notification, type: 'syncing', title: localize('store your edit session', 'Storing your edit session...') }, async () => that.storeEditSession(false)); </del> <ins> ref = await that.storeEditSession(false); </ins> } let uri = workspaceUri ?? await that.pickContinueEditSessionDestination();


} else if (ref !== undefined) { this.notificationService.warn(localize('no edit session content for ref', 'Could not resume edit session contents for ID {0}.', ref)); } <del> this.logService.info(ref !== undefined ? `Aborting resuming edit session as no edit session content is available to be applied from ref ${ref}.` : `Aborting resuming edit session as no edit session content is available to be applied`); </del> <ins> this.logService.info(`Aborting resuming edit session as no edit session content is available to be applied from ref ${ref}.`); </ins> return; } const editSession = data.editSession;


const folders: Folder[] = []; let hasEdits = false; <ins> // Save all saveable editors before building edit session contents await this.editorService.saveAll(); </ins> for (const repository of this.scmService.repositories) { // Look through all resource groups and compute which files were added/modified/deleted const trackedUris = this.getChangedResources(repository); // A URI might appear in more than one resource group


import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; <ins> import { IEditorService, ISaveAllEditorsOptions } from 'vs/workbench/services/editor/common/editorService'; </ins> const folderName = 'test-folder'; const folderUri = URI.file(`/${folderName}`);


instantiationService.stub(ITextModelService, new class extends mock<ITextModelService>() { override registerTextModelContentProvider = () => ({ dispose: () => { } }); }); <ins> instantiationService.stub(IEditorService, new class extends mock<IEditorService>() { override saveAll = async (_options: ISaveAllEditorsOptions) => true; }); </ins> editSessionsContribution = instantiationService.createInstance(EditSessionsContribution); });


if (!state.conflicting && !state.isInputIncluded(inputNumber)) { result.push( !state.isInputIncluded(inputNumber) <del> ? command(localize('accept', "$(pass) Accept {0}", inputData.title), async () => { </del> <ins> ? command(localize('accept', "Accept {0}", inputData.title), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


); }); }) <del> : command(localize('remove', "$(error) Remove {0}", inputData.title), async () => { </del> <ins> : command(localize('remove', "Remove {0}", inputData.title), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


if (modifiedBaseRange.canBeCombined && state.isEmpty) { result.push( state.input1 && state.input2 <del> ? command(localize('removeBoth', "$(error) Remove Both"), async () => { </del> <ins> ? command(localize('removeBoth', "Remove Both"), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


); }); }) <del> : command(localize('acceptBoth', "$(pass) Accept Both"), async () => { </del> <ins> : command(localize('acceptBoth', "Accept Both"), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


const stateToggles: IContentWidgetAction[] = []; if (state.input1) { <del> result.push(command(localize('remove', "$(error) Remove {0}", model.input1.title), async () => { </del> <ins> result.push(command(localize('remove', "Remove {0}", model.input1.title), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


); } if (state.input2) { <del> result.push(command(localize('remove', "$(error) Remove {0}", model.input2.title), async () => { </del> <ins> result.push(command(localize('remove', "Remove {0}", model.input2.title), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


if (state.conflicting) { result.push( <del> command(localize('resetToBase', "$(error) Reset to base"), async () => { </del> <ins> command(localize('resetToBase', "Reset to base"), async () => { </ins> transaction((tx) => { model.setState( modifiedBaseRange,


justify-content: center; align-items: center; font-size: 14px; <del> line-height: 16px; </del> border-radius: 8px; }


*--------------------------------------------------------------------------------------------*/ import { Codicon } from 'vs/base/common/codicons'; <ins> import { basename } from 'vs/base/common/resources'; </ins> import { URI, UriComponents } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { ILocalizedString } from 'vs/platform/action/common/action';


if (viewModel.model.unhandledConflictsCount.get() > 0) { const confirmResult = await dialogService.confirm({ type: 'info', <del> message: localize('mergeEditor.acceptMerge.unhandledConflicts', "There are still unhandled conflicts. Are you sure you want to accept the merge?"), primaryButton: localize('mergeEditor.acceptMerge.unhandledConflicts.accept', "Complete merge with unhandled conflicts"), </del> <ins> message: localize('mergeEditor.acceptMerge.unhandledConflicts.message', "Do you want to complete the merge of {0}?", basename(inputModel.resultUri)), detail: localize('mergeEditor.acceptMerge.unhandledConflicts.detail', "The file contains unhandled conflicts."), primaryButton: localize('mergeEditor.acceptMerge.unhandledConflicts.accept', "Complete with Conflicts"), </ins> secondaryButton: localize('mergeEditor.acceptMerge.unhandledConflicts.cancel', "Cancel"), });


*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { Promises } from 'vs/base/node/pfs'; </del> import * as cp from 'child_process'; <del> import * as stream from 'stream'; import * as nls from 'vs/nls'; </del> import * as net from 'net'; <del> import * as path from 'vs/base/common/path'; import * as strings from 'vs/base/common/strings'; </del> <ins> import * as stream from 'stream'; </ins> import * as objects from 'vs/base/common/objects'; <ins> import * as path from 'vs/base/common/path'; </ins> import * as platform from 'vs/base/common/platform'; <del> import { ExtensionsChannelId } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IOutputService } from 'vs/workbench/services/output/common/output'; import { IDebugAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IDebugAdapterServer, IDebugAdapterNamedPipeServer } from 'vs/workbench/contrib/debug/common/debug'; </del> <ins> import * as strings from 'vs/base/common/strings'; import { Promises } from 'vs/base/node/pfs'; import * as nls from 'vs/nls'; </ins> import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; <ins> import { IDebugAdapterExecutable, IDebugAdapterNamedPipeServer, IDebugAdapterServer, IDebuggerContribution, IPlatformSpecificAdapterContribution } from 'vs/workbench/contrib/debug/common/debug'; </ins> import { AbstractDebugAdapter } from '../common/abstractDebugAdapter'; /**


private serverProcess: cp.ChildProcess | undefined; <del> constructor(private adapterExecutable: IDebugAdapterExecutable, private debugType: string, private readonly outputService?: IOutputService) { </del> <ins> constructor(private adapterExecutable: IDebugAdapterExecutable, private debugType: string) { </ins> super(); }


this._onError.fire(error); }); <del> const outputService = this.outputService; if (outputService) { const sanitize = (s: string) => s.toString().replace(/r?n$/mg, ''); // this.serverProcess.stdout.on('data', (data: string) => { // 	console.log('%c' + sanitize(data), 'background: #ddd; font-style: italic;'); // }); this.serverProcess.stderr!.on('data', (data: string) => { const channel = outputService.getChannel(ExtensionsChannelId); channel?.append(sanitize(data)); }); } else { this.serverProcess.stderr!.resume(); } </del> <ins> this.serverProcess.stderr!.resume(); </ins> // finally connect to the DA this.connect(this.serverProcess.stdout!, this.serverProcess.stdin!);


const fs = require('fs'); const cp = require('child_process'); const yarnVersion = cp.execSync('yarn -v', { encoding: 'utf8' }).trim(); <del> const parsedYarnVersion = /^(d+).(d+)./.exec(yarnVersion); </del> <ins> const parsedYarnVersion = /^(d+).(d+).(d+)/.exec(yarnVersion); </ins> const majorYarnVersion = parseInt(parsedYarnVersion[1]); const minorYarnVersion = parseInt(parsedYarnVersion[2]); <del> if (majorYarnVersion < 1 || minorYarnVersion < 10) { console.error('033[1;31m*** Please use yarn >=1.10.1.033[0;0m'); </del> <ins> const patchYarnVersion = parseInt(parsedYarnVersion[3]); if ( majorYarnVersion < 1 || majorYarnVersion === 1 && ( minorYarnVersion < 10 || (minorYarnVersion === 10 && patchYarnVersion < 1) ) || majorYarnVersion >= 2 ) { console.error('033[1;31m*** Please use yarn >=1.10.1 and <2.033[0;0m'); </ins> err = true; }


} } <del> const LINK_REGEX = /[([^]]+)](((?:https?://|command:|file:)[^)s]+)(?: ("|')([^3]+)(3))?)/gi; </del> <ins> const LINK_REGEX = /[([^]]+)](((?:https?://|command:|file:)[^)s]+)(?: (["'])(.+?)(3))?)/gi; </ins> export function parseLinkedText(text: string): LinkedText { const result: LinkedTextNode[] = [];


'...' ]); }); <ins> test('Should match non-greedily', () => { assert.deepStrictEqual(parseLinkedText('a [link text 1](http://link.href "title1") b [link text 2](http://link.href "title2") c').nodes, [ 'a ', { label: 'link text 1', href: 'http://link.href', title: 'title1' }, ' b ', { label: 'link text 2', href: 'http://link.href', title: 'title2' }, ' c', ]); }); </ins> });


this.instantiationService.createInstance(ReloadAction), this.instantiationService.createInstance(ExtensionStatusLabelAction), this.instantiationService.createInstance(ActionWithDropDownAction, 'extensions.updateActions', '', <del> [[this.instantiationService.createInstance(UpdateAction)], [this.instantiationService.createInstance(SkipUpdateAction)]]), </del> <ins> [[this.instantiationService.createInstance(UpdateAction, true)], [this.instantiationService.createInstance(SkipUpdateAction)]]), </ins> this.instantiationService.createInstance(SetColorThemeAction), this.instantiationService.createInstance(SetFileIconThemeAction), this.instantiationService.createInstance(SetProductIconThemeAction),


export class UpdateAction extends AbstractUpdateAction { constructor( <ins> private readonly verbose: boolean, </ins> @IExtensionsWorkbenchService override readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService protected readonly instantiationService: IInstantiationService, ) { super(`extensions.update`, localize('update', "Update"), extensionsWorkbenchService); } <ins> override update(): void { super.update(); if (this.extension) { this.label = this.verbose ? localize('update to', "Update to v{0}", this.extension.latestVersion) : localize('update', "Update"); } } </ins> override async run(): Promise<any> { if (!this.extension) { return;


actionbar.onDidRun(({ error }) => error && this.notificationService.error(error)); const extensionStatusIconAction = this.instantiationService.createInstance(ExtensionStatusAction); <del> const reloadAction = this.instantiationService.createInstance(ReloadAction); </del> const actions = [ this.instantiationService.createInstance(ExtensionStatusLabelAction), this.instantiationService.createInstance(MigrateDeprecatedExtensionAction, true), <del> reloadAction, </del> <ins> this.instantiationService.createInstance(ReloadAction), </ins> this.instantiationService.createInstance(ActionWithDropDownAction, 'extensions.updateActions', '', <del> [[this.instantiationService.createInstance(UpdateAction)], [this.instantiationService.createInstance(SkipUpdateAction)]]), </del> <ins> [[this.instantiationService.createInstance(UpdateAction, false)], [this.instantiationService.createInstance(SkipUpdateAction)]]), </ins> this.instantiationService.createInstance(InstallDropdownAction), this.instantiationService.createInstance(InstallingLabelAction), this.instantiationService.createInstance(SetLanguageAction),


this.instantiationService.createInstance(SwitchToPreReleaseVersionAction, true), this.instantiationService.createInstance(ManageExtensionAction) ]; <del> const extensionHoverWidget = this.instantiationService.createInstance(ExtensionHoverWidget, { target: root, position: this.options.hoverOptions.position }, extensionStatusIconAction, reloadAction); </del> <ins> const extensionHoverWidget = this.instantiationService.createInstance(ExtensionHoverWidget, { target: root, position: this.options.hoverOptions.position }, extensionStatusIconAction); </ins> const widgets = [ recommendationWidget,


import { EnablementState, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { ILabelService } from 'vs/platform/label/common/label'; <del> import { extensionButtonProminentBackground, ExtensionStatusAction, ReloadAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; </del> <ins> import { extensionButtonProminentBackground, ExtensionStatusAction } from 'vs/workbench/contrib/extensions/browser/extensionsActions'; </ins> import { IThemeService, ThemeIcon, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EXTENSION_BADGE_REMOTE_BACKGROUND, EXTENSION_BADGE_REMOTE_FOREGROUND } from 'vs/workbench/common/theme'; import { Emitter, Event } from 'vs/base/common/event';


constructor( private readonly options: ExtensionHoverOptions, private readonly extensionStatusAction: ExtensionStatusAction, <del> private readonly reloadAction: ReloadAction, </del> @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IHoverService private readonly hoverService: IHoverService, @IConfigurationService private readonly configurationService: IConfigurationService,


markdown.appendText(`n`); } <ins> if (this.extension.outdated) { markdown.appendMarkdown(localize('updateRequired', "Latest version:")); markdown.appendMarkdown(` <span style="background-color:#8080802B;">** _v${this.extension.latestVersion}_** </span>`); markdown.appendText(`n`); } </ins> const preReleaseMessage = ExtensionHoverWidget.getPreReleaseMessage(this.extension); const extensionRuntimeStatus = this.extensionsWorkbenchService.getExtensionStatus(this.extension); const extensionStatus = this.extensionStatusAction.status; <del> const reloadRequiredMessage = this.reloadAction.enabled ? this.reloadAction.tooltip : ''; </del> <ins> const reloadRequiredMessage = this.extension.reloadRequiredStatus; </ins> const recommendationMessage = this.getRecommendationMessage(this.extension); if (extensionRuntimeStatus || extensionStatus || reloadRequiredMessage || recommendationMessage || preReleaseMessage) {


"update-grammar": "node ../node_modules/vscode-grammar-updater/bin dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json" }, "contributes": { <ins> "configurationDefaults": { "[csharp]": { "editor.maxTokenizationLineLength": 2500 } }, </ins> "languages": [ { "id": "csharp",


private expandedSize: number | undefined = undefined; private _headerVisible = true; <ins> private _bodyRendered = false; </ins> private _minimumBodySize: number; private _maximumBodySize: number; private _ariaHeaderLabel: string;


this.updateHeader(); if (expanded) { <ins> if (!this._bodyRendered) { this.renderBody(this.body); this._bodyRendered = true; } </ins> if (typeof this.animationTimer === 'number') { clearTimeout(this.animationTimer); }


}); this.body = append(this.element, $('.pane-body')); <del> this.renderBody(this.body); </del> <ins> // Only render the body if it will be visible // Otherwise, render it when the pane is expanded if (!this._bodyRendered && this.isExpanded()) { this.renderBody(this.body); this._bodyRendered = true; } </ins> if (!this.isExpanded()) { this.body.remove();


readonly model = this.viewModel.map(m => /** @description model */ m?.model); protected readonly htmlElements = h('div.code-view', [ <del> h('div.title@header', [ </del> <ins> h('div.header@header', [ </ins> h('span.title@title'), h('span.description@description'), h('span.detail@detail'),


*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> .monaco-workbench .merge-editor .code-view>.title { </del> <ins> .monaco-workbench .merge-editor .code-view > .header { </ins> padding: 0 10px; height: 30px; display: flex; align-content: center; <ins> overflow: hidden; </ins> } <del> .monaco-workbench .merge-editor .code-view>.title>SPAN { </del> <ins> .monaco-workbench .merge-editor .code-view > .header > span { </ins> align-self: center; text-overflow: ellipsis; overflow: hidden;


white-space: nowrap; } <del> .monaco-workbench .merge-editor .code-view>.title>SPAN.title { </del> <ins> .monaco-workbench .merge-editor .code-view > .header > span.title { </ins> flex-shrink: 0; } <del> .monaco-workbench .merge-editor .code-view>.title>SPAN.description { </del> <ins> .monaco-workbench .merge-editor .code-view > .header > span.description { flex-shrink: 0; </ins> display: flex; font-size: 12px; align-items: center; color: var(--vscode-descriptionForeground); } <del> .monaco-workbench .merge-editor .code-view>.title>SPAN.description .codicon { </del> <ins> .monaco-workbench .merge-editor .code-view > .header > span.description .codicon { </ins> font-size: 14px; color: var(--vscode-descriptionForeground); } <del> .monaco-workbench .merge-editor .code-view>.title>SPAN.detail { </del> <ins> .monaco-workbench .merge-editor .code-view > .header > span.detail { </ins> margin-left: auto; <del> flex-shrink: 0; </del> font-size: 12px; color: var(--vscode-descriptionForeground); } <ins> .monaco-workbench .merge-editor .code-view > .header > span.detail .codicon { font-size: 13px; } </ins> /* for input1|2 -> align details to the left  */ <del> .monaco-workbench .merge-editor .code-view.input>.title>SPAN.detail::before { </del> <ins> .monaco-workbench .merge-editor .code-view.input > .header > span.detail::before { </ins> content: '•'; opacity: .5; padding-right: 3px; } <del> .monaco-workbench .merge-editor .code-view.input>.title>SPAN.detail { </del> <ins> .monaco-workbench .merge-editor .code-view.input > .header > span.detail { </ins> margin-left: 0; } <del> .monaco-workbench .merge-editor .code-view.input>.title>SPAN.toolbar { </del> <ins> .monaco-workbench .merge-editor .code-view.input > .header > span.toolbar { flex-shrink: 0; </ins> margin-left: auto; } <del> .monaco-workbench .merge-editor .code-view>.title>SPAN.detail .codicon { font-size: 13px; } .monaco-workbench .merge-editor .code-view>.container { </del> <ins> .monaco-workbench .merge-editor .code-view > .container { </ins> display: flex; flex-direction: row; } <del> .monaco-workbench .merge-editor .code-view>.container>.gutter { </del> <ins> .monaco-workbench .merge-editor .code-view > .container > .gutter { </ins> width: 24px; position: relative; overflow: hidden;


flex-grow: 0; } <del> .merge-editor-diff { </del> <ins> .monaco-workbench .merge-editor .merge-editor-diff { </ins> background-color: var(--vscode-mergeEditor-change-background); } <del> .merge-editor-diff-word { </del> <ins> .monaco-workbench .merge-editor .merge-editor-diff-word { </ins> background-color: var(--vscode-mergeEditor-change-word-background); } /* BEGIN: .merge-editor-block */ <del> .merge-editor-block:not(.handled) { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block:not(.handled) { </ins> background-color: var(--vscode-mergeEditor-conflict-unhandledUnfocused-background); } <del> .merge-editor-block:not(.handled):not(.focused) { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block:not(.handled):not(.focused) { </ins> border: 1px solid var(--vscode-mergeEditor-conflict-unhandledUnfocused-border); } <del> .merge-editor-block:not(.handled).focused { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block:not(.handled).focused { </ins> border: 2px solid var(--vscode-mergeEditor-conflict-unhandledFocused-border); } <del> .merge-editor-block.handled:not(.focused) { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block.handled:not(.focused) { </ins> border: 1px solid var(--vscode-mergeEditor-conflict-handledUnfocused-border); } <del> .merge-editor-block.handled:not(.focused).conflicting { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block.handled:not(.focused).conflicting { </ins> background-color: var(--vscode-mergeEditor-conflict-handledUnfocused-background); } <del> .merge-editor-block.handled.focused { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block.handled.focused { </ins> border: 1px solid var(--vscode-mergeEditor-conflict-handledFocused-border); } <del> .merge-editor-block.handled.focused.conflicting { </del> <ins> .monaco-workbench .merge-editor .merge-editor-block.handled.focused.conflicting { </ins> background-color: var(--vscode-mergeEditor-conflict-handledFocused-background); } <del> .merge-editor-simplified.input.i1, .merge-editor-block.use-simplified-decorations.input.i1 { </del> <ins> .monaco-workbench .merge-editor .merge-editor-simplified.input.i1, .merge-editor-block.use-simplified-decorations.input.i1 { </ins> background-color: var(--vscode-mergeEditor-conflict-input1-background); } <del> .merge-editor-simplified.input.i2, .merge-editor-block.use-simplified-decorations.input.i2 { </del> <ins> .monaco-workbench .merge-editor .merge-editor-simplified.input.i2, .merge-editor-block.use-simplified-decorations.input.i2 { </ins> background-color: var(--vscode-mergeEditor-conflict-input2-background); } /* END: .merge-editor-block */ <del> .gutter.monaco-editor>div { </del> <ins> .gutter.monaco-editor > div { </ins> position: absolute; }


color: var(--vscode-editorCodeLens-foreground) } <del> .merge-editor-conflict-actions>span, .merge-editor-conflict-actions>a { </del> <ins> .merge-editor-conflict-actions > span, .merge-editor-conflict-actions > a { </ins> user-select: none; -webkit-user-select: none; white-space: nowrap; } <del> .merge-editor-conflict-actions>a { </del> <ins> .merge-editor-conflict-actions > a { </ins> text-decoration: none; } <del> .merge-editor-conflict-actions>a:hover { </del> <ins> .merge-editor-conflict-actions > a:hover { </ins> cursor: pointer; color: var(--vscode-editorLink-activeForeground) !important; } <del> .merge-editor-conflict-actions>a:hover .codicon { </del> <ins> .merge-editor-conflict-actions > a:hover .codicon { </ins> color: var(--vscode-editorLink-activeForeground) !important; }


color: var(--vscode-editorCodeLens-foreground); } <del> .merge-editor-conflict-actions>a:hover .codicon::before { </del> <ins> .merge-editor-conflict-actions > a:hover .codicon::before { </ins> cursor: pointer; }


import { $, addDisposableListener, append, EventHelper, EventType } from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventType as GestureEventType, Gesture } from 'vs/base/browser/touch'; <del> import { AnchorAlignment, IAnchor, IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; </del> <ins> import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; </ins> import { IMenuOptions } from 'vs/base/browser/ui/menu/menu'; import { ActionRunner, IAction } from 'vs/base/common/actions'; import { Emitter } from 'vs/base/common/event';


(container: HTMLElement): IDisposable | null; } <del> export interface IBaseDropdownOptions { </del> <ins> interface IBaseDropdownOptions { </ins> label?: string; labelRenderer?: ILabelRenderer; } <del> export class BaseDropdown extends ActionRunner { </del> <ins> class BaseDropdown extends ActionRunner { </ins> private _element: HTMLElement; private boxContainer?: HTMLElement; private _label?: HTMLElement;


} } <del> export interface IDropdownOptions extends IBaseDropdownOptions { contextViewProvider: IContextViewProvider; } export class Dropdown extends BaseDropdown { private contextViewProvider: IContextViewProvider; constructor(container: HTMLElement, options: IDropdownOptions) { super(container, options); this.contextViewProvider = options.contextViewProvider; } override show(): void { super.show(); this.element.classList.add('active'); this.contextViewProvider.showContextView({ getAnchor: () => this.getAnchor(), render: (container) => { return this.renderContents(container); }, onDOMEvent: (e, activeElement) => { this.onEvent(e, activeElement); }, onHide: () => this.onHide() }); } protected getAnchor(): HTMLElement | IAnchor { return this.element; } protected onHide(): void { this.element.classList.remove('active'); } override hide(): void { super.hide(); this.contextViewProvider?.hideContextView(); } protected renderContents(container: HTMLElement): IDisposable | null { return null; } } </del> export interface IActionProvider { getActions(): readonly IAction[]; }


} <del> export function findValidPasteFileTarget(explorerService: IExplorerService, targetFolder: ExplorerItem, fileToPaste: { resource: URI; isDirectory?: boolean; allowOverwrite: boolean }, incrementalNaming: 'simple' | 'smart' | 'disabled'): URI { let name = resources.basenameOrAuthority(fileToPaste.resource); </del> <ins> export async function findValidPasteFileTarget( explorerService: IExplorerService, fileService: IFileService, dialogService: IDialogService, targetFolder: ExplorerItem, fileToPaste: { resource: URI; isDirectory?: boolean; allowOverwrite: boolean }, incrementalNaming: 'simple' | 'smart' | 'disabled' ): Promise<URI | undefined> { let name = resources.basenameOrAuthority(fileToPaste.resource); </ins> let candidate = resources.joinPath(targetFolder.resource, name); <ins> // In the disabled case we must ask if it's ok to overwrite the file if it exists if (incrementalNaming === 'disabled') { const canOverwrite = await askForOverwrite(fileService, dialogService, candidate); if (!canOverwrite) { return; } } </ins> while (true && !fileToPaste.allowOverwrite) { if (!explorerService.findClosest(candidate)) { break;


target = element.isDirectory ? element : element.parent!; } <del> const targetFile = findValidPasteFileTarget(explorerService, target, { resource: fileToPaste, isDirectory: fileToPasteStat.isDirectory, allowOverwrite: pasteShouldMove || incrementalNaming === 'disabled' }, incrementalNaming); if (incrementalNaming === 'disabled') { const canOverwrite = await askForOverwrite(fileService, dialogService, targetFile); if (!canOverwrite) { return; } </del> <ins> const targetFile = await findValidPasteFileTarget( explorerService, fileService, dialogService, target, { resource: fileToPaste, isDirectory: fileToPasteStat.isDirectory, allowOverwrite: pasteShouldMove || incrementalNaming === 'disabled' }, incrementalNaming ); if (!targetFile) { return undefined; </ins> } return { source: fileToPaste, target: targetFile };


if (sourceTargetPairs.length >= 1) { // Move/Copy File if (pasteShouldMove) { <del> const resourceFileEdits = sourceTargetPairs.map(pair => new ResourceFileEdit(pair.source, pair.target)); </del> <ins> const resourceFileEdits = sourceTargetPairs.map(pair => new ResourceFileEdit(pair.source, pair.target, { overwrite: incrementalNaming === 'disabled' })); </ins> const options = { confirmBeforeUndo: configurationService.getValue<IFilesConfiguration>().explorer.confirmUndo === UndoConfirmLevel.Verbose, progressLabel: sourceTargetPairs.length > 1 ? nls.localize({ key: 'movingBulkEdit', comment: ['Placeholder will be replaced by the number of files being moved'] }, "Moving {0} files", sourceTargetPairs.length)


// Reuse duplicate action when user copies const explorerConfig = this.configurationService.getValue<IFilesConfiguration>().explorer; <del> const resourceFileEdits = sources.map(({ resource, isDirectory }) => (new ResourceFileEdit(resource, findValidPasteFileTarget(this.explorerService, target, { resource, isDirectory, allowOverwrite: false }, explorerConfig.incrementalNaming), { copy: true }))); </del> <ins> const resourceFileEdits: ResourceFileEdit[] = []; for (const { resource, isDirectory } of sources) { const allowOverwrite = explorerConfig.incrementalNaming === 'disabled'; const newResource = await findValidPasteFileTarget(this.explorerService, this.fileService, this.dialogService, target, { resource, isDirectory, allowOverwrite }, explorerConfig.incrementalNaming ); if (!newResource) { continue; } const resourceEdit = new ResourceFileEdit(resource, newResource, { copy: true, overwrite: allowOverwrite }); resourceFileEdits.push(resourceEdit); } </ins> const labelSufix = getFileOrFolderLabelSufix(sources); await this.explorerService.applyBulkEdit(resourceFileEdits, { confirmBeforeUndo: explorerConfig.confirmUndo === UndoConfirmLevel.Default || explorerConfig.confirmUndo === UndoConfirmLevel.Verbose,


.monaco-workbench .notebookOverlay .output { position: absolute; height: 0px; <del> font-size: var(--notebook-cell-output-font-size); </del> user-select: text; -webkit-user-select: text; cursor: auto;


insertToolbarPosition, insertToolbarAlignment, fontSize, <ins> outputFontSize, </ins> focusIndicatorLeftMargin, focusIndicatorGap } = this._notebookOptions.getLayoutConfiguration();


const fontFamily = this._generateFontFamily(); styleSheets.push(` <del> :root { --notebook-cell-output-font-size: ${fontSize}px; --notebook-cell-output-font-family: ${fontFamily}; </del> <ins> .notebook-editor { --notebook-cell-output-font-size: ${outputFontSize}px; </ins> --notebook-cell-input-preview-font-size: ${fontSize}px; --notebook-cell-input-preview-font-family: ${fontFamily}; }


import { ILogService } from 'vs/platform/log/common/log'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; <ins> import { isObject, isString } from 'vs/base/common/types'; import { Schemas } from 'vs/base/common/network'; </ins> interface IStoredProfileExtension { identifier: IExtensionIdentifier; <del> location: UriComponents; </del> <ins> location: UriComponents | string; </ins> version: string; metadata?: Metadata; }


if (!Array.isArray(storedProfileExtensions)) { throw new Error(`Invalid extensions content in ${file.toString()}`); } <ins> // TODO @sandy081: Remove this migration after couple of releases let migrate = false; </ins> for (const e of storedProfileExtensions) { if (!isStoredProfileExtension(e)) { throw new Error(`Invalid extensions content in ${file.toString()}`); } <ins> let location: URI; if (isString(e.location)) { location = this.resolveExtensionLocation(file, e.location); } else { location = URI.revive(e.location); const relativePath = this.toRelativePath(file, location); if (relativePath) { migrate = true; e.location = relativePath; } } </ins> extensions.push({ identifier: e.identifier, <del> location: URI.revive(e.location), </del> <ins> location, </ins> version: e.version, metadata: e.metadata, }); } <ins> if (migrate) { await this.fileService.writeFile(file, VSBuffer.fromString(JSON.stringify(storedProfileExtensions))); } </ins> } // Update


const storedProfileExtensions: IStoredProfileExtension[] = extensions.map(e => ({ identifier: e.identifier, version: e.version, <del> location: e.location.toJSON(), </del> <ins> location: this.toRelativePath(file, e.location) ?? e.location.toJSON(), </ins> metadata: e.metadata })); await this.fileService.writeFile(file, VSBuffer.fromString(JSON.stringify(storedProfileExtensions)));


}); } <ins> private toRelativePath(extensionsProfileLocation: URI, extensionLocation: URI): string | undefined { // Extension Profile location scheme is always vscode-userdata and Extension location scheme is always file // Hence we need to convert the Extension Profile location scheme to file to resolve the relative path const parent = this.uriIdentityService.extUri.dirname(extensionsProfileLocation).with({ scheme: Schemas.file }); if (this.uriIdentityService.extUri.isEqualOrParent(extensionLocation, parent)) { return this.uriIdentityService.extUri.relativePath(parent, extensionLocation); } return undefined; } private resolveExtensionLocation(extensionsProfileLocation: URI, path: string): URI { // Extension Profile location scheme is always vscode-userdata and Extension location scheme is always file // Hence we need to convert the Extension Profile location scheme to file to resolve extension location return this.uriIdentityService.extUri.joinPath(this.uriIdentityService.extUri.dirname(extensionsProfileLocation), path).with({ scheme: Schemas.file }); } </ins> private _migrationPromise: Promise<IStoredProfileExtension[] | undefined> | undefined; private async migrateFromOldDefaultProfileExtensionsLocation(): Promise<IStoredProfileExtension[] | undefined> { if (!this._migrationPromise) {