jiebi/CodeConvo huggingface dataset:
Change:
Testing Notice the white horizontal lines inside the diff decorations. This looks like bad rendering In the editor diff this does not happen. ! !
Fixed via We should be using instead of .

Discussion:
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { fixedDiffEditorOptions, fixedEditorOptions, fixedEditorPadding } from 'vs/workbench/contrib/notebook/browser/diff/diffCellEditorOptions'; export function getOptimizedNestedCodeEditorWidgetOptions(): ICodeEditorWidgetOptions { return { isSimpleWidget: false,

for (let i = 0; i < this._diffElementViewModels.length; i++) { const element = this._diffElementViewModels[i]; <del> const cellHeight = (element.layoutInfo.totalHeight / scrollHeight) * ratio * height; </del> <ins> const cellHeight = Math.round((element.layoutInfo.totalHeight / scrollHeight) * ratio * height); </ins> switch (element.type) { case 'insert':
Change:
Testing Scroll a bit in the notebook diff. Notice that the current location rectangle is not always right. Notice that the first and last line are not straight. !
I can still get a tiny misalignment in the text diff scrollbars, not sure if it's the same scenario: <img width="115" alt="image" src="https://user-"
<img width="985" alt="image" src="https://user-"How do I get that custom scrollbar in the notebook diff editor? I see a regular scrollbar

Discussion:
private _scheduleRender(): void { if (this._renderAnimationFrame === null) { <del> this._renderAnimationFrame = DOM.runAtThisOrScheduleAtNextAnimationFrame(this._onRenderScheduled.bind(this), 100); </del> <ins> this._renderAnimationFrame = DOM.runAtThisOrScheduleAtNextAnimationFrame(this._onRenderScheduled.bind(this), 16); </ins> } }

const computedRepresentableSize = Math.max(0, computedAvailableSize - 2 * 0); const computedRatio = scrollHeight > 0 ? (computedRepresentableSize / scrollHeight) : 0; <del> const computedSliderSize = Math.max(0, Math.floor(layoutInfo.height * computedRatio)); const computedSliderPosition = Math.floor(scrollTop * computedRatio); </del> <ins> const computedSliderSize = Math.max(0, Math.round(layoutInfo.height * computedRatio)); const computedSliderPosition = Math.round(scrollTop * computedRatio); </ins> return { height: computedSliderSize,
Change:
Testing an extension that logs some infos and some debugs. the extensions log and see the infos "Developer: Set Log Level..." and choose "Debug" something in the extension that causes the debug logs to happen. at the log again and see that the debug logs are not there.
Error and trace also don't log.

Discussion:
readonly extension: IExtensionDescription, ) { super(); <ins> this._register(logger.onDidChangeLogLevel(level => this.setLevel(level))); </ins> } appendLine(value: string): void {

...this.createExtHostOutputChannel(name, channelPromise), trace(value: string, ...args: any[]): void { validate(); <del> channelPromise.then(channel => channel.info(value, ...args)); </del> <ins> channelPromise.then(channel => channel.trace(value, ...args)); </ins> }, debug(value: string, ...args: any[]): void { validate();
Change:
a session which was opted into an experiment (eg Control Center) experiments Experiment is still running. (eg Control Center is still rendered) ! !
I think reload is required for the experiment to be disabled. Have you?
If reload is required, we should leverage the mechanism that prompts the user to reload, whenever the setting changes.

Discussion:
editor?: { accessibilitySupport?: 'on' | 'off' | 'auto' }; security?: { workspace?: { trust?: { enabled?: boolean } } }; window: IWindowSettings & { experimental?: { windowControlsOverlay?: { enabled?: boolean }; useSandbox?: boolean } }; <del> workbench?: { experimental?: { settingsProfiles?: { enabled?: boolean } } }; </del> <ins> workbench?: { experimental?: { settingsProfiles?: { enabled?: boolean } }; enableExperiments?: boolean }; </ins> } export class SettingsChangeRelauncher extends Disposable implements IWorkbenchContribution {

private accessibilitySupport: 'on' | 'off' | 'auto' | undefined; private workspaceTrustEnabled: boolean | undefined; private settingsProfilesEnabled: boolean | undefined; <ins> private experimentsEnabled: boolean | undefined; </ins> constructor( @IHostService private readonly hostService: IHostService,

changed = true; } <ins> // Experiments if (typeof config.workbench?.enableExperiments === 'boolean' && config.workbench.enableExperiments !== this.experimentsEnabled) { this.experimentsEnabled = config.workbench.enableExperiments; changed = true; } </ins> // Notify only when changed and we are the focused window (avoids notification spam across windows) if (notify && changed) { this.doConfirm(
Change:
I don't think that's the same issue. Here's a recording: https://user- Originally posted by in
had you cleared the terminal?
can reproduce after clearing the terminal on windows via EDIT: only works when the lightbulb is on the very bottom of the terminal - we have the wrong line demand it seems / offset
here's the only place it works for me on windows !
probably something wrong/unexpected happening with the constraints !
the problem is the lightbulb doesn't show? What's the problem there?
I had cleared that terminal, but this reproduces for me on a fresh terminal without clearing
Ah, I broke this for all platforms in

Discussion:
export const GitCommandLineRegex = /git/; export const GitPushCommandLineRegex = /gits+push/; export const AnyCommandLineRegex = /.+/; <del> export const GitSimilarOutputRegex = /most similar command iss+([^s]{3,})/; </del> <ins> export const GitSimilarOutputRegex = /most similar command iss*([^s]{3,})/; </ins> export const FreePortOutputRegex = /address already in use d.d.d.d:(dddd)|Unable to bind [^ ]*:(d+)|can't listen on port (d+)|listen EADDRINUSE [^ ]*:(d+)/; export const GitPushOutputRegex = /git push --set-upstream origin ([^s]+)/; export const GitCreatePrOutputRegex = /Create a pull request for '([^s]+)' on GitHub by visiting:s*remote:s*(https:.+pull.+)/;
Change:
I think the border should be thicker and the color should have more contrast. <img width="881" alt="image" src="https://user-"
I think the thicker border is a little too heavy but agree that the light themes in particular suffer from a contrast issue. Do you think it's as much of a problem on the dark themes?
It works much better on the dark themes (maybe also because my code-oss uses dark theme)
Ok, I'll propose some updates this week
Before Light: ! Before Dark: ! After Light: ! After Dark: !

Discussion:
export const conflictBorderUnhandledUnfocused = registerColor( 'mergeEditor.conflict.unhandledUnfocused.border', <del> { dark: '#ffa6007a', light: '#ffa6007a', hcDark: '#ffa6007a', hcLight: '#ffa6007a', }, </del> <ins> { dark: '#ffa6007a', light: '#ffa600FF', hcDark: '#ffa6007a', hcLight: '#ffa6007a', }, </ins> localize('mergeEditor.conflict.unhandledUnfocused.border', 'The border color of unhandled unfocused conflicts.') );

} .merge-editor-block:not(.handled).focused { <del> border: 1px solid var(--vscode-mergeEditor-conflict-unhandledFocused-border); </del> <ins> border: 2px solid var(--vscode-mergeEditor-conflict-unhandledFocused-border); </ins> } .merge-editor-block.handled:not(.focused) {
Change:
<img width="869" alt="image" src="https://user-"
Is the issue the codelens column? That is still what I see <img width="305" alt="image" src="https://user-"
The issue is the missing space in base.
Like this: <img width="1483" alt="image" src="https://user-"

Discussion:
if (shouldAlignBase && baseViewZoneAccessor) { baseViewZoneIds.push(baseViewZoneAccessor.addZone({ <del> afterLineNumber, </del> <ins> afterLineNumber: m.left.baseRange.startLineNumber - 1, </ins> heightInPx: 16, domNode: $('div.conflict-actions-placeholder'), }));
Change:
Testing Related to , this notification blocks the button. Many users may never close it and will never see the merge editor button. !
Adding because this message isn't something the 3wm editor controls but something that comes out of git itself
With I have another option that allows user to show the SCM view/changes so that they can (1) get rid of the notification and (2) have a way to see all conflicts to handle them

Discussion:
case GitErrorCodes.Conflict: message = l10n.t('There are merge conflicts. Resolve them before committing.'); type = 'warning'; <ins> choices.set(l10n.t('Show Changes'), () => commands.executeCommand('workbench.view.scm')); </ins> options.modal = false; break; case GitErrorCodes.StashConflict: message = l10n.t('There were merge conflicts while applying the stash.'); <ins> choices.set(l10n.t('Show Changes'), () => commands.executeCommand('workbench.view.scm')); </ins> type = 'warning'; options.modal = false; break;
Change:
Testing This was feedback I heard from others too—"Accept Merge" is a bit strange since you aren't really accepting a merge so much as the individual changes. I think "Complete Merge" would make more sense here. <img width="265" alt="CleanShot 2022-09-27 at 11 50 56 src="https://user-"
Or maybe "Confirm Merge".
More ideas: I like this - I think "confirm" is usually used to approve an already stated intention and does not fully fit here. ideas?
"Complete Merge" and "Accept Merge" are the best options. I am leaning towards "Complete Merge". fyi
for "Complete Merge"

Discussion:
"command.api.getRepositories": "Get Repositories", "command.api.getRepositoryState": "Get Repository State", "command.api.getRemoteSources": "Get Remote Sources", <del> "command.git.acceptMerge": "Accept Merge", </del> <ins> "command.git.acceptMerge": "Complete Merge", </ins> "command.git.openMergeEditor": "Resolve in Merge Editor", "command.git.runGitMerge": "Compute Conflicts With Git", "command.git.runGitMergeDiff3": "Compute Conflicts With Git (Diff3)",

const repository = this.model.getRepository(uri); if (!repository) { <del> console.log(`FAILED to accept merge because uri ${uri.toString()} doesn't belong to any repository`); </del> <ins> console.log(`FAILED to complete merge because uri ${uri.toString()} doesn't belong to any repository`); </ins> return; }

// make sure to save the merged document const doc = workspace.textDocuments.find(doc => doc.uri.toString() === uri.toString()); if (!doc) { <del> console.log(`FAILED to accept merge because uri ${uri.toString()} doesn't match a document`); </del> <ins> console.log(`FAILED to complete merge because uri ${uri.toString()} doesn't match a document`); </ins> return; } if (doc.isDirty) {

title: { value: localize( 'mergeEditor.acceptMerge', <del> 'Accept Merge' </del> <ins> 'Complete Merge' </ins> ), <del> original: 'Accept Merge', </del> <ins> original: 'Complete Merge', </ins> }, f1: false, precondition: ctxIsMergeEditor

const confirmResult = await dialogService.confirm({ type: 'info', message: localize('mergeEditor.acceptMerge.unhandledConflicts', "There are still unhandled conflicts. Are you sure you want to accept the merge?"), <del> primaryButton: localize('mergeEditor.acceptMerge.unhandledConflicts.accept', "Accept merge with unhandled conflicts"), </del> <ins> primaryButton: localize('mergeEditor.acceptMerge.unhandledConflicts.accept', "Complete merge with unhandled conflicts"), </ins> secondaryButton: localize('mergeEditor.acceptMerge.unhandledConflicts.cancel', "Cancel"), });

constructor() { super({ id: 'workbench.userDataSync.actions.acceptMerges', <del> title: localize('accept merges title', "Accept Merge"), </del> <ins> title: localize('complete merges title', "Complete Merge"), </ins> menu: [{ id: MenuId.EditorContent, when: ContextKeyExpr.and(ctxIsMergeResultEditor, ContextKeyExpr.regex(ctxMergeBaseUri.key, new RegExp(`^${USER_DATA_SYNC_SCHEME}:`))),
Change:
I'll be honest, I made this profile a while ago so maybe I'm just in a bad state... but I get this: ! ! Testing
Hmm, I think this operation would still remove the profile instead of throwing an error.
Unfortunately, it doesn't delete it so I appear stuck with having this extra profile I made a while ago.
It seems I am not catching the error for tasks I do before removing the profile. They should not stop the remove operation. Fixing it. Please verify in tomorrows insiders if you can remove it.
Worked today!

Discussion:
joiners.push(promise); } }); <del> await Promises.settled(joiners); </del> <ins> try { await Promise.allSettled(joiners); } catch (error) { this.logService.error(error); } </ins> if (profile.id === this.profilesObject.emptyWindow?.id) { this.profilesObject.emptyWindow = undefined;
Change:
I don't know the codicons by heart. So I went with . Here's what I see: ! ! Can you validate if is valid? Or somehow show a better default? I'd prefer validation though. Testing

Discussion:
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { joinPath } from 'vs/base/common/resources'; <ins> import { Codicon } from 'vs/base/common/codicons'; </ins> export class UserDataProfilesWorkbenchContribution extends Disposable implements IWorkbenchContribution {

value: that.userDataProfileService.getShortName(profile), title: localize('change short name', "Change Short Name..."), validateInput: async (value: string) => { <del> if (profile.shortName !== value && !ThemeIcon.fromString(value) && charCount(value) > 2) { </del> <ins> if (profile.shortName === value) { return undefined; } const themeIcon = ThemeIcon.fromString(value); if (themeIcon) { if (Codicon.getAll().some(c => c.id === themeIcon.id)) { return undefined; } return localize('invalid codicon', "Invalid codicon. Please use a valid codicon id."); } if (charCount(value) > 2) { </ins> return localize('invalid short name', "Short name should be at most 2 characters long."); } return undefined;
Change:
Testing Possibly a regression since I thought this was fixed before. <img width="239" alt="CleanShot 2022-09-27 at 12 01 10 src="https://user-"

Discussion:
import { ThemeIcon } from 'vs/base/common/themables'; import { Disposable } from 'vs/base/common/lifecycle'; import { clamp } from 'vs/base/common/numbers'; <del> import { autorun, autorunWithStore, derived, IObservable, ISettableObservable, ITransaction, observableValue, transaction } from 'vs/base/common/observable'; </del> <ins> import { autorun, derived, IObservable, ISettableObservable, ITransaction, observableValue, transaction } from 'vs/base/common/observable'; </ins> import { noBreakWhitespace } from 'vs/base/common/strings'; import { isDefined } from 'vs/base/common/types'; import { EditorExtensionsRegistry, IEditorContributionDescription } from 'vs/editor/browser/editorExtensions';

this.htmlElements.root.classList.add(`input`); this._register( <del> autorunWithStore((reader, store) => { if (this.checkboxesVisible.read(reader)) { store.add( new EditorGutter(this.editor, this.htmlElements.gutterDiv, { getIntersectingGutterItems: (range, reader) => { return this.modifiedBaseRangeGutterItemInfos.read(reader); }, createView: (item, target) => new MergeConflictGutterItemView(item, target, contextMenuService), }) ); } }, 'update checkboxes') </del> <ins> new EditorGutter(this.editor, this.htmlElements.gutterDiv, { getIntersectingGutterItems: (range, reader) => { if (this.checkboxesVisible.read(reader)) { return this.modifiedBaseRangeGutterItemInfos.read(reader); } else { return []; } }, createView: (item, target) => new MergeConflictGutterItemView(item, target, contextMenuService), }) </ins> ); this._register(
Change:
Testing ! since macOS uses a native dialog... maybe just do on macOS?
It seems menus cannot render codicons, so falling back to use codicon id in this case.

Discussion:
const that = this; return registerAction2(class UpdateCurrentProfileShortName extends Action2 { constructor() { <ins> const shortName = that.userDataProfileService.getShortName(that.userDataProfileService.currentProfile); const themeIcon = ThemeIcon.fromString(shortName); </ins> super({ id: `workbench.profiles.actions.updateCurrentProfileShortName`, title: { <del> value: localize('change short name profile', "Change Short Name ({0})...", that.userDataProfileService.getShortName(that.userDataProfileService.currentProfile)), original: `Change Short Name (${that.userDataProfileService.currentProfile.shortName})...` </del> <ins> value: localize('change short name profile', "Change Short Name ({0})...", themeIcon?.id ?? shortName), original: `Change Short Name (${themeIcon?.id ?? shortName})...` </ins> }, menu: [ {
Change:
I have no repro steps and am on the default profile in web and desktop with settings sync enabled in both, but I have re-installed the GitHub Pull Requests and Issues extension three times today and am wondering if there is something happening in extensions land, settings sync, profiles, or something else. What is the best way to debug this further? Settings sync logs below:
Also it looks like I cannot install in web at all, if I click on Install Pre-release the install button says Installing and then goes back to Install Pre-release, but the extensions viewlet shows a progress indicator that never goes away
There is a bug already for it. I will look into it. Regarding an extension getting uninstalled, it would be great if you can share the settings sync log and shared process log from the machines.
I just hit this issue with profiles and settings sync enabled Desktop: Have two profiles (Default and Testing) Desktop: Install Github theme extension in both profiles Desktop: Enable Settings Sync and sync all Web () - Sync to get all profiles and extensions and be in Default profile Desktop: Go into Testing profile and uninstall Github theme extension and sync Web: Let the sync happen and in a moment Github theme extension gets uninstalled.

Discussion:
} if (this.servers.length > 1) { if (isLanguagePackExtension(extension.manifest)) { <del> return this.uninstallEverywhere(extension); </del> <ins> return this.uninstallEverywhere(extension, options); </ins> } return this.uninstallInServer(extension, server, options); } <del> return server.extensionManagementService.uninstall(extension); </del> <ins> return server.extensionManagementService.uninstall(extension, options); </ins> } <del> private async uninstallEverywhere(extension: ILocalExtension): Promise<void> { </del> <ins> private async uninstallEverywhere(extension: ILocalExtension, options?: UninstallOptions): Promise<void> { </ins> const server = this.getServer(extension); if (!server) { return Promise.reject(`Invalid location ${extension.location.toString()}`); } <del> const promise = server.extensionManagementService.uninstall(extension); </del> <ins> const promise = server.extensionManagementService.uninstall(extension, options); </ins> const otherServers: IExtensionManagementServer[] = this.servers.filter(s => s !== server); if (otherServers.length) { for (const otherServer of otherServers) { const installed = await otherServer.extensionManagementService.getInstalled(); extension = installed.filter(i => !i.isBuiltin && areSameExtensions(i.identifier, extension.identifier))[0]; if (extension) { <del> await otherServer.extensionManagementService.uninstall(extension); </del> <ins> await otherServer.extensionManagementService.uninstall(extension, options); </ins> } } }
Change:
Error while turning off settings sync ! Might happen when turning off settings sync while a sync is happening
Can't repro this anymore.

Discussion:
await this.userDataSyncService.resetLocal(); } } catch (error) { <ins> this.logService.error(error); </ins> if (softTurnOffOnError) { <del> this.logService.error(error); </del> this.updateEnablement(false); } else { throw error;

async resetLocal(): Promise<void> { this.checkEnablement(); this.storageService.remove(LAST_SYNC_TIME_KEY, StorageScope.APPLICATION); <del> if (this.activeProfileSynchronizers) { for (const [synchronizer] of this.activeProfileSynchronizers.values()) { try { await synchronizer.resetLocal(); } catch (e) { this.logService.error(e); } </del> <ins> for (const [synchronizer] of this.activeProfileSynchronizers.values()) { try { await synchronizer.resetLocal(); } catch (e) { this.logService.error(e); </ins> } <del> this.clearActiveProfileSynchronizers(); </del> } <ins> this.clearActiveProfileSynchronizers(); </ins> this._onDidResetLocal.fire(); this.logService.info('Did reset the local sync state.'); }
Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes/No <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: 1.71.2 (system setup) OS Version: Windows_NT x64 10.0. Steps to Reproduce: When i run command, i don't know whether it is complete or not. There is no circle loading animation. !
It looks like, it was not do show progress while the operation is being executed. Thinking about it, I do think that if one has auto-fetch enabled it might be quite distracting to show progress every time the fetch operation is being run as part of auto-fetch. Having said that, I do think that it makes sense to show progress when is being executed explicitly. thoughts?
Agree.
Consider adding an option to decide whether to turn on the feature?
this progress indicator during a manual fetch would honour the setting.
Thank you, hope see the feature soon.

Discussion:
try { if (this._fetchAll) { <del> await this.repository.fetchAll(); </del> <ins> await this.repository.fetchAll({ silent: true }); </ins> } else { await this.repository.fetchDefault({ silent: true }); }

Reset = 'Reset', Remote = 'Remote', Fetch = 'Fetch', <ins> FetchNoProgress = 'FetchNoProgress', </ins> Pull = 'Pull', Push = 'Push', CherryPick = 'CherryPick',

function shouldShowProgress(operation: Operation): boolean { switch (operation) { <del> case Operation.Fetch: </del> <ins> case Operation.FetchNoProgress: </ins> case Operation.CheckIgnore: case Operation.GetObjectDetails: case Operation.Show:

} @throttle <del> async fetchAll(cancellationToken?: CancellationToken): Promise<void> { await this._fetch({ all: true, cancellationToken }); </del> <ins> async fetchAll(options: { silent?: boolean } = {}, cancellationToken?: CancellationToken): Promise<void> { await this._fetch({ all: true, silent: options.silent, cancellationToken }); </ins> } async fetch(options: FetchOptions): Promise<void> {

options.prune = prune; } <del> await this.run(Operation.Fetch, async () => this.repository.fetch(options)); </del> <ins> const operation = options.silent === true ? Operation.FetchNoProgress : Operation.Fetch; await this.run(operation, async () => this.repository.fetch(options)); </ins> } @throttle

const fn = async (cancellationToken?: CancellationToken) => { // When fetchOnPull is enabled, fetch all branches when pulling if (fetchOnPull) { <del> await this.fetchAll(cancellationToken); </del> <ins> await this.fetchAll({}, cancellationToken); </ins> } if (await this.checkIfMaybeRebased(this.HEAD?.name)) {