mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-15 10:58:31 -05:00
Merge from vscode e3c4990c67c40213af168300d1cfeb71d680f877 (#16569)
This commit is contained in:
@@ -684,8 +684,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
|
||||
const leftResourceName = localize({ key: 'leftResourceName', comment: ['remote as in file in cloud'] }, "{0} (Remote)", basename(conflict.remoteResource));
|
||||
const rightResourceName = localize('merges', "{0} (Merges)", basename(conflict.previewResource));
|
||||
await this.editorService.openEditor({
|
||||
leftResource: conflict.remoteResource,
|
||||
rightResource: conflict.previewResource,
|
||||
originalInput: { resource: conflict.remoteResource },
|
||||
modifiedInput: { resource: conflict.previewResource },
|
||||
label: localize('sideBySideLabels', "{0} ↔ {1}", leftResourceName, rightResourceName),
|
||||
description: localize('sideBySideDescription', "Settings Sync"),
|
||||
options: {
|
||||
|
||||
@@ -267,7 +267,7 @@ export class UserDataSyncMergesViewPane extends TreeViewPane {
|
||||
previewResource = this.userDataSyncPreview.resources.find(({ local }) => isEqual(local, previewResource.local))!;
|
||||
await this.reopen(previewResource);
|
||||
if (previewResource.mergeState === MergeState.Conflict) {
|
||||
await this.dialogService.show(Severity.Warning, localize('conflicts detected', "Conflicts Detected"), [], {
|
||||
await this.dialogService.show(Severity.Warning, localize('conflicts detected', "Conflicts Detected"), undefined, {
|
||||
detail: localize('resolve', "Unable to merge due to conflicts. Please resolve them to continue.")
|
||||
});
|
||||
}
|
||||
@@ -315,8 +315,8 @@ export class UserDataSyncMergesViewPane extends TreeViewPane {
|
||||
const rightResourceName = previewResource.mergeState === MergeState.Conflict ? localize('merges', "{0} (Merges)", basename(rightResource))
|
||||
: localize({ key: 'rightResourceName', comment: ['local as in file in disk'] }, "{0} (Local)", basename(rightResource));
|
||||
await this.editorService.openEditor({
|
||||
leftResource,
|
||||
rightResource,
|
||||
originalInput: { resource: leftResource },
|
||||
modifiedInput: { resource: rightResource },
|
||||
label: localize('sideBySideLabels', "{0} ↔ {1}", leftResourceName, rightResourceName),
|
||||
description: localize('sideBySideDescription', "Settings Sync"),
|
||||
options: {
|
||||
@@ -419,7 +419,7 @@ class AcceptChangesContribution extends Disposable implements IEditorContributio
|
||||
return editor.getContribution<AcceptChangesContribution>(AcceptChangesContribution.ID);
|
||||
}
|
||||
|
||||
public static readonly ID = 'editor.contrib.acceptChangesButton';
|
||||
public static readonly ID = 'editor.contrib.acceptChangesButton2';
|
||||
|
||||
private acceptChangesButton: FloatingClickWidget | undefined;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { SettingsEditor2Input, KeybindingsEditorInput, PreferencesEditorInput } from 'vs/workbench/services/preferences/browser/preferencesEditorInput';
|
||||
import { SettingsEditor2Input, PreferencesEditorInput } from 'vs/workbench/services/preferences/common/preferencesEditorInput';
|
||||
import { isEqual } from 'vs/base/common/resources';
|
||||
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
|
||||
import { VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions';
|
||||
@@ -16,6 +16,7 @@ import { IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDa
|
||||
import { IWorkbenchContribution } from 'vs/workbench/common/contributions';
|
||||
import { isWeb } from 'vs/base/common/platform';
|
||||
import { IHostService } from 'vs/workbench/services/host/browser/host';
|
||||
import { KeybindingsEditorInput } from 'vs/workbench/services/preferences/browser/keybindingsEditorInput';
|
||||
|
||||
export class UserDataSyncTrigger extends Disposable implements IWorkbenchContribution {
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import { localize } from 'vs/nls';
|
||||
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
||||
import { TreeView, TreeViewPane } from 'vs/workbench/browser/parts/views/treeView';
|
||||
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle as IResourceHandle, SyncStatus, IUserDataSyncResourceEnablementService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataAutoSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync';
|
||||
import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle as IResourceHandle, SyncStatus, IUserDataSyncResourceEnablementService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataAutoSyncEnablementService, getLastSyncResourceUri } from 'vs/platform/userDataSync/common/userDataSync';
|
||||
import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions';
|
||||
import { ContextKeyExpr, ContextKeyEqualsExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
@@ -28,7 +28,10 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/
|
||||
import { flatten } from 'vs/base/common/arrays';
|
||||
import { UserDataSyncMergesViewPane } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncMergesView';
|
||||
import { basename } from 'vs/base/common/resources';
|
||||
import { API_OPEN_DIFF_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands';
|
||||
import { API_OPEN_DIFF_EDITOR_COMMAND_ID, API_OPEN_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
|
||||
import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity';
|
||||
|
||||
export class UserDataSyncDataViews extends Disposable {
|
||||
|
||||
@@ -51,6 +54,7 @@ export class UserDataSyncDataViews extends Disposable {
|
||||
this.registerMachinesView(container);
|
||||
|
||||
this.registerActivityView(container, false);
|
||||
this.registerTroubleShootView(container);
|
||||
}
|
||||
|
||||
private registerMergesView(container: ViewContainer): void {
|
||||
@@ -219,6 +223,34 @@ export class UserDataSyncDataViews extends Disposable {
|
||||
|
||||
}
|
||||
|
||||
private registerTroubleShootView(container: ViewContainer): void {
|
||||
const id = `workbench.views.sync.troubleshoot`;
|
||||
const name = localize('troubleshoot', "Troubleshoot");
|
||||
const treeView = this.instantiationService.createInstance(TreeView, id, name);
|
||||
const dataProvider = this.instantiationService.createInstance(UserDataSyncTroubleshootViewDataProvider);
|
||||
treeView.showRefreshAction = true;
|
||||
const disposable = treeView.onDidChangeVisibility(visible => {
|
||||
if (visible && !treeView.dataProvider) {
|
||||
disposable.dispose();
|
||||
treeView.dataProvider = dataProvider;
|
||||
}
|
||||
});
|
||||
const viewsRegistry = Registry.as<IViewsRegistry>(Extensions.ViewsRegistry);
|
||||
viewsRegistry.registerViews([<ITreeViewDescriptor>{
|
||||
id,
|
||||
name,
|
||||
ctorDescriptor: new SyncDescriptor(TreeViewPane),
|
||||
when: CONTEXT_ENABLE_ACTIVITY_VIEWS,
|
||||
canToggleVisibility: true,
|
||||
canMoveView: false,
|
||||
treeView,
|
||||
collapsed: false,
|
||||
order: 500,
|
||||
hideByDefault: true
|
||||
}], container);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface ISyncResourceHandle extends IResourceHandle {
|
||||
@@ -479,3 +511,83 @@ class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class UserDataSyncTroubleshootViewDataProvider implements ITreeViewDataProvider {
|
||||
|
||||
constructor(
|
||||
@IFileService private readonly fileService: IFileService,
|
||||
@IEnvironmentService private readonly environmentService: IEnvironmentService,
|
||||
@IUriIdentityService private readonly uriIdentityService: IUriIdentityService,
|
||||
) {
|
||||
}
|
||||
|
||||
async getChildren(element?: ITreeItem): Promise<ITreeItem[]> {
|
||||
if (!element) {
|
||||
return [{
|
||||
handle: 'SYNC_LOGS',
|
||||
collapsibleState: TreeItemCollapsibleState.Collapsed,
|
||||
label: { label: localize('sync logs', "Logs") },
|
||||
themeIcon: Codicon.folder,
|
||||
}, {
|
||||
handle: 'LAST_SYNC_STATES',
|
||||
collapsibleState: TreeItemCollapsibleState.Collapsed,
|
||||
label: { label: localize('last sync states', "Last Synced Remotes") },
|
||||
themeIcon: Codicon.folder,
|
||||
}];
|
||||
}
|
||||
|
||||
if (element.handle === 'LAST_SYNC_STATES') {
|
||||
return this.getLastSyncStates();
|
||||
}
|
||||
|
||||
if (element.handle === 'SYNC_LOGS') {
|
||||
return this.getSyncLogs();
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private async getLastSyncStates(): Promise<ITreeItem[]> {
|
||||
const result: ITreeItem[] = [];
|
||||
for (const syncResource of ALL_SYNC_RESOURCES) {
|
||||
const resource = getLastSyncResourceUri(syncResource, this.environmentService, this.uriIdentityService.extUri);
|
||||
if (await this.fileService.exists(resource)) {
|
||||
result.push({
|
||||
handle: resource.toString(),
|
||||
label: { label: getSyncAreaLabel(syncResource) },
|
||||
collapsibleState: TreeItemCollapsibleState.None,
|
||||
resourceUri: resource,
|
||||
command: { id: API_OPEN_EDITOR_COMMAND_ID, title: '', arguments: [resource, undefined, undefined] },
|
||||
});
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private async getSyncLogs(): Promise<ITreeItem[]> {
|
||||
const logsFolders: URI[] = [];
|
||||
const stat = await this.fileService.resolve(this.uriIdentityService.extUri.dirname(this.uriIdentityService.extUri.dirname(this.environmentService.userDataSyncLogResource)));
|
||||
if (stat.children) {
|
||||
logsFolders.push(...stat.children
|
||||
.filter(stat => stat.isDirectory && /^\d{8}T\d{6}$/.test(stat.name))
|
||||
.sort()
|
||||
.reverse()
|
||||
.map(d => d.resource));
|
||||
}
|
||||
|
||||
const result: ITreeItem[] = [];
|
||||
for (const logFolder of logsFolders) {
|
||||
const syncLogResource = this.uriIdentityService.extUri.joinPath(logFolder, this.uriIdentityService.extUri.basename(this.environmentService.userDataSyncLogResource));
|
||||
result.push({
|
||||
handle: syncLogResource.toString(),
|
||||
collapsibleState: TreeItemCollapsibleState.None,
|
||||
resourceUri: syncLogResource,
|
||||
label: { label: this.uriIdentityService.extUri.basename(logFolder) },
|
||||
description: this.uriIdentityService.extUri.isEqual(syncLogResource, this.environmentService.userDataSyncLogResource) ? localize({ key: 'current', comment: ['Represents current log file'] }, "Current") : undefined,
|
||||
command: { id: API_OPEN_EDITOR_COMMAND_ID, title: '', arguments: [syncLogResource, undefined, undefined] },
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user