Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/git/browser/gitService.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CancellationToken } from '../../../../base/common/cancellation.js';
7
import { BugIndicatingError } from '../../../../base/common/errors.js';
8
import { Disposable, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
9
import { URI } from '../../../../base/common/uri.js';
10
import { IGitService, IGitExtensionDelegate, GitRef, GitRefQuery, IGitRepository, GitRepositoryState, GitDiffChange } from '../common/gitService.js';
11
import { ISettableObservable, observableValueOpts } from '../../../../base/common/observable.js';
12
import { structuralEquals } from '../../../../base/common/equals.js';
13
import { AutoOpenBarrier } from '../../../../base/common/async.js';
14
import { ILogService } from '../../../../platform/log/common/log.js';
15
16
export class GitService extends Disposable implements IGitService {
17
declare readonly _serviceBrand: undefined;
18
19
private _delegate: IGitExtensionDelegate | undefined;
20
private _delegateBarrier = new AutoOpenBarrier(10_000);
21
22
get repositories(): Iterable<IGitRepository> {
23
return this._delegate?.repositories ?? [];
24
}
25
26
constructor(@ILogService private readonly logService: ILogService) {
27
super();
28
}
29
30
setDelegate(delegate: IGitExtensionDelegate): IDisposable {
31
// The delegate can only be set once, since the vscode.git
32
// extension can only run in one extension host process per
33
// window.
34
if (this._delegate) {
35
this.logService.error('[GitService][setDelegate] GitExtension delegate is already set.');
36
throw new BugIndicatingError('GitExtension delegate is already set.');
37
}
38
39
this._delegate = delegate;
40
this._delegateBarrier.open();
41
42
return toDisposable(() => {
43
this._delegate = undefined;
44
});
45
}
46
47
async openRepository(uri: URI): Promise<IGitRepository | undefined> {
48
// We need to wait for the delegate to be set before we can open a repository.
49
// At the moment we are waiting for 10 seconds before we automatically open the
50
// barrier.
51
await this._delegateBarrier.wait();
52
53
if (!this._delegate) {
54
this.logService.warn('[GitService][openRepository] GitExtension delegate is not set after 10 seconds. Cannot open repository.');
55
return undefined;
56
}
57
58
return this._delegate.openRepository(uri);
59
}
60
}
61
62
export class GitRepository extends Disposable implements IGitRepository {
63
readonly rootUri: URI;
64
65
readonly state: ISettableObservable<GitRepositoryState>;
66
updateState(state: GitRepositoryState): void {
67
this.state.set(state, undefined);
68
}
69
70
constructor(
71
rootUri: URI,
72
initialState: GitRepositoryState,
73
private readonly delegate: IGitExtensionDelegate
74
) {
75
super();
76
77
this.rootUri = rootUri;
78
this.state = observableValueOpts({ owner: this, equalsFn: structuralEquals }, initialState);
79
}
80
81
async getRefs(query: GitRefQuery, token?: CancellationToken): Promise<GitRef[]> {
82
return this.delegate.getRefs(this.rootUri, query, token);
83
}
84
85
async diffBetweenWithStats(ref1: string, ref2: string, path?: string): Promise<GitDiffChange[]> {
86
return this.delegate.diffBetweenWithStats(this.rootUri, ref1, ref2, path);
87
}
88
89
async diffBetweenWithStats2(ref: string, path?: string): Promise<GitDiffChange[]> {
90
return this.delegate.diffBetweenWithStats2(this.rootUri, ref, path);
91
}
92
}
93
94