Path: blob/main/extensions/copilot/src/platform/inlineEdits/common/observableGit.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Disposable } from '../../../util/vs/base/common/lifecycle';6import { autorunWithStore, IObservable, ISettableObservable, mapObservableArrayCached, observableFromEvent, observableValue, waitForState } from '../../../util/vs/base/common/observable';7import { IGitExtensionService } from '../../git/common/gitExtensionService';8import { API } from '../../git/vscode/git';910export class ObservableGit extends Disposable {1112private readonly _gitApi: IObservable<API | undefined>;1314public readonly branch: ISettableObservable<string | undefined, void>;1516constructor(17@IGitExtensionService private readonly _gitExtensionService: IGitExtensionService,18) {19super();2021this._gitApi = observableFromEvent(this, (listener) => this._gitExtensionService.onDidChange(listener), () => this._gitExtensionService.getExtensionApi());2223this.branch = observableValue<string | undefined>('branchName', undefined);2425this.init();26}2728async init() {29const gitApi = await waitForState(this._gitApi);30if (this._store.isDisposed) {31return;32}3334const repos = observableFromEvent(this, (e) => gitApi.onDidOpenRepository(e), () => gitApi.repositories ?? []);3536await waitForState(repos, (repos) => repos.length > 0, undefined);37if (this._store.isDisposed) {38return;39}4041mapObservableArrayCached(this, repos, (repo, store) => {42const stateChangeObservable = observableFromEvent(listener => repo.state.onDidChange(listener), () => repo.state.HEAD?.name);43store.add(autorunWithStore((reader, _store) => {44this.branch.set(stateChangeObservable.read(reader), undefined);45}));46}, repo => repo.rootUri.toString()).recomputeInitiallyAndOnChange(this._store);47}48}495051