From 237f34812f8ef39f04b4071d974c75656a998c7d Mon Sep 17 00:00:00 2001 From: adblasiak Date: Fri, 14 May 2021 10:37:48 +0200 Subject: [PATCH 1/4] debounce svn info calls on filesystem events --- src/repository.ts | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/repository.ts b/src/repository.ts index cfdeb68e0..b6217fdcc 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -92,27 +92,27 @@ export class Repository implements IRemoteRepository { } private _onDidChangeRepository = new EventEmitter(); - public readonly onDidChangeRepository: Event = this - ._onDidChangeRepository.event; + public readonly onDidChangeRepository: Event = + this._onDidChangeRepository.event; private _onDidChangeState = new EventEmitter(); - public readonly onDidChangeState: Event = this - ._onDidChangeState.event; + public readonly onDidChangeState: Event = + this._onDidChangeState.event; private _onDidChangeStatus = new EventEmitter(); - public readonly onDidChangeStatus: Event = this._onDidChangeStatus - .event; + public readonly onDidChangeStatus: Event = + this._onDidChangeStatus.event; private _onDidChangeRemoteChangedFiles = new EventEmitter(); - public readonly onDidChangeRemoteChangedFile: Event = this - ._onDidChangeRemoteChangedFiles.event; + public readonly onDidChangeRemoteChangedFile: Event = + this._onDidChangeRemoteChangedFiles.event; private _onRunOperation = new EventEmitter(); public readonly onRunOperation: Event = this._onRunOperation.event; private _onDidRunOperation = new EventEmitter(); - public readonly onDidRunOperation: Event = this._onDidRunOperation - .event; + public readonly onDidRunOperation: Event = + this._onDidRunOperation.event; @memoize get onDidChangeOperations(): Event { @@ -188,12 +188,9 @@ export class Repository implements IRemoteRepository { this.disposables.push(this._fsWatcher); this._fsWatcher.onDidAny(this.onFSChange, this, this.disposables); - - // TODO on svn switch event fired two times since two files were changed this._fsWatcher.onDidSvnAny( async (e: Uri) => { - await this.repository.updateInfo(); - this._onDidChangeRepository.fire(e); + await this.onDidAnyFileChanged(e); }, this, this.disposables @@ -292,6 +289,12 @@ export class Repository implements IRemoteRepository { ); } + @debounce(1000) + private async onDidAnyFileChanged(e: Uri) { + await this.repository.updateInfo(); + this._onDidChangeRepository.fire(e); + } + private createRemoteChangedInterval() { const updateFreq = configuration.get( "remoteChanges.checkFrequency", From b888bd7a21ae072d44db42cc137286612a15bdca Mon Sep 17 00:00:00 2001 From: blashaq Date: Sun, 16 May 2021 12:54:04 +0200 Subject: [PATCH 2/4] fixed style issues --- src/historyView/branchChangesProvider.ts | 3 ++- src/historyView/itemLogProvider.ts | 12 ++++++------ src/historyView/repoLogProvider.ts | 17 +++++++++-------- src/source_control_manager.ts | 20 ++++++++++---------- src/svnFileSystemProvider.ts | 4 ++-- src/svnRepository.ts | 17 +++++++++-------- src/treeView/dataProviders/svnProvider.ts | 12 ++++++------ src/util.ts | 4 +++- 8 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/historyView/branchChangesProvider.ts b/src/historyView/branchChangesProvider.ts index 0d8ab39d6..f9fb42fb9 100644 --- a/src/historyView/branchChangesProvider.ts +++ b/src/historyView/branchChangesProvider.ts @@ -12,7 +12,8 @@ import { openDiff, getIconObject, openFileRemote } from "./common"; import { dispose } from "../util"; export class BranchChangesProvider - implements TreeDataProvider, Disposable { + implements TreeDataProvider, Disposable +{ private _dispose: Disposable[] = []; private _onDidChangeTreeData = new EventEmitter(); public readonly onDidChangeTreeData = this._onDidChangeTreeData.event; diff --git a/src/historyView/itemLogProvider.ts b/src/historyView/itemLogProvider.ts index d83731c77..b7d643e9b 100644 --- a/src/historyView/itemLogProvider.ts +++ b/src/historyView/itemLogProvider.ts @@ -33,12 +33,12 @@ import { } from "./common"; export class ItemLogProvider - implements TreeDataProvider, Disposable { - private _onDidChangeTreeData: EventEmitter< - ILogTreeItem | undefined - > = new EventEmitter(); - public readonly onDidChangeTreeData: Event = this - ._onDidChangeTreeData.event; + implements TreeDataProvider, Disposable +{ + private _onDidChangeTreeData: EventEmitter = + new EventEmitter(); + public readonly onDidChangeTreeData: Event = + this._onDidChangeTreeData.event; private currentItem?: ICachedLog; private _dispose: Disposable[] = []; diff --git a/src/historyView/repoLogProvider.ts b/src/historyView/repoLogProvider.ts index 5d60cccd2..d653c46fd 100644 --- a/src/historyView/repoLogProvider.ts +++ b/src/historyView/repoLogProvider.ts @@ -64,12 +64,12 @@ function getActionIcon(action: string) { } export class RepoLogProvider - implements TreeDataProvider, Disposable { - private _onDidChangeTreeData: EventEmitter< - ILogTreeItem | undefined - > = new EventEmitter(); - public readonly onDidChangeTreeData: Event = this - ._onDidChangeTreeData.event; + implements TreeDataProvider, Disposable +{ + private _onDidChangeTreeData: EventEmitter = + new EventEmitter(); + public readonly onDidChangeTreeData: Event = + this._onDidChangeTreeData.event; // TODO on-disk cache? private readonly logCache: Map = new Map(); private _dispose: Disposable[] = []; @@ -255,8 +255,9 @@ export class RepoLogProvider const commit = element.data as ISvnLogEntryPath; const item = this.getCached(element); const parent = (element.parent as ILogTreeItem).data as ISvnLogEntry; - const remotePath = item.repo.getPathNormalizer().parse(commit._) - .remoteFullPath; + const remotePath = item.repo + .getPathNormalizer() + .parse(commit._).remoteFullPath; let prevRev: ISvnLogEntry; const revs = await item.repo.log(parent.revision, "1", 2, remotePath); diff --git a/src/source_control_manager.ts b/src/source_control_manager.ts index 39237685f..fcc4e6172 100644 --- a/src/source_control_manager.ts +++ b/src/source_control_manager.ts @@ -39,20 +39,20 @@ type State = "uninitialized" | "initialized"; export class SourceControlManager implements IDisposable { private _onDidOpenRepository = new EventEmitter(); - public readonly onDidOpenRepository: Event = this - ._onDidOpenRepository.event; + public readonly onDidOpenRepository: Event = + this._onDidOpenRepository.event; private _onDidCloseRepository = new EventEmitter(); - public readonly onDidCloseRepository: Event = this - ._onDidCloseRepository.event; + public readonly onDidCloseRepository: Event = + this._onDidCloseRepository.event; private _onDidChangeRepository = new EventEmitter(); - public readonly onDidChangeRepository: Event = this - ._onDidChangeRepository.event; + public readonly onDidChangeRepository: Event = + this._onDidChangeRepository.event; private _onDidChangeStatusRepository = new EventEmitter(); - public readonly onDidChangeStatusRepository: Event = this - ._onDidChangeStatusRepository.event; + public readonly onDidChangeStatusRepository: Event = + this._onDidChangeStatusRepository.event; public openRepositories: IOpenRepository[] = []; private disposables: Disposable[] = []; @@ -105,12 +105,12 @@ export class SourceControlManager implements IDisposable { this ); - return ((async (): Promise => { + return (async (): Promise => { if (this.enabled) { await this.enable(); } return this; - })() as unknown) as SourceControlManager; + })() as unknown as SourceControlManager; } public openRepositoriesSorted(): IOpenRepository[] { diff --git a/src/svnFileSystemProvider.ts b/src/svnFileSystemProvider.ts index 26f6dd2d5..6c8bb837c 100644 --- a/src/svnFileSystemProvider.ts +++ b/src/svnFileSystemProvider.ts @@ -37,8 +37,8 @@ export class SvnFileSystemProvider implements FileSystemProvider, Disposable { private cache = new Map(); private _onDidChangeFile = new EventEmitter(); - readonly onDidChangeFile: Event = this._onDidChangeFile - .event; + readonly onDidChangeFile: Event = + this._onDidChangeFile.event; private changedRepositoryRoots = new Set(); diff --git a/src/svnRepository.ts b/src/svnRepository.ts index dd2048d06..d9445dcbc 100644 --- a/src/svnRepository.ts +++ b/src/svnRepository.ts @@ -50,14 +50,14 @@ export class Repository { policy: ConstructorPolicy ) { if (policy === ConstructorPolicy.LateInit) { - return ((async (): Promise => { + return (async (): Promise => { return this; - })() as unknown) as Repository; + })() as unknown as Repository; } - return ((async (): Promise => { + return (async (): Promise => { await this.updateInfo(); return this; - })() as unknown) as Repository; + })() as unknown as Repository; } public async updateInfo() { @@ -355,9 +355,8 @@ export class Repository { } } } else { - const svnEncoding: string | undefined = configuration.get( - "default.encoding" - ); + const svnEncoding: string | undefined = + configuration.get("default.encoding"); if (svnEncoding) { encoding = svnEncoding; } @@ -484,7 +483,9 @@ export class Repository { if ((await stat(file)).isDirectory()) { return ( await Promise.all( - (await readdir(file)).map(subfile => { + ( + await readdir(file) + ).map(subfile => { const abspath = path.resolve(file + path.sep + subfile); const relpath = this.removeAbsolutePath(abspath); if ( diff --git a/src/treeView/dataProviders/svnProvider.ts b/src/treeView/dataProviders/svnProvider.ts index 7a9d96bd3..0afce719c 100644 --- a/src/treeView/dataProviders/svnProvider.ts +++ b/src/treeView/dataProviders/svnProvider.ts @@ -13,13 +13,13 @@ import RepositoryNode from "../nodes/repositoryNode"; import { dispose } from "../../util"; export default class SvnProvider - implements TreeDataProvider, Disposable { - private _onDidChangeTreeData: EventEmitter< - BaseNode | undefined - > = new EventEmitter(); + implements TreeDataProvider, Disposable +{ + private _onDidChangeTreeData: EventEmitter = + new EventEmitter(); private _dispose: Disposable[] = []; - public onDidChangeTreeData: Event = this - ._onDidChangeTreeData.event; + public onDidChangeTreeData: Event = + this._onDidChangeTreeData.event; constructor(private sourceControlManager: SourceControlManager) { this._dispose.push( diff --git a/src/util.ts b/src/util.ts index 79d78640d..f0e8dbb91 100644 --- a/src/util.ts +++ b/src/util.ts @@ -152,7 +152,9 @@ export function isReadOnly(operation: Operation): boolean { export async function deleteDirectory(dirPath: string): Promise { if ((await exists(dirPath)) && (await lstat(dirPath)).isDirectory()) { await Promise.all( - (await readdir(dirPath)).map(async (entry: string) => { + ( + await readdir(dirPath) + ).map(async (entry: string) => { const entryPath = path.join(dirPath, entry); if ((await lstat(entryPath)).isDirectory()) { await deleteDirectory(entryPath); From 086b2a2dc6cb30f300d77967132fe24e9a70dddc Mon Sep 17 00:00:00 2001 From: blashaq Date: Sun, 16 May 2021 21:00:16 +0200 Subject: [PATCH 3/4] reverted style changes caused by wrong dependencies --- src/historyView/branchChangesProvider.ts | 3 +-- src/historyView/itemLogProvider.ts | 12 ++++++------ src/historyView/repoLogProvider.ts | 17 ++++++++--------- src/source_control_manager.ts | 20 ++++++++++---------- src/svnFileSystemProvider.ts | 4 ++-- src/svnRepository.ts | 17 ++++++++--------- src/treeView/dataProviders/svnProvider.ts | 12 ++++++------ src/util.ts | 4 +--- 8 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/historyView/branchChangesProvider.ts b/src/historyView/branchChangesProvider.ts index f9fb42fb9..0d8ab39d6 100644 --- a/src/historyView/branchChangesProvider.ts +++ b/src/historyView/branchChangesProvider.ts @@ -12,8 +12,7 @@ import { openDiff, getIconObject, openFileRemote } from "./common"; import { dispose } from "../util"; export class BranchChangesProvider - implements TreeDataProvider, Disposable -{ + implements TreeDataProvider, Disposable { private _dispose: Disposable[] = []; private _onDidChangeTreeData = new EventEmitter(); public readonly onDidChangeTreeData = this._onDidChangeTreeData.event; diff --git a/src/historyView/itemLogProvider.ts b/src/historyView/itemLogProvider.ts index b7d643e9b..d83731c77 100644 --- a/src/historyView/itemLogProvider.ts +++ b/src/historyView/itemLogProvider.ts @@ -33,12 +33,12 @@ import { } from "./common"; export class ItemLogProvider - implements TreeDataProvider, Disposable -{ - private _onDidChangeTreeData: EventEmitter = - new EventEmitter(); - public readonly onDidChangeTreeData: Event = - this._onDidChangeTreeData.event; + implements TreeDataProvider, Disposable { + private _onDidChangeTreeData: EventEmitter< + ILogTreeItem | undefined + > = new EventEmitter(); + public readonly onDidChangeTreeData: Event = this + ._onDidChangeTreeData.event; private currentItem?: ICachedLog; private _dispose: Disposable[] = []; diff --git a/src/historyView/repoLogProvider.ts b/src/historyView/repoLogProvider.ts index d653c46fd..5d60cccd2 100644 --- a/src/historyView/repoLogProvider.ts +++ b/src/historyView/repoLogProvider.ts @@ -64,12 +64,12 @@ function getActionIcon(action: string) { } export class RepoLogProvider - implements TreeDataProvider, Disposable -{ - private _onDidChangeTreeData: EventEmitter = - new EventEmitter(); - public readonly onDidChangeTreeData: Event = - this._onDidChangeTreeData.event; + implements TreeDataProvider, Disposable { + private _onDidChangeTreeData: EventEmitter< + ILogTreeItem | undefined + > = new EventEmitter(); + public readonly onDidChangeTreeData: Event = this + ._onDidChangeTreeData.event; // TODO on-disk cache? private readonly logCache: Map = new Map(); private _dispose: Disposable[] = []; @@ -255,9 +255,8 @@ export class RepoLogProvider const commit = element.data as ISvnLogEntryPath; const item = this.getCached(element); const parent = (element.parent as ILogTreeItem).data as ISvnLogEntry; - const remotePath = item.repo - .getPathNormalizer() - .parse(commit._).remoteFullPath; + const remotePath = item.repo.getPathNormalizer().parse(commit._) + .remoteFullPath; let prevRev: ISvnLogEntry; const revs = await item.repo.log(parent.revision, "1", 2, remotePath); diff --git a/src/source_control_manager.ts b/src/source_control_manager.ts index fcc4e6172..39237685f 100644 --- a/src/source_control_manager.ts +++ b/src/source_control_manager.ts @@ -39,20 +39,20 @@ type State = "uninitialized" | "initialized"; export class SourceControlManager implements IDisposable { private _onDidOpenRepository = new EventEmitter(); - public readonly onDidOpenRepository: Event = - this._onDidOpenRepository.event; + public readonly onDidOpenRepository: Event = this + ._onDidOpenRepository.event; private _onDidCloseRepository = new EventEmitter(); - public readonly onDidCloseRepository: Event = - this._onDidCloseRepository.event; + public readonly onDidCloseRepository: Event = this + ._onDidCloseRepository.event; private _onDidChangeRepository = new EventEmitter(); - public readonly onDidChangeRepository: Event = - this._onDidChangeRepository.event; + public readonly onDidChangeRepository: Event = this + ._onDidChangeRepository.event; private _onDidChangeStatusRepository = new EventEmitter(); - public readonly onDidChangeStatusRepository: Event = - this._onDidChangeStatusRepository.event; + public readonly onDidChangeStatusRepository: Event = this + ._onDidChangeStatusRepository.event; public openRepositories: IOpenRepository[] = []; private disposables: Disposable[] = []; @@ -105,12 +105,12 @@ export class SourceControlManager implements IDisposable { this ); - return (async (): Promise => { + return ((async (): Promise => { if (this.enabled) { await this.enable(); } return this; - })() as unknown as SourceControlManager; + })() as unknown) as SourceControlManager; } public openRepositoriesSorted(): IOpenRepository[] { diff --git a/src/svnFileSystemProvider.ts b/src/svnFileSystemProvider.ts index 6c8bb837c..26f6dd2d5 100644 --- a/src/svnFileSystemProvider.ts +++ b/src/svnFileSystemProvider.ts @@ -37,8 +37,8 @@ export class SvnFileSystemProvider implements FileSystemProvider, Disposable { private cache = new Map(); private _onDidChangeFile = new EventEmitter(); - readonly onDidChangeFile: Event = - this._onDidChangeFile.event; + readonly onDidChangeFile: Event = this._onDidChangeFile + .event; private changedRepositoryRoots = new Set(); diff --git a/src/svnRepository.ts b/src/svnRepository.ts index d9445dcbc..dd2048d06 100644 --- a/src/svnRepository.ts +++ b/src/svnRepository.ts @@ -50,14 +50,14 @@ export class Repository { policy: ConstructorPolicy ) { if (policy === ConstructorPolicy.LateInit) { - return (async (): Promise => { + return ((async (): Promise => { return this; - })() as unknown as Repository; + })() as unknown) as Repository; } - return (async (): Promise => { + return ((async (): Promise => { await this.updateInfo(); return this; - })() as unknown as Repository; + })() as unknown) as Repository; } public async updateInfo() { @@ -355,8 +355,9 @@ export class Repository { } } } else { - const svnEncoding: string | undefined = - configuration.get("default.encoding"); + const svnEncoding: string | undefined = configuration.get( + "default.encoding" + ); if (svnEncoding) { encoding = svnEncoding; } @@ -483,9 +484,7 @@ export class Repository { if ((await stat(file)).isDirectory()) { return ( await Promise.all( - ( - await readdir(file) - ).map(subfile => { + (await readdir(file)).map(subfile => { const abspath = path.resolve(file + path.sep + subfile); const relpath = this.removeAbsolutePath(abspath); if ( diff --git a/src/treeView/dataProviders/svnProvider.ts b/src/treeView/dataProviders/svnProvider.ts index 0afce719c..7a9d96bd3 100644 --- a/src/treeView/dataProviders/svnProvider.ts +++ b/src/treeView/dataProviders/svnProvider.ts @@ -13,13 +13,13 @@ import RepositoryNode from "../nodes/repositoryNode"; import { dispose } from "../../util"; export default class SvnProvider - implements TreeDataProvider, Disposable -{ - private _onDidChangeTreeData: EventEmitter = - new EventEmitter(); + implements TreeDataProvider, Disposable { + private _onDidChangeTreeData: EventEmitter< + BaseNode | undefined + > = new EventEmitter(); private _dispose: Disposable[] = []; - public onDidChangeTreeData: Event = - this._onDidChangeTreeData.event; + public onDidChangeTreeData: Event = this + ._onDidChangeTreeData.event; constructor(private sourceControlManager: SourceControlManager) { this._dispose.push( diff --git a/src/util.ts b/src/util.ts index f0e8dbb91..79d78640d 100644 --- a/src/util.ts +++ b/src/util.ts @@ -152,9 +152,7 @@ export function isReadOnly(operation: Operation): boolean { export async function deleteDirectory(dirPath: string): Promise { if ((await exists(dirPath)) && (await lstat(dirPath)).isDirectory()) { await Promise.all( - ( - await readdir(dirPath) - ).map(async (entry: string) => { + (await readdir(dirPath)).map(async (entry: string) => { const entryPath = path.join(dirPath, entry); if ((await lstat(entryPath)).isDirectory()) { await deleteDirectory(entryPath); From 0bdac3c4e7f2a930235ed20dec77186e3209c20d Mon Sep 17 00:00:00 2001 From: blashaq Date: Sun, 16 May 2021 21:00:28 +0200 Subject: [PATCH 4/4] fixed style issues --- src/repository.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/repository.ts b/src/repository.ts index b6217fdcc..778c98517 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -92,27 +92,27 @@ export class Repository implements IRemoteRepository { } private _onDidChangeRepository = new EventEmitter(); - public readonly onDidChangeRepository: Event = - this._onDidChangeRepository.event; + public readonly onDidChangeRepository: Event = this + ._onDidChangeRepository.event; private _onDidChangeState = new EventEmitter(); - public readonly onDidChangeState: Event = - this._onDidChangeState.event; + public readonly onDidChangeState: Event = this + ._onDidChangeState.event; private _onDidChangeStatus = new EventEmitter(); - public readonly onDidChangeStatus: Event = - this._onDidChangeStatus.event; + public readonly onDidChangeStatus: Event = this._onDidChangeStatus + .event; private _onDidChangeRemoteChangedFiles = new EventEmitter(); - public readonly onDidChangeRemoteChangedFile: Event = - this._onDidChangeRemoteChangedFiles.event; + public readonly onDidChangeRemoteChangedFile: Event = this + ._onDidChangeRemoteChangedFiles.event; private _onRunOperation = new EventEmitter(); public readonly onRunOperation: Event = this._onRunOperation.event; private _onDidRunOperation = new EventEmitter(); - public readonly onDidRunOperation: Event = - this._onDidRunOperation.event; + public readonly onDidRunOperation: Event = this._onDidRunOperation + .event; @memoize get onDidChangeOperations(): Event {