diff --git a/extensions/git/src/contentProvider.ts b/extensions/git/src/contentProvider.ts index 898e0fe0435..e8b3d109c51 100644 --- a/extensions/git/src/contentProvider.ts +++ b/extensions/git/src/contentProvider.ts @@ -6,7 +6,6 @@ 'use strict'; import { workspace, Uri, Disposable, Event, EventEmitter } from 'vscode'; -import { filterEvent } from './util'; import { Model } from './model'; export class GitContentProvider { @@ -18,12 +17,9 @@ export class GitContentProvider { private uris = new Set(); - constructor(private model: Model, onWorkspaceChange: Event) { - const onGitChange = filterEvent(onWorkspaceChange, uri => /^\.git\//.test(workspace.asRelativePath(uri))); - const onRelevantGitChange = filterEvent(onGitChange, uri => !/\/\.git\/index\.lock$/.test(uri.fsPath)); - + constructor(private model: Model) { this.disposables.push( - onRelevantGitChange(this.fireChangeEvents, this), + model.onDidChangeRepository(this.fireChangeEvents, this), workspace.registerTextDocumentContentProvider('git', this) ); } diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 3753d54beda..18555b55f52 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -11,7 +11,6 @@ import { Model } from './model'; import { GitSCMProvider } from './scmProvider'; import { CommandCenter } from './commands'; import { CheckoutStatusBar, SyncStatusBar } from './statusbar'; -import { anyEvent } from './util'; import { GitContentProvider } from './contentProvider'; import { AutoFetcher } from './autofetch'; import { MergeDecorator } from './merge'; @@ -34,13 +33,10 @@ async function init(disposables: Disposable[]): Promise { return; } - const fsWatcher = workspace.createFileSystemWatcher('**'); - const onWorkspaceChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete); - const pathHint = workspace.getConfiguration('git').get('path'); const info = await findGit(pathHint); const git = new Git({ gitPath: info.path, version: info.version }); - const model = new Model(git, rootPath, onWorkspaceChange); + const model = new Model(git, rootPath); outputChannel.appendLine(localize('using git', "Using git {0} from {1}", info.version, info.path)); git.onOutput(str => outputChannel.append(str), null, disposables); @@ -48,7 +44,7 @@ async function init(disposables: Disposable[]): Promise { const commitHandler = new CommitController(); const commandCenter = new CommandCenter(model, outputChannel); const provider = new GitSCMProvider(model, commandCenter); - const contentProvider = new GitContentProvider(model, onWorkspaceChange); + const contentProvider = new GitContentProvider(model); const checkoutStatusBar = new CheckoutStatusBar(model); const syncStatusBar = new SyncStatusBar(model); const autoFetcher = new AutoFetcher(model); @@ -59,7 +55,6 @@ async function init(disposables: Disposable[]): Promise { commandCenter, provider, contentProvider, - fsWatcher, checkoutStatusBar, syncStatusBar, autoFetcher, diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 41f8a0e88dd..59e9b192475 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -7,7 +7,7 @@ import { Uri, EventEmitter, Event, SCMResource, SCMResourceDecorations, SCMResourceGroup, Disposable, window, workspace } from 'vscode'; import { Git, Repository, Ref, Branch, Remote, PushOptions, Commit, GitErrorCodes, GitError } from './git'; -import { anyEvent, eventToPromise, filterEvent, mapEvent, EmptyDisposable, combinedDisposable } from './util'; +import { anyEvent, eventToPromise, filterEvent, mapEvent, EmptyDisposable, combinedDisposable, dispose } from './util'; import { memoize, throttle, debounce } from './decorators'; import { watch } from './watch'; import * as path from 'path'; @@ -221,6 +221,9 @@ export interface CommitOptions { export class Model implements Disposable { + private _onDidChangeRepository = new EventEmitter(); + readonly onDidChangeRepository: Event = this._onDidChangeRepository.event; + private _onDidChangeState = new EventEmitter(); readonly onDidChangeState: Event = this._onDidChangeState.event; @@ -303,13 +306,18 @@ export class Model implements Disposable { this._onDidChangeResources.fire(this.resources); } + private onWorkspaceChange: Event; private repositoryDisposable: Disposable = EmptyDisposable; + private disposables: Disposable[] = []; constructor( private git: Git, private rootPath: string, - private onWorkspaceChange: Event ) { + const fsWatcher = workspace.createFileSystemWatcher('**'); + this.onWorkspaceChange = anyEvent(fsWatcher.onDidChange, fsWatcher.onDidCreate, fsWatcher.onDidDelete); + this.disposables.push(fsWatcher); + this.status(); } @@ -480,12 +488,13 @@ export class Model implements Disposable { this.repository = this.git.open(repositoryRoot); const dotGitPath = path.join(repositoryRoot, '.git'); - const { event, disposable: watcher } = watch(dotGitPath); + const { event: onRawGitChange, disposable: watcher } = watch(dotGitPath); disposables.push(watcher); - const onGitChange = mapEvent(event, ({ filename }) => Uri.file(path.join(dotGitPath, filename))); + const onGitChange = mapEvent(onRawGitChange, ({ filename }) => Uri.file(path.join(dotGitPath, filename))); const onRelevantGitChange = filterEvent(onGitChange, uri => !/\/\.git\/index\.lock$/.test(uri.fsPath)); onRelevantGitChange(this.onFSChange, this, disposables); + onRelevantGitChange(this._onDidChangeRepository.fire, this._onDidChangeRepository, disposables); const onNonGitChange = filterEvent(this.onWorkspaceChange, uri => !/\/\.git\//.test(uri.fsPath)); onNonGitChange(this.onFSChange, this, disposables); @@ -596,5 +605,6 @@ export class Model implements Disposable { dispose(): void { this.repositoryDisposable.dispose(); + this.disposables = dispose(this.disposables); } } \ No newline at end of file