native macOS codings agent orchestrator
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Remove RepositorySettingsClient, use @Shared directly

Same pattern as SettingsClient - unnecessary indirection around @Shared.
Replaced all usages with direct @Shared(.repositorySettings(url)) access:

- Simplifies AppFeature settings selection and worktree settings loading
- Removes async effects where sync @Shared access suffices
- Simplifies RepositorySettingsFeature load/save operations

khoi b95470e1 478d4531

+23 -72
-34
supacode/Clients/RepositorySettings/RepositorySettingsClient.swift
··· 1 - import ComposableArchitecture 2 - import Foundation 3 - import Sharing 4 - 5 - struct RepositorySettingsClient { 6 - var load: @Sendable (URL) -> RepositorySettings 7 - var save: @Sendable (_ settings: RepositorySettings, _ rootURL: URL) -> Void 8 - } 9 - 10 - extension RepositorySettingsClient: DependencyKey { 11 - static let liveValue = RepositorySettingsClient( 12 - load: { rootURL in 13 - @Shared(.repositorySettings(rootURL)) var settings: RepositorySettings 14 - return settings 15 - }, 16 - save: { settings, rootURL in 17 - @Shared(.repositorySettings(rootURL)) var sharedSettings: RepositorySettings 18 - $sharedSettings.withLock { 19 - $0 = settings 20 - } 21 - } 22 - ) 23 - static let testValue = RepositorySettingsClient( 24 - load: { _ in .default }, 25 - save: { _, _ in } 26 - ) 27 - } 28 - 29 - extension DependencyValues { 30 - var repositorySettingsClient: RepositorySettingsClient { 31 - get { self[RepositorySettingsClient.self] } 32 - set { self[RepositorySettingsClient.self] = newValue } 33 - } 34 - }
+10 -19
supacode/Features/App/Reducer/AppFeature.swift
··· 66 66 } 67 67 68 68 @Dependency(\.analyticsClient) private var analyticsClient 69 - @Dependency(\.repositorySettingsClient) private var repositorySettingsClient 70 69 @Dependency(\.repositoryPersistence) private var repositoryPersistence 71 70 @Dependency(\.workspaceClient) private var workspaceClient 72 71 @Dependency(\.terminalClient) private var terminalClient ··· 120 119 } 121 120 let rootURL = worktree.repositoryRootURL 122 121 let worktreeID = worktree.id 123 - let repositorySettingsClient = repositorySettingsClient 122 + @Shared(.repositorySettings(rootURL)) var repositorySettings 123 + let settings = repositorySettings 124 124 return .merge( 125 125 .run { _ in 126 126 await repositoryPersistence.saveLastFocusedWorktreeID(lastFocusedWorktreeID) ··· 132 132 .run { _ in 133 133 await worktreeInfoWatcher.send(.setSelectedWorktreeID(worktree.id)) 134 134 }, 135 - .run { send in 136 - let settings = repositorySettingsClient.load(rootURL) 137 - await send(.worktreeSettingsLoaded(settings, worktreeID: worktreeID)) 138 - } 135 + .send(.worktreeSettingsLoaded(settings, worktreeID: worktreeID)) 139 136 ) 140 137 141 138 case .repositories(.delegate(.repositoriesChanged(let repositories))): ··· 186 183 state.settings.repositorySettings = nil 187 184 return .none 188 185 } 189 - let settings = repositorySettingsClient.load(repository.rootURL) 186 + @Shared(.repositorySettings(repository.rootURL)) var repositorySettings 190 187 state.settings.repositorySettings = RepositorySettingsFeature.State( 191 188 rootURL: repository.rootURL, 192 - settings: settings 189 + settings: repositorySettings 193 190 ) 194 191 case .general, .notifications, .worktree, .updates, .github: 195 192 state.settings.repositorySettings = nil ··· 239 236 } 240 237 let rootURL = worktree.repositoryRootURL 241 238 let actionID = action.settingsID 242 - let repositorySettingsClient = repositorySettingsClient 243 - return .run { _ in 244 - var settings = repositorySettingsClient.load(rootURL) 245 - settings.openActionID = actionID 246 - repositorySettingsClient.save(settings, rootURL) 247 - } 239 + @Shared(.repositorySettings(rootURL)) var repositorySettings 240 + $repositorySettings.withLock { $0.openActionID = actionID } 241 + return .none 248 242 249 243 case .openSelectedWorktree: 250 244 return .send(.openWorktree(OpenWorktreeAction.availableSelection(state.openActionSelection))) ··· 410 404 return .none 411 405 } 412 406 let worktreeID = selectedWorktree.id 413 - let repositorySettingsClient = repositorySettingsClient 414 - return .run { send in 415 - let settings = repositorySettingsClient.load(rootURL) 416 - await send(.worktreeSettingsLoaded(settings, worktreeID: worktreeID)) 417 - } 407 + @Shared(.repositorySettings(rootURL)) var repositorySettings 408 + return .send(.worktreeSettingsLoaded(repositorySettings, worktreeID: worktreeID)) 418 409 419 410 case .worktreeSettingsLoaded(let settings, let worktreeID): 420 411 guard state.repositories.selectedWorktreeID == worktreeID else {
+5 -4
supacode/Features/Repositories/Reducer/RepositoriesFeature.swift
··· 126 126 @Dependency(\.githubCLI) private var githubCLI 127 127 @Dependency(\.githubIntegration) private var githubIntegration 128 128 @Dependency(\.repositoryPersistence) private var repositoryPersistence 129 - @Dependency(\.repositorySettingsClient) private var repositorySettingsClient 130 129 @Dependency(\.uuid) private var uuid 131 130 132 131 var body: some Reducer<State, Action> { ··· 410 409 } 411 410 let previousSelection = state.selectedWorktreeID 412 411 let pendingID = "pending:\(uuid().uuidString)" 413 - let repositorySettings = repositorySettingsClient.load(repository.rootURL) 412 + @Shared(.repositorySettings(repository.rootURL)) var repositorySettings 414 413 let selectedBaseRef = repositorySettings.worktreeBaseRef 414 + let copyIgnoredOnWorktreeCreate = repositorySettings.copyIgnoredOnWorktreeCreate 415 + let copyUntrackedOnWorktreeCreate = repositorySettings.copyUntrackedOnWorktreeCreate 415 416 state.pendingWorktrees.append( 416 417 PendingWorktree( 417 418 id: pendingID, ··· 444 445 return 445 446 } 446 447 let isBareRepository = (try? await gitClient.isBareRepository(repository.rootURL)) ?? false 447 - let copyIgnored = isBareRepository ? false : repositorySettings.copyIgnoredOnWorktreeCreate 448 - let copyUntracked = isBareRepository ? false : repositorySettings.copyUntrackedOnWorktreeCreate 448 + let copyIgnored = isBareRepository ? false : copyIgnoredOnWorktreeCreate 449 + let copyUntracked = isBareRepository ? false : copyUntrackedOnWorktreeCreate 449 450 let resolvedBaseRef: String 450 451 if (selectedBaseRef ?? "").isEmpty { 451 452 resolvedBaseRef = await gitClient.automaticWorktreeBaseRef(repository.rootURL) ?? ""
+8 -15
supacode/Features/RepositorySettings/Reducer/RepositorySettingsFeature.swift
··· 26 26 case settingsChanged(URL) 27 27 } 28 28 29 - @Dependency(\.repositorySettingsClient) private var repositorySettingsClient 30 29 @Dependency(\.gitClient) private var gitClient 31 30 32 31 var body: some Reducer<State, Action> { ··· 35 34 switch action { 36 35 case .task: 37 36 let rootURL = state.rootURL 38 - let repositorySettingsClient = repositorySettingsClient 37 + @Shared(.repositorySettings(rootURL)) var repositorySettings 38 + let settings = repositorySettings 39 39 let gitClient = gitClient 40 40 return .run { send in 41 - let settings = repositorySettingsClient.load(rootURL) 42 41 let isBareRepository = (try? await gitClient.isBareRepository(rootURL)) ?? false 43 42 await send(.settingsLoaded(settings, isBareRepository: isBareRepository)) 44 43 let branches: [String] ··· 66 65 state.isBareRepository = isBareRepository 67 66 guard isBareRepository, updatedSettings != settings else { return .none } 68 67 let rootURL = state.rootURL 69 - let repositorySettingsClient = repositorySettingsClient 70 - let settingsToSave = updatedSettings 71 - return .run { send in 72 - repositorySettingsClient.save(settingsToSave, rootURL) 73 - await send(.delegate(.settingsChanged(rootURL))) 74 - } 68 + @Shared(.repositorySettings(rootURL)) var repositorySettings 69 + $repositorySettings.withLock { $0 = updatedSettings } 70 + return .send(.delegate(.settingsChanged(rootURL))) 75 71 76 72 case .branchDataLoaded(let branches, let defaultBaseRef): 77 73 state.defaultWorktreeBaseRef = defaultBaseRef ··· 91 87 state.settings.copyIgnoredOnWorktreeCreate = false 92 88 state.settings.copyUntrackedOnWorktreeCreate = false 93 89 } 94 - let settings = state.settings 95 90 let rootURL = state.rootURL 96 - let repositorySettingsClient = repositorySettingsClient 97 - return .run { send in 98 - repositorySettingsClient.save(settings, rootURL) 99 - await send(.delegate(.settingsChanged(rootURL))) 100 - } 91 + @Shared(.repositorySettings(rootURL)) var repositorySettings 92 + $repositorySettings.withLock { $0 = state.settings } 93 + return .send(.delegate(.settingsChanged(rootURL))) 101 94 102 95 case .delegate: 103 96 return .none