From a81ead351552acc977bddd8845144902f1b78fbc Mon Sep 17 00:00:00 2001 From: Souls-R <2362912722@qq.com> Date: Mon, 7 Oct 2024 21:36:53 +0800 Subject: [PATCH 1/3] feat: log filter --- package.json | 30 +++++++++++++++++++ src/historyView/repoLogProvider.ts | 47 +++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b4998738..5fbc44d7 100644 --- a/package.json +++ b/package.json @@ -326,6 +326,18 @@ "title": "Add repo-like path", "icon": "$(add)" }, + { + "command": "svn.repolog.filterAuthor", + "category": "SVN", + "title": "Filter log by author", + "icon": "$(zap)" + }, + { + "command": "svn.repolog.filterMsg", + "category": "SVN", + "title": "Filter log by message", + "icon": "$(filter)" + }, { "command": "svn.repolog.copymsg", "category": "SVN", @@ -569,6 +581,14 @@ "command": "svn.renameExplorer", "when": "false" }, + { + "command": "svn.repolog.filterAuthor", + "when": "false" + }, + { + "command": "svn.repolog.filterMsg", + "when": "false" + }, { "command": "svn.repolog.addrepolike", "when": "false" @@ -661,6 +681,16 @@ "when": "view == repolog", "group": "navigation" }, + { + "command": "svn.repolog.filterAuthor", + "when": "view == repolog", + "group": "navigation" + }, + { + "command": "svn.repolog.filterMsg", + "when": "view == repolog", + "group": "navigation" + }, { "command": "svn.repolog.addrepolike", "when": "view == repolog", diff --git a/src/historyView/repoLogProvider.ts b/src/historyView/repoLogProvider.ts index 79200aaf..dfc14a14 100644 --- a/src/historyView/repoLogProvider.ts +++ b/src/historyView/repoLogProvider.ts @@ -118,13 +118,58 @@ export class RepoLogProvider return this.refresh(); // TODO refresh only required repo, need to pass element === getChildren() } - ) + ), + commands.registerCommand( + "svn.repolog.filterAuthor", + this.filterAuthorGui, + this + ), + commands.registerCommand("svn.repolog.filterMsg", this.filterMsgGui, this) ); } public dispose() { dispose(this._dispose); } + public filterAuthorGui() { + const box = window.createInputBox(); + box.prompt = "Search for commit authors on current results"; + box.onDidAccept(async () => { + const search = box.value; + box.dispose(); + for (const v of this.logCache.values()) { + // author filter + const len = v.entries.length; + const entries = v.entries.filter(e => e.author.includes(search)); + v.entries = entries; + window.showInformationMessage( + `Found ${v.entries.length} commits in ${len} cache.` + ); + } + this._onDidChangeTreeData.fire(undefined); + }); + box.show(); + } + + public filterMsgGui() { + const box = window.createInputBox(); + box.prompt = "Search for commit message on current results"; + box.onDidAccept(async () => { + const search = box.value; + box.dispose(); + for (const v of this.logCache.values()) { + // msg filter + const len = v.entries.length; + const entries = v.entries.filter(e => e.msg.includes(search)); + v.entries = entries; + window.showInformationMessage( + `Found ${v.entries.length} commits in ${len} cache.` + ); + } + this._onDidChangeTreeData.fire(undefined); + }); + box.show(); + } public removeRepo(element: ILogTreeItem) { this.logCache.delete((element.data as SvnPath).toString()); From 8e02e0a6fe008078066116ec9b433d7fd26a4882 Mon Sep 17 00:00:00 2001 From: Souls-R <2362912722@qq.com> Date: Tue, 8 Oct 2024 15:00:52 +0800 Subject: [PATCH 2/3] feat: log filter with cache --- package.json | 4 +-- src/historyView/repoLogProvider.ts | 43 ++++++++++++++---------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 5fbc44d7..1c485b45 100644 --- a/package.json +++ b/package.json @@ -329,13 +329,13 @@ { "command": "svn.repolog.filterAuthor", "category": "SVN", - "title": "Filter log by author", + "title": "Set filter by author", "icon": "$(zap)" }, { "command": "svn.repolog.filterMsg", "category": "SVN", - "title": "Filter log by message", + "title": "Set filter by message", "icon": "$(filter)" }, { diff --git a/src/historyView/repoLogProvider.ts b/src/historyView/repoLogProvider.ts index dfc14a14..ccde1177 100644 --- a/src/historyView/repoLogProvider.ts +++ b/src/historyView/repoLogProvider.ts @@ -73,6 +73,8 @@ export class RepoLogProvider ._onDidChangeTreeData.event; // TODO on-disk cache? private readonly logCache: Map = new Map(); + private filterAuthor: string = ""; + private filterMsg: string = ""; private _dispose: Disposable[] = []; private getCached(maybeItem?: ILogTreeItem): ICachedLog { @@ -131,21 +133,14 @@ export class RepoLogProvider public dispose() { dispose(this._dispose); } + public filterAuthorGui() { const box = window.createInputBox(); - box.prompt = "Search for commit authors on current results"; + box.prompt = "Set filter for commit authors, empty to reset"; + box.value = this.filterAuthor; box.onDidAccept(async () => { - const search = box.value; + this.filterAuthor = box.value; box.dispose(); - for (const v of this.logCache.values()) { - // author filter - const len = v.entries.length; - const entries = v.entries.filter(e => e.author.includes(search)); - v.entries = entries; - window.showInformationMessage( - `Found ${v.entries.length} commits in ${len} cache.` - ); - } this._onDidChangeTreeData.fire(undefined); }); box.show(); @@ -153,19 +148,11 @@ export class RepoLogProvider public filterMsgGui() { const box = window.createInputBox(); - box.prompt = "Search for commit message on current results"; + box.prompt = "Set filter for commit message, empty to reset"; + box.value = this.filterMsg; box.onDidAccept(async () => { - const search = box.value; + this.filterMsg = box.value; box.dispose(); - for (const v of this.logCache.values()) { - // msg filter - const len = v.entries.length; - const entries = v.entries.filter(e => e.msg.includes(search)); - v.entries = entries; - window.showInformationMessage( - `Found ${v.entries.length} commits in ${len} cache.` - ); - } this._onDidChangeTreeData.fire(undefined); }); box.show(); @@ -436,7 +423,17 @@ export class RepoLogProvider if (logentries.length === 0) { await fetchMore(cached); } - const result = transform(logentries, LogTreeItemKind.Commit, element); + // filter + const logFiltered = logentries.filter( + ({ author, msg }) => + (this.filterAuthor === "" || author.includes(this.filterAuthor)) && + (this.filterMsg === "" || msg.includes(this.filterMsg)) + ); + + window.showInformationMessage( + `Filtered ${logFiltered.length} of ${logentries.length} entries` + ); + const result = transform(logFiltered, LogTreeItemKind.Commit, element); insertBaseMarker(cached, logentries, result); if (!cached.isComplete) { const ti = new TreeItem(`Load another ${limit} revisions`); From e3f4d62e77627f1c1e40fdcfd2b15657d0ceca18 Mon Sep 17 00:00:00 2001 From: Souls-R <2362912722@qq.com> Date: Tue, 8 Oct 2024 16:18:30 +0800 Subject: [PATCH 3/3] style: change filter icon --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1c485b45..eed47fab 100644 --- a/package.json +++ b/package.json @@ -330,7 +330,7 @@ "command": "svn.repolog.filterAuthor", "category": "SVN", "title": "Set filter by author", - "icon": "$(zap)" + "icon": "$(account)" }, { "command": "svn.repolog.filterMsg",