Skip to content

Commit

Permalink
#125687 - Add settings sync troubleshoot view
Browse files Browse the repository at this point in the history
  • Loading branch information
sandy081 committed Jun 7, 2021

Verified

This commit was signed with the committer’s verified signature.
sagikazarmark Márk Sági-Kazár
1 parent 830c739 commit feeeb58
Showing 3 changed files with 120 additions and 8 deletions.
6 changes: 1 addition & 5 deletions src/vs/platform/userDataSync/common/abstractSynchronizer.ts
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ import { URI } from 'vs/base/common/uri';
import {
SyncResource, SyncStatus, IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, UserDataSyncError, IUserDataSyncLogService, IUserDataSyncUtilService,
IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, USER_DATA_SYNC_SCHEME, ISyncResourcePreview as IBaseSyncResourcePreview,
IUserDataManifest, ISyncData, IRemoteUserData, PREVIEW_DIR_NAME, IResourcePreview as IBaseResourcePreview, Change, MergeState, IUserDataInitializer
IUserDataManifest, ISyncData, IRemoteUserData, PREVIEW_DIR_NAME, IResourcePreview as IBaseResourcePreview, Change, MergeState, IUserDataInitializer, getLastSyncResourceUri
} from 'vs/platform/userDataSync/common/userDataSync';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IExtUri, extUri, extUriIgnorePathCase } from 'vs/base/common/resources';
@@ -53,10 +53,6 @@ export function isSyncData(thing: any): thing is ISyncData {
return false;
}

function getLastSyncResourceUri(syncResource: SyncResource, environmentService: IEnvironmentService, extUri: IExtUri): URI {
return extUri.joinPath(environmentService.userDataSyncHome, syncResource, `lastSync${syncResource}.json`);
}

export interface IResourcePreview {

readonly remoteResource: URI;
6 changes: 5 additions & 1 deletion src/vs/platform/userDataSync/common/userDataSync.ts
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ import { ILogService } from 'vs/platform/log/common/log';
import { IStringDictionary } from 'vs/base/common/collections';
import { FormattingOptions } from 'vs/base/common/jsonFormatter';
import { URI } from 'vs/base/common/uri';
import { joinPath, isEqualOrParent } from 'vs/base/common/resources';
import { joinPath, isEqualOrParent, IExtUri } from 'vs/base/common/resources';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { distinct } from 'vs/base/common/arrays';
import { isArray, isString, isObject } from 'vs/base/common/types';
@@ -132,6 +132,10 @@ export const enum SyncResource {
}
export const ALL_SYNC_RESOURCES: SyncResource[] = [SyncResource.Settings, SyncResource.Keybindings, SyncResource.Snippets, SyncResource.Extensions, SyncResource.GlobalState];

export function getLastSyncResourceUri(syncResource: SyncResource, environmentService: IEnvironmentService, extUri: IExtUri): URI {
return extUri.joinPath(environmentService.userDataSyncHome, syncResource, `lastSync${syncResource}.json`);
}

export interface IUserDataManifest {
latest?: Record<ServerResource, string>
session: string;
116 changes: 114 additions & 2 deletions src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts
Original file line number Diff line number Diff line change
@@ -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;
}

}

0 comments on commit feeeb58

Please sign in to comment.