diff --git a/src/git/models/repository.ts b/src/git/models/repository.ts index d43008e..5d164b0 100644 --- a/src/git/models/repository.ts +++ b/src/git/models/repository.ts @@ -285,13 +285,6 @@ export class Repository implements Disposable { dispose() { this.stopWatchingFileSystem(); - // // Clean up any disposables in storage - // for (const item of this.storage.values()) { - // if (item != null && typeof item.dispose === 'function') { - // item.dispose(); - // } - // } - this._remotesDisposable?.dispose(); this._repoWatcherDisposable?.dispose(); this._disposable.dispose(); @@ -337,78 +330,69 @@ export class Repository implements Disposable { private onRepositoryChanged(uri: Uri | undefined) { this._lastFetched = undefined; - if (uri == null) { - this.fireChange(RepositoryChange.Unknown); - - return; - } - - if (uri.path.endsWith('.git/config')) { - this.resetCaches(); - this.fireChange(RepositoryChange.Config, RepositoryChange.Remotes); - - return; - } - - if (uri.path.endsWith('.git/index')) { - this.fireChange(RepositoryChange.Index); - - return; - } - - if (uri.path.endsWith('.git/HEAD') || uri.path.endsWith('.git/ORIG_HEAD')) { - this.resetCaches('branches'); - this.fireChange(RepositoryChange.Heads); - - return; - } - - if (uri.path.endsWith('.git/refs/stash')) { - this.fireChange(RepositoryChange.Stash); - - return; - } - - if (uri.path.endsWith('.git/CHERRY_PICK_HEAD')) { - this.fireChange(RepositoryChange.CherryPick, RepositoryChange.Status); + const match = + uri != null + ? /(?\/\.gitignore)|\.git\/(?config|index|HEAD|FETCH_HEAD|ORIG_HEAD|CHERRY_PICK_HEAD|MERGE_HEAD|REBASE_HEAD|rebase-merge|refs\/(?:heads|remotes|stash|tags))/.exec( + uri.path, + ) + : undefined; + if (match?.groups != null) { + const { ignore, type } = match.groups; + + if (ignore) { + this.fireChange(RepositoryChange.Ignores); + return; + } - return; - } + switch (type) { + case 'config': + this.resetCaches(); + this.fireChange(RepositoryChange.Config, RepositoryChange.Remotes); + return; - if (uri.path.endsWith('.git/MERGE_HEAD')) { - this.fireChange(RepositoryChange.Merge, RepositoryChange.Status); + case 'index': + this.fireChange(RepositoryChange.Index); + return; - return; - } + case 'FETCH_HEAD': + // Ignore any changes to FETCH_HEAD as unless other things change, nothing changes that we care about + return; - if (uri.path.endsWith('.git/REBASE_HEAD') || /\.git\/rebase-merge/.test(uri.path)) { - this.fireChange(RepositoryChange.Rebase, RepositoryChange.Status); + case 'HEAD': + case 'ORIG_HEAD': + this.resetCaches('branches'); + this.fireChange(RepositoryChange.Heads); + return; - return; - } + case 'CHERRY_PICK_HEAD': + this.fireChange(RepositoryChange.CherryPick, RepositoryChange.Status); + return; - if (uri.path.endsWith('/.gitignore')) { - this.fireChange(RepositoryChange.Ignores); + case 'MERGE_HEAD': + this.fireChange(RepositoryChange.Merge, RepositoryChange.Status); + return; - return; - } + case 'REBASE_HEAD': + case 'rebase-merge': + this.fireChange(RepositoryChange.Rebase, RepositoryChange.Status); + return; - const match = /\.git\/refs\/(heads|remotes|tags)/.exec(uri.path); - if (match != null) { - switch (match[1]) { - case 'heads': + case 'refs/heads': this.resetCaches('branches'); this.fireChange(RepositoryChange.Heads); - return; - case 'remotes': + + case 'refs/remotes': this.resetCaches(); this.fireChange(RepositoryChange.Remotes); + return; + case 'refs/stash': + this.fireChange(RepositoryChange.Stash); return; - case 'tags': - this.fireChange(RepositoryChange.Tags); + case 'refs/tags': + this.fireChange(RepositoryChange.Tags); return; } }