in src/desktop/current_branch_refresher.ts [86:112]
init() {
this.clearAndSetInterval();
// FIXME: the extension state should be passed in a constructor, not used as a singleton
getExtensionStateSingleton().onDidChangeValid(() => this.clearAndSetIntervalAndRefresh());
vscode.window.onDidChangeWindowState(async state => {
if (!state.focused) {
return;
}
if (dayjs().diff(this.#lastRefresh, 'second') > 30) {
await this.clearAndSetIntervalAndRefresh();
}
});
// This polling is not ideal. The alternative is to listen on repository state
// changes. The logic becomes much more complex and the state changes
// (Repository.state.onDidChange()) are triggered many times per second.
// We wouldn't save any CPU cycles, just increased the complexity of this extension.
this.#branchTrackingTimer = setInterval(async () => {
const projectInRepository = getActiveProject();
const currentBranch =
projectInRepository &&
getCurrentBranchName(projectInRepository.pointer.repository.rawRepository);
if (currentBranch && currentBranch !== this.#previousBranchName) {
this.#previousBranchName = currentBranch;
await this.clearAndSetIntervalAndRefresh();
}
}, 1000);
}