mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-24 02:28:34 +01:00
Implement and adopt edit session identifier API proposal (#157733)
* Add canonical workspace identifier proposed API * Use canonical id to store and resume edit sessions * Add git extension workspace identity provider * Fix warning incorrectly showing up * Make auto resume behavior opt in * * Create a separate service * Accept WorkspaceFolder instead of URI * Return string instead of object * Make edit session restores resilient to provider registration races * Introduce an activation event * Activate contributing extension before using provider * `CanonicalWorkspaceIdentity` -> `EditSessionIdentity` * Show progress while resuming edit session * Store edit session even if extension will take care of opening target workspace * Address most of PR feedback * `IEditSessionsWorkbenchService` -> `IEditSessionsStorageService` * Unregister provider in renderer * Split out proposal into new `editSessionIdentityProvider.d.ts` * Fix bad merge * Always show progress in window * Convert URI schemes
This commit is contained in:
38
extensions/git/src/editSessionIdentityProvider.ts
Normal file
38
extensions/git/src/editSessionIdentityProvider.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as path from 'path';
|
||||
import * as vscode from 'vscode';
|
||||
import { Model } from './model';
|
||||
|
||||
export class GitEditSessionIdentityProvider implements vscode.EditSessionIdentityProvider, vscode.Disposable {
|
||||
|
||||
private providerRegistration: vscode.Disposable;
|
||||
|
||||
constructor(private model: Model) {
|
||||
this.providerRegistration = vscode.workspace.registerEditSessionIdentityProvider('file', this);
|
||||
}
|
||||
|
||||
dispose() {
|
||||
this.providerRegistration.dispose();
|
||||
}
|
||||
|
||||
async provideEditSessionIdentity(workspaceFolder: vscode.WorkspaceFolder, _token: vscode.CancellationToken): Promise<string | undefined> {
|
||||
await this.model.openRepository(path.dirname(workspaceFolder.uri.fsPath));
|
||||
|
||||
const repository = this.model.getRepository(workspaceFolder.uri);
|
||||
await repository?.status();
|
||||
|
||||
if (!repository || !repository?.HEAD?.upstream) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return JSON.stringify({
|
||||
remote: repository.remotes.find((remote) => remote.name === repository.HEAD?.upstream?.remote)?.pushUrl ?? null,
|
||||
ref: repository.HEAD?.name ?? null,
|
||||
sha: repository.HEAD?.commit ?? null,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,7 @@ import { OutputChannelLogger } from './log';
|
||||
import { createIPCServer, IPCServer } from './ipc/ipcServer';
|
||||
import { GitEditor } from './gitEditor';
|
||||
import { GitPostCommitCommandsProvider } from './postCommitCommands';
|
||||
import { GitEditSessionIdentityProvider } from './editSessionIdentityProvider';
|
||||
|
||||
const deactivateTasks: { (): Promise<any> }[] = [];
|
||||
|
||||
@@ -115,7 +116,8 @@ async function createModel(context: ExtensionContext, outputChannelLogger: Outpu
|
||||
new GitFileSystemProvider(model),
|
||||
new GitDecorations(model),
|
||||
new GitProtocolHandler(),
|
||||
new GitTimelineProvider(model, cc)
|
||||
new GitTimelineProvider(model, cc),
|
||||
new GitEditSessionIdentityProvider(model)
|
||||
);
|
||||
|
||||
const postCommitCommandsProvider = new GitPostCommitCommandsProvider();
|
||||
|
||||
29
extensions/git/src/typings/vscode.proposed.contribEditSessions.d.ts
vendored
Normal file
29
extensions/git/src/typings/vscode.proposed.contribEditSessions.d.ts
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
declare module 'vscode' {
|
||||
|
||||
// https://github.com/microsoft/vscode/issues/157734
|
||||
|
||||
export namespace workspace {
|
||||
/**
|
||||
*
|
||||
* @param scheme The URI scheme that this provider can provide edit session identities for.
|
||||
* @param provider A provider which can convert URIs for workspace folders of scheme @param scheme to
|
||||
* an edit session identifier which is stable across machines. This enables edit sessions to be resolved.
|
||||
*/
|
||||
export function registerEditSessionIdentityProvider(scheme: string, provider: EditSessionIdentityProvider): Disposable;
|
||||
}
|
||||
|
||||
export interface EditSessionIdentityProvider {
|
||||
/**
|
||||
*
|
||||
* @param workspaceFolder The workspace folder to provide an edit session identity for.
|
||||
* @param token A cancellation token for the request.
|
||||
* @returns An string representing the edit session identity for the requested workspace folder.
|
||||
*/
|
||||
provideEditSessionIdentity(workspaceFolder: WorkspaceFolder, token: CancellationToken): ProviderResult<string>;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user