Skip to content

Commit 7962ecf

Browse files
committed
fix: keep stale pinned repositories visible in menu filters
1 parent 144ab0f commit 7962ecf

4 files changed

Lines changed: 61 additions & 3 deletions

File tree

Sources/RepoBar/App/AppState+Visibility.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,10 @@ extension AppState {
153153
let uniqueRepos = RepositoryUniquing.byFullName(repos)
154154
let pinnedSet = Set(options.pinned.map { $0.lowercased() })
155155
let hiddenSet = Set(options.hidden.map { $0.lowercased() })
156-
let filtered = uniqueRepos.filter { !hiddenSet.contains($0.fullName.lowercased()) }
156+
let filtered = uniqueRepos.filter {
157+
let key = $0.fullName.lowercased()
158+
return !hiddenSet.contains(key) || pinnedSet.contains(key)
159+
}
157160
let visible = RepositoryFilter.apply(
158161
filtered,
159162
includeForks: options.includeForks,

Sources/RepoBarCore/Support/RepositoryPipeline.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,16 @@ public enum RepositoryPipeline {
6868

6969
switch query.scope {
7070
case .hidden:
71-
filtered = filtered.filter { hiddenSet.contains($0.fullName.lowercased()) }
71+
filtered = filtered.filter {
72+
let key = $0.fullName.lowercased()
73+
return hiddenSet.contains(key) && !pinnedSet.contains(key)
74+
}
7275
case .all, .pinned:
7376
if !hiddenSet.isEmpty {
74-
filtered = filtered.filter { !hiddenSet.contains($0.fullName.lowercased()) }
77+
filtered = filtered.filter {
78+
let key = $0.fullName.lowercased()
79+
return !hiddenSet.contains(key) || pinnedSet.contains(key)
80+
}
7581
}
7682
}
7783

Tests/RepoBarTests/RepositoryPipelineTests.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,37 @@ struct RepositoryPipelineTests {
5858
#expect(result.map(\.fullName) == ["b/two"])
5959
}
6060

61+
@Test
62+
func `Pinned repository remains visible when stale hidden entry remains`() {
63+
let repos = [
64+
Self.makeRepo("a/one", issues: 0, pulls: 0),
65+
Self.makeRepo("b/two", issues: 0, pulls: 0)
66+
]
67+
let query = RepositoryQuery(
68+
scope: .all,
69+
pinned: ["b/two"],
70+
hidden: Set(["b/two"]),
71+
pinPriority: true
72+
)
73+
let result = RepositoryPipeline.apply(repos, query: query)
74+
#expect(result.map(\.fullName) == ["b/two", "a/one"])
75+
}
76+
77+
@Test
78+
func `Hidden scope excludes repositories that are also pinned`() {
79+
let repos = [
80+
Self.makeRepo("a/one", issues: 0, pulls: 0),
81+
Self.makeRepo("b/two", issues: 0, pulls: 0)
82+
]
83+
let query = RepositoryQuery(
84+
scope: .hidden,
85+
pinned: ["b/two"],
86+
hidden: Set(["a/one", "b/two"])
87+
)
88+
let result = RepositoryPipeline.apply(repos, query: query)
89+
#expect(result.map(\.fullName) == ["a/one"])
90+
}
91+
6192
@Test
6293
func `Pinned scope filters to pinned list`() {
6394
let repos = [

Tests/RepoBarTests/VisibilityTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,24 @@ struct VisibilityTests {
4545
#expect(visible.first?.fullName == "me/a")
4646
}
4747

48+
@Test
49+
func `keeps pinned repository visible when stale hidden entry remains`() {
50+
let repo = makeRepository(id: "1", name: "a")
51+
let visible = AppState.selectVisible(
52+
all: [repo],
53+
options: AppState.VisibleSelectionOptions(
54+
pinned: ["me/a"],
55+
hidden: Set(["me/a"]),
56+
includeForks: false,
57+
includeArchived: false,
58+
limit: 5,
59+
ownerFilter: []
60+
)
61+
)
62+
63+
#expect(visible.map(\.fullName) == ["me/a"])
64+
}
65+
4866
@Test
4967
func `applies limit after filtering`() {
5068
let repos = (0 ..< 10).map { idx in

0 commit comments

Comments
 (0)