diff --git a/extensions/git/src/contentProvider.ts b/extensions/git/src/contentProvider.ts index 4e591c1ae32..4363c80af8e 100644 --- a/extensions/git/src/contentProvider.ts +++ b/extensions/git/src/contentProvider.ts @@ -7,8 +7,8 @@ import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode'; import { debounce, throttle } from './decorators'; -import { fromGitUri } from './uri'; -import { Model, ModelChangeEvent } from './model'; +import { fromGitUri, toGitUri } from './uri'; +import { Model, ModelChangeEvent, OriginalResourceChangeEvent } from './model'; import { filterEvent, eventToPromise } from './util'; interface CacheRow { @@ -25,8 +25,8 @@ const FIVE_MINUTES = 1000 * 60 * 5; export class GitContentProvider { - private onDidChangeEmitter = new EventEmitter(); - get onDidChange(): Event { return this.onDidChangeEmitter.event; } + private _onDidChange = new EventEmitter(); + get onDidChange(): Event { return this._onDidChange.event; } private changedRepositoryRoots = new Set(); private cache: Cache = Object.create(null); @@ -35,6 +35,7 @@ export class GitContentProvider { constructor(private model: Model) { this.disposables.push( model.onDidChangeRepository(this.onDidChangeRepository, this), + model.onDidChangeOriginalResource(this.onDidChangeOriginalResource, this), workspace.registerTextDocumentContentProvider('git', this) ); @@ -46,6 +47,14 @@ export class GitContentProvider { this.eventuallyFireChangeEvents(); } + private onDidChangeOriginalResource({ uri }: OriginalResourceChangeEvent): void { + if (uri.scheme !== 'file') { + return; + } + + this._onDidChange.fire(toGitUri(uri, '', true)); + } + @debounce(1100) private eventuallyFireChangeEvents(): void { this.fireChangeEvents(); @@ -64,7 +73,7 @@ export class GitContentProvider { for (const root of this.changedRepositoryRoots) { if (fsPath.startsWith(root)) { - this.onDidChangeEmitter.fire(uri); + this._onDidChange.fire(uri); return; } } diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 93a809a20fe..be87561ae9a 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -35,6 +35,11 @@ export interface ModelChangeEvent { uri: Uri; } +export interface OriginalResourceChangeEvent { + repository: Repository; + uri: Uri; +} + interface OpenRepository extends Disposable { repository: Repository; } @@ -54,6 +59,9 @@ export class Model { private _onDidChangeRepository = new EventEmitter(); readonly onDidChangeRepository: Event = this._onDidChangeRepository.event; + private _onDidChangeOriginalResource = new EventEmitter(); + readonly onDidChangeOriginalResource: Event = this._onDidChangeOriginalResource.event; + private openRepositories: OpenRepository[] = []; get repositories(): Repository[] { return this.openRepositories.map(r => r.repository); } @@ -217,10 +225,14 @@ export class Model { const onDidDisappearRepository = filterEvent(repository.onDidChangeState, state => state === RepositoryState.Disposed); const disappearListener = onDidDisappearRepository(() => dispose()); const changeListener = repository.onDidChangeRepository(uri => this._onDidChangeRepository.fire({ repository, uri })); + const originalResourceChangeListener = repository.onDidChangeOriginalResource(uri => this._onDidChangeOriginalResource.fire({ repository, uri })); + const dispose = () => { disappearListener.dispose(); changeListener.dispose(); + originalResourceChangeListener.dispose(); repository.dispose(); + this.openRepositories = this.openRepositories.filter(e => e !== openRepository); this._onDidCloseRepository.fire(repository); }; diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index f4dab0e46e5..6c9f781c58f 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -315,6 +315,9 @@ export class Repository implements Disposable { private _onDidChangeStatus = new EventEmitter(); readonly onDidChangeStatus: Event = this._onDidChangeStatus.event; + private _onDidChangeOriginalResource = new EventEmitter(); + readonly onDidChangeOriginalResource: Event = this._onDidChangeOriginalResource.event; + private _onRunOperation = new EventEmitter(); readonly onRunOperation: Event = this._onRunOperation.event; @@ -460,6 +463,7 @@ export class Repository implements Disposable { async stage(resource: Uri, contents: string): Promise { const relativePath = path.relative(this.repository.root, resource.fsPath).replace(/\\/g, '/'); await this.run(Operation.Stage, () => this.repository.stage(relativePath, contents)); + this._onDidChangeOriginalResource.fire(resource); } async revert(resources: Uri[]): Promise {