diff --git a/src/features/vcs/GitLog.tsx b/src/features/vcs/GitLog.tsx index 6d87bee3a..124306dac 100644 --- a/src/features/vcs/GitLog.tsx +++ b/src/features/vcs/GitLog.tsx @@ -59,6 +59,7 @@ import { setLogBranches, setLogFilters, toggleCommitSelection, + toggleRepository, updateLogOptions, useGitLog, } from "./logStore"; @@ -699,7 +700,7 @@ function FilterBar() { repositories.map((repo) => ({ label: repoName(repo), checked: filters.repositories?.includes(repo) ?? false, - run: () => setLogFilters({ repositories: [repo] }), + run: () => setLogFilters({ repositories: toggleRepository(filters.repositories, repo) }), })), ), onClear: () => setLogFilters({ repositories: [] }), diff --git a/src/features/vcs/__tests__/multiRoot.test.ts b/src/features/vcs/__tests__/multiRoot.test.ts index 5abd172eb..0064e42d9 100644 --- a/src/features/vcs/__tests__/multiRoot.test.ts +++ b/src/features/vcs/__tests__/multiRoot.test.ts @@ -26,6 +26,7 @@ import { selectedCommits, selectGitTab, toggleCommitSelection, + toggleRepository, useGitLog, } from "../logStore"; import { useVcs } from "../store"; @@ -131,6 +132,20 @@ describe("multi-root Git log", () => { off(); }); + it("shows several repositories chosen one click at a time in the Repository filter", async () => { + log.mockImplementation(async (repo: string) => ({ status: "ok", data: [commit(repo)] })); + let repositories = toggleRepository(undefined, "/project/front"); + repositories = toggleRepository(repositories, "/project/back"); + expect(repositories).toEqual(["/project/front", "/project/back"]); + useGitLog.setState({ filters: { ...emptyFilters(), repositories } }); + await reloadLog(); + expect(new Set((useGitLog.getState().commits as RepoCommit[]).map((c) => c.repo))).toEqual( + new Set(["/project/front", "/project/back"]), + ); + expect(toggleRepository(repositories, "/project/front")).toEqual(["/project/back"]); + expect(toggleRepository(["/project/back"], "/project/back")).toEqual([]); + }); + it("groups identical local and remote names under distinct repository nodes", () => { const roots = buildRepositoryBranchTree( ["front", "back"].map((name) => ({ diff --git a/src/features/vcs/logStore.ts b/src/features/vcs/logStore.ts index 04c66e44e..59ed9425f 100644 --- a/src/features/vcs/logStore.ts +++ b/src/features/vcs/logStore.ts @@ -85,6 +85,12 @@ export const emptyFilters = (): LogFilters => ({ date: null, }); +/** The Repository filter after clicking `repo`: added when unchecked, removed when checked (none = all). */ +export function toggleRepository(selected: readonly string[] | undefined, repo: string): string[] { + const cur = selected ?? []; + return cur.includes(repo) ? cur.filter((r) => r !== repo) : [...cur, repo]; +} + /** Any filter other than the text field's toggles is set. */ export function hasFilters(f: LogFilters): boolean { return !!(f.repositories?.length || f.branches.length || f.authors.length || f.text || f.path || f.date);