From 6150a3454794afba24bd5e25fc56e721db41788f Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Sun, 21 Jan 2024 17:27:56 +0100 Subject: [PATCH] Update git API --- src/listeners/general/GitListener.ts | 54 ++++++++++++++-------------- src/models/GitRepository.ts | 6 +++- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/listeners/general/GitListener.ts b/src/listeners/general/GitListener.ts index 6b9eabae..3379fb68 100644 --- a/src/listeners/general/GitListener.ts +++ b/src/listeners/general/GitListener.ts @@ -28,16 +28,16 @@ import { TelemetryEvent } from '../../constants'; import { Folders } from '../../commands/Folders'; -import { commands, extensions } from 'vscode'; -import { GitRepository, GitRepositoryState, PostMessageData } from '../../models'; +import { Event, commands, extensions } from 'vscode'; +import { GitAPIState, GitRepository, PostMessageData } from '../../models'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../localization'; export class GitListener { private static gitAPI: { - onDidChangeState: (repo: any) => void; - onDidOpenRepository: (repo: any) => void; - onDidCloseRepository: (repo: any) => void; + onDidChangeState: Event; + onDidOpenRepository: Event; + onDidCloseRepository: Event; getAPI: (version: number) => any; repositories: GitRepository[]; } | null = null; @@ -320,16 +320,12 @@ export class GitListener { GitListener.listenToRepo(GitListener.gitAPI?.repositories); }); - GitListener.gitAPI?.onDidOpenRepository((repo: GitRepository) => { + GitListener.gitAPI.onDidOpenRepository((repo: GitRepository) => { GitListener.triggerBranchChange(repo); - - repo.state.onDidChange(() => { - GitListener.triggerBranchChange(repo); - }); }); - GitListener.gitAPI?.onDidCloseRepository((repo: any) => { - console.log(`Closed repo:`, repo); + GitListener.gitAPI.onDidCloseRepository((repo: GitRepository) => { + Logger.info(`Closed repo: ${repo?.state?.HEAD?.name}`); }); } } @@ -349,7 +345,7 @@ export class GitListener { } if (repositories && repositories.length === 1) { - GitListener.repository = repositories[0]; + GitListener.triggerBranchChange(repositories[0]); } else if (repositories && repositories.length > 1) { const wsFolder = Folders.getWorkspaceFolder(); if (wsFolder) { @@ -357,14 +353,10 @@ export class GitListener { (repo) => parseWinPath(repo.rootUri.fsPath) === parseWinPath(wsFolder.fsPath) ); if (repo) { - GitListener.repository = repo; + GitListener.triggerBranchChange(repo); } } } - - GitListener.repository?.state?.onDidChange(() => { - GitListener.triggerBranchChange(GitListener.repository); - }); } /** @@ -373,19 +365,25 @@ export class GitListener { */ private static async triggerBranchChange(repo: GitRepository | null) { if (repo && repo.state) { - GitListener.repository = repo; - let branches = []; + if (repo.state.HEAD.name !== GitListener.repository?.state?.HEAD.name) { + GitListener.repository = repo; + let branches = []; - if (repo.repository.getBranches) { - const allBranches = await repo.repository.getBranches(); - if (allBranches && allBranches.length > 0) { - branches = allBranches.map((branch: any) => branch.name); + if (repo.repository.getBranches) { + const allBranches = await repo.repository.getBranches(); + if (allBranches && allBranches.length > 0) { + branches = allBranches.map((branch: any) => branch.name); + } } + this.sendMsg(GeneralCommands.toWebview.git.branchInfo, { + crntBranch: GitListener.repository?.state?.HEAD.name, + branches + }); + + repo.state.onDidChange(() => { + GitListener.triggerBranchChange(repo); + }); } - this.sendMsg(GeneralCommands.toWebview.git.branchInfo, { - crntBranch: GitListener.repository?.state?.HEAD.name, - branches - }); } } diff --git a/src/models/GitRepository.ts b/src/models/GitRepository.ts index 178705a9..0cb40ddc 100644 --- a/src/models/GitRepository.ts +++ b/src/models/GitRepository.ts @@ -1,3 +1,7 @@ +import { Event } from 'vscode'; + +export type GitAPIState = 'uninitialized' | 'initialized'; + export interface GitRepository { state: GitRepositoryState; rootUri: { @@ -11,7 +15,7 @@ export interface GitRepository { export interface GitRepositoryState { HEAD: GitBranch; - onDidChange: (listener: () => void) => void; + onDidChange: Event; } export interface GitBranch {