Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/inlineEdits/common/observableGit.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 { Disposable } from '../../../util/vs/base/common/lifecycle';
7
import { autorunWithStore, IObservable, ISettableObservable, mapObservableArrayCached, observableFromEvent, observableValue, waitForState } from '../../../util/vs/base/common/observable';
8
import { IGitExtensionService } from '../../git/common/gitExtensionService';
9
import { API } from '../../git/vscode/git';
10
11
export class ObservableGit extends Disposable {
12
13
private readonly _gitApi: IObservable<API | undefined>;
14
15
public readonly branch: ISettableObservable<string | undefined, void>;
16
17
constructor(
18
@IGitExtensionService private readonly _gitExtensionService: IGitExtensionService,
19
) {
20
super();
21
22
this._gitApi = observableFromEvent(this, (listener) => this._gitExtensionService.onDidChange(listener), () => this._gitExtensionService.getExtensionApi());
23
24
this.branch = observableValue<string | undefined>('branchName', undefined);
25
26
this.init();
27
}
28
29
async init() {
30
const gitApi = await waitForState(this._gitApi);
31
if (this._store.isDisposed) {
32
return;
33
}
34
35
const repos = observableFromEvent(this, (e) => gitApi.onDidOpenRepository(e), () => gitApi.repositories ?? []);
36
37
await waitForState(repos, (repos) => repos.length > 0, undefined);
38
if (this._store.isDisposed) {
39
return;
40
}
41
42
mapObservableArrayCached(this, repos, (repo, store) => {
43
const stateChangeObservable = observableFromEvent(listener => repo.state.onDidChange(listener), () => repo.state.HEAD?.name);
44
store.add(autorunWithStore((reader, _store) => {
45
this.branch.set(stateChangeObservable.read(reader), undefined);
46
}));
47
}, repo => repo.rootUri.toString()).recomputeInitiallyAndOnChange(this._store);
48
}
49
}
50
51