diff --git a/package.json b/package.json index b4998738..eed47fab 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": "Set filter by author", + "icon": "$(account)" + }, + { + "command": "svn.repolog.filterMsg", + "category": "SVN", + "title": "Set filter 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..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<string, ICachedLog> = new Map(); + private filterAuthor: string = ""; + private filterMsg: string = ""; private _dispose: Disposable[] = []; private getCached(maybeItem?: ILogTreeItem): ICachedLog { @@ -118,7 +120,13 @@ 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) ); } @@ -126,6 +134,30 @@ export class RepoLogProvider dispose(this._dispose); } + public filterAuthorGui() { + const box = window.createInputBox(); + box.prompt = "Set filter for commit authors, empty to reset"; + box.value = this.filterAuthor; + box.onDidAccept(async () => { + this.filterAuthor = box.value; + box.dispose(); + this._onDidChangeTreeData.fire(undefined); + }); + box.show(); + } + + public filterMsgGui() { + const box = window.createInputBox(); + box.prompt = "Set filter for commit message, empty to reset"; + box.value = this.filterMsg; + box.onDidAccept(async () => { + this.filterMsg = box.value; + box.dispose(); + this._onDidChangeTreeData.fire(undefined); + }); + box.show(); + } + public removeRepo(element: ILogTreeItem) { this.logCache.delete((element.data as SvnPath).toString()); this.refresh(); @@ -391,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`);