From 6287c0190eab79ffe2d68140397e3b7d01523dbd Mon Sep 17 00:00:00 2001 From: khoi Date: Sat, 31 Jan 2026 11:59:21 +0700 Subject: [PATCH] Disable copy flags for bare repos --- supacode/Clients/Git/GitClient.swift | 8 ++------ .../Reducer/RepositorySettingsFeature.swift | 17 +++++++++++++++-- .../Settings/Views/RepositorySettingsView.swift | 2 ++ supacodeTests/GitWtWorktreeEntryTests.swift | 2 +- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/supacode/Clients/Git/GitClient.swift b/supacode/Clients/Git/GitClient.swift index 03ac6906..c9303b9a 100644 --- a/supacode/Clients/Git/GitClient.swift +++ b/supacode/Clients/Git/GitClient.swift @@ -67,9 +67,8 @@ struct GitClient { return [] } let data = Data(trimmed.utf8) - let entries = GitWtWorktreeEntry.filteringBare( - try JSONDecoder().decode([GitWtWorktreeEntry].self, from: data) - ) + let entries = try JSONDecoder().decode([GitWtWorktreeEntry].self, from: data) + .filter { !$0.isBare } let worktreeEntries = entries.enumerated().map { index, entry in let worktreeURL = URL(fileURLWithPath: entry.path).standardizedFileURL let name = entry.branch.isEmpty ? worktreeURL.lastPathComponent : entry.branch @@ -575,7 +574,4 @@ struct GitWtWorktreeEntry: Decodable, Equatable { case isBare = "is_bare" } - static func filteringBare(_ entries: [GitWtWorktreeEntry]) -> [GitWtWorktreeEntry] { - entries.filter { !$0.isBare } - } } diff --git a/supacode/Features/RepositorySettings/Reducer/RepositorySettingsFeature.swift b/supacode/Features/RepositorySettings/Reducer/RepositorySettingsFeature.swift index 33657f37..5167460b 100644 --- a/supacode/Features/RepositorySettings/Reducer/RepositorySettingsFeature.swift +++ b/supacode/Features/RepositorySettings/Reducer/RepositorySettingsFeature.swift @@ -59,9 +59,20 @@ struct RepositorySettingsFeature { } case .settingsLoaded(let settings, let isBareRepository): - state.settings = settings + var updatedSettings = settings + if isBareRepository { + updatedSettings.copyIgnoredOnWorktreeCreate = false + updatedSettings.copyUntrackedOnWorktreeCreate = false + } + state.settings = updatedSettings state.isBareRepository = isBareRepository - return .none + guard isBareRepository, updatedSettings != settings else { return .none } + let rootURL = state.rootURL + let repositorySettingsClient = repositorySettingsClient + return .run { send in + repositorySettingsClient.save(updatedSettings, rootURL) + await send(.delegate(.settingsChanged(rootURL))) + } case .branchDataLoaded(let branches, let defaultBaseRef): state.defaultWorktreeBaseRef = defaultBaseRef @@ -107,6 +118,7 @@ struct RepositorySettingsFeature { } case .setCopyIgnoredOnWorktreeCreate(let isEnabled): + guard !state.isBareRepository else { return .none } state.settings.copyIgnoredOnWorktreeCreate = isEnabled let settings = state.settings let rootURL = state.rootURL @@ -117,6 +129,7 @@ struct RepositorySettingsFeature { } case .setCopyUntrackedOnWorktreeCreate(let isEnabled): + guard !state.isBareRepository else { return .none } state.settings.copyUntrackedOnWorktreeCreate = isEnabled let settings = state.settings let rootURL = state.rootURL diff --git a/supacode/Features/Settings/Views/RepositorySettingsView.swift b/supacode/Features/Settings/Views/RepositorySettingsView.swift index a80a5136..73da707f 100644 --- a/supacode/Features/Settings/Views/RepositorySettingsView.swift +++ b/supacode/Features/Settings/Views/RepositorySettingsView.swift @@ -46,6 +46,7 @@ struct RepositorySettingsView: View { set: { store.send(.setCopyIgnoredOnWorktreeCreate($0)) } ) ) + .disabled(store.isBareRepository) Toggle( "Copy untracked files to new worktrees", isOn: Binding( @@ -53,6 +54,7 @@ struct RepositorySettingsView: View { set: { store.send(.setCopyUntrackedOnWorktreeCreate($0)) } ) ) + .disabled(store.isBareRepository) if store.isBareRepository { Text("Copy flags are ignored for bare repositories.") .foregroundStyle(.secondary) diff --git a/supacodeTests/GitWtWorktreeEntryTests.swift b/supacodeTests/GitWtWorktreeEntryTests.swift index 70cfd7e4..291beaab 100644 --- a/supacodeTests/GitWtWorktreeEntryTests.swift +++ b/supacodeTests/GitWtWorktreeEntryTests.swift @@ -23,7 +23,7 @@ struct GitWtWorktreeEntryTests { GitWtWorktreeEntry(branch: "(bare)", path: "/tmp/repo.git", head: "", isBare: true), GitWtWorktreeEntry(branch: "main", path: "/tmp/worktree", head: "abc123", isBare: false), ] - let filtered = GitWtWorktreeEntry.filteringBare(entries) + let filtered = entries.filter { !$0.isBare } #expect(filtered.count == 1) #expect(filtered.first?.branch == "main") } -- 2.51.2