diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts index 3aae16f6baf..3f8553260e9 100644 --- a/extensions/git/src/decorationProvider.ts +++ b/extensions/git/src/decorationProvider.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import { Repository, GitResourceGroup } from './repository'; import { Model } from './model'; import { debounce } from './decorators'; -import { filterEvent, dispose, anyEvent, fireEvent, PromiseSource, combinedDisposable } from './util'; +import { filterEvent, dispose, anyEvent, fireEvent, PromiseSource, combinedDisposable, runAndSubscribeEvent } from './util'; import { Change, GitErrorCodes, Status } from './api/git'; class GitIgnoreDecorationProvider implements FileDecorationProvider { @@ -101,7 +101,7 @@ class GitDecorationProvider implements FileDecorationProvider { constructor(private repository: Repository) { this.disposables.push( window.registerFileDecorationProvider(this), - repository.onDidRunGitStatus(this.onDidRunGitStatus, this) + runAndSubscribeEvent(repository.onDidRunGitStatus, () => this.onDidRunGitStatus()) ); } @@ -162,8 +162,10 @@ class GitIncomingChangesFileDecorationProvider implements FileDecorationProvider private readonly disposables: Disposable[] = []; constructor(private readonly repository: Repository) { - this.disposables.push(window.registerFileDecorationProvider(this)); - repository.historyProvider.onDidChangeCurrentHistoryItemGroup(this.onDidChangeCurrentHistoryItemGroup, this, this.disposables); + this.disposables.push( + window.registerFileDecorationProvider(this), + runAndSubscribeEvent(repository.historyProvider.onDidChangeCurrentHistoryItemGroup, () => this.onDidChangeCurrentHistoryItemGroup()) + ); } private async onDidChangeCurrentHistoryItemGroup(): Promise { diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts index 0d4b9241b55..219c87b148d 100644 --- a/extensions/git/src/util.ts +++ b/extensions/git/src/util.ts @@ -47,6 +47,13 @@ export function filterEvent(event: Event, filter: (e: T) => boolean): Even return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables); } +export function runAndSubscribeEvent(event: Event, handler: (e: T) => any, initial: T): IDisposable; +export function runAndSubscribeEvent(event: Event, handler: (e: T | undefined) => any): IDisposable; +export function runAndSubscribeEvent(event: Event, handler: (e: T | undefined) => any, initial?: T): IDisposable { + handler(initial); + return event(e => handler(e)); +} + export function anyEvent(...events: Event[]): Event { return (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => { const result = combinedDisposable(events.map(event => event(i => listener.call(thisArgs, i))));