Skip to content

Commit 148cd24

Browse files
Source Control Settings (#1926)
1 parent 4cd81be commit 148cd24

34 files changed

+1131
-306
lines changed

CodeEdit.xcodeproj/project.pbxproj

Lines changed: 40 additions & 8 deletions
Large diffs are not rendered by default.

CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFileManager+DirectoryEvents.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ extension CEWorkspaceFileManager {
3030
// Can be ignored for now, these I think not related to tree changes
3131
continue
3232
case .rootChanged:
33-
// TODO: Handle workspace root changing.
33+
// TODO: #1880 - Handle workspace root changing.
3434
continue
3535
case .itemCreated, .itemCloned, .itemRemoved, .itemRenamed:
3636
for fileItem in fileItems {
@@ -48,7 +48,10 @@ extension CEWorkspaceFileManager {
4848
self.notifyObservers(updatedItems: files)
4949
}
5050

51-
self.handleGitEvents(events: events)
51+
if Settings.shared.preferences.sourceControl.general.sourceControlIsEnabled &&
52+
Settings.shared.preferences.sourceControl.general.refreshStatusLocally {
53+
self.handleGitEvents(events: events)
54+
}
5255
}
5356
}
5457

CodeEdit/Features/CodeEditUI/Views/ToolbarBranchPicker.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ struct ToolbarBranchPicker: View {
7171
isHovering = active
7272
}
7373
.onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification)) { (_) in
74-
Task {
75-
await sourceControlManager?.refreshCurrentBranch()
74+
if self.currentBranch != nil {
75+
Task {
76+
await sourceControlManager?.refreshCurrentBranch()
77+
}
7678
}
7779
}
7880
.onReceive(
@@ -82,8 +84,10 @@ struct ToolbarBranchPicker: View {
8284
self.currentBranch = branch
8385
}
8486
.task {
85-
await self.sourceControlManager?.refreshCurrentBranch()
86-
await self.sourceControlManager?.refreshBranches()
87+
if Settings.shared.preferences.sourceControl.general.sourceControlIsEnabled {
88+
await self.sourceControlManager?.refreshCurrentBranch()
89+
await self.sourceControlManager?.refreshBranches()
90+
}
8791
}
8892
}
8993

CodeEdit/Features/InspectorArea/HistoryInspector/HistoryInspectorModel.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ final class HistoryInspectorModel: ObservableObject {
4040
do {
4141
let commitHistory = try await sourceControlManager
4242
.gitClient
43-
.getCommitHistory(maxCount: 40, fileLocalPath: fileURL)
43+
.getCommitHistory(
44+
maxCount: 40,
45+
fileLocalPath: fileURL,
46+
showMergeCommits: Settings.shared.preferences.sourceControl.git.showMergeCommitsPerFileLog
47+
)
4448
await setCommitHistory(commitHistory)
4549
} catch {
4650
await setCommitHistory([])

CodeEdit/Features/InspectorArea/HistoryInspector/HistoryInspectorView.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import SwiftUI
88

99
struct HistoryInspectorView: View {
10+
@AppSettings(\.sourceControl.git.showMergeCommitsPerFileLog)
11+
var showMergeCommitsPerFileLog
12+
1013
@EnvironmentObject private var workspace: WorkspaceDocument
1114

1215
@EnvironmentObject private var editorManager: EditorManager
@@ -60,5 +63,10 @@ struct HistoryInspectorView: View {
6063
await model.setWorkspace(sourceControlManager: workspace.sourceControlManager)
6164
await model.setFile(url: editorManager.activeEditor.selectedTab?.file.url.path)
6265
}
66+
.onChange(of: showMergeCommitsPerFileLog) { _ in
67+
Task {
68+
await model.updateCommitHistory()
69+
}
70+
}
6371
}
6472
}

CodeEdit/Features/InspectorArea/Views/InspectorAreaView.swift

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,17 @@ struct InspectorAreaView: View {
1515

1616
@EnvironmentObject private var editorManager: EditorManager
1717

18+
@AppSettings(\.sourceControl.general.sourceControlIsEnabled)
19+
private var sourceControlIsEnabled: Bool
20+
1821
@AppSettings(\.general.inspectorTabBarPosition)
1922
var sidebarPosition: SettingsData.SidebarTabBarPosition
2023

2124
@State private var selection: InspectorTab? = .file
2225

2326
init(viewModel: InspectorAreaViewModel) {
2427
self.viewModel = viewModel
25-
26-
viewModel.tabItems = [.file, .gitHistory]
27-
viewModel.tabItems += extensionManager
28-
.extensions
29-
.map { ext in
30-
ext.availableFeatures.compactMap {
31-
if case .sidebarItem(let data) = $0, data.kind == .inspector {
32-
return InspectorTab.uiExtension(endpoint: ext.endpoint, data: data)
33-
}
34-
return nil
35-
}
36-
}
37-
.joined()
28+
updateTabItems()
3829
}
3930

4031
func getExtension(_ id: String) -> ExtensionInfo? {
@@ -73,5 +64,28 @@ struct InspectorAreaView: View {
7364
.formStyle(.grouped)
7465
.accessibilityElement(children: .contain)
7566
.accessibilityLabel("inspector")
67+
.onChange(of: sourceControlIsEnabled) { _ in
68+
updateTabItems()
69+
}
70+
}
71+
72+
private func updateTabItems() {
73+
viewModel.tabItems = [.file] +
74+
(sourceControlIsEnabled ? [.gitHistory] : []) +
75+
extensionManager
76+
.extensions
77+
.flatMap { ext in
78+
ext.availableFeatures.compactMap {
79+
if case .sidebarItem(let data) = $0, data.kind == .inspector {
80+
return InspectorTab.uiExtension(endpoint: ext.endpoint, data: data)
81+
}
82+
return nil
83+
}
84+
}
85+
if let selectedTab = selection,
86+
!viewModel.tabItems.isEmpty &&
87+
!viewModel.tabItems.contains(selectedTab) {
88+
selection = viewModel.tabItems[0]
89+
}
7690
}
7791
}

CodeEdit/Features/NavigatorArea/SourceControlNavigator/History/Views/SourceControlNavigatorHistoryView.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ struct SourceControlNavigatorHistoryView: View {
1515
case error(error: Error)
1616
}
1717

18+
@AppSettings(\.sourceControl.git.showMergeCommitsPerFileLog)
19+
var showMergeCommitsPerFileLog
20+
1821
@EnvironmentObject var sourceControlManager: SourceControlManager
1922

2023
@State var commitHistoryStatus: Status = .loading
@@ -28,7 +31,10 @@ struct SourceControlNavigatorHistoryView: View {
2831
commitHistoryStatus = .loading
2932
let commits = try await sourceControlManager
3033
.gitClient
31-
.getCommitHistory(branchName: sourceControlManager.currentBranch?.name)
34+
.getCommitHistory(
35+
branchName: sourceControlManager.currentBranch?.name,
36+
showMergeCommits: Settings.shared.preferences.sourceControl.git.showMergeCommitsPerFileLog
37+
)
3238
await MainActor.run {
3339
commitHistory = commits
3440
commitHistoryStatus = .ready
@@ -102,5 +108,10 @@ struct SourceControlNavigatorHistoryView: View {
102108
.task {
103109
await updateCommitHistory()
104110
}
111+
.onChange(of: showMergeCommitsPerFileLog) { _ in
112+
Task {
113+
await updateCommitHistory()
114+
}
115+
}
105116
}
106117
}

CodeEdit/Features/NavigatorArea/SourceControlNavigator/Views/SourceControlNavigatorView.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import SwiftUI
1010
struct SourceControlNavigatorView: View {
1111
@EnvironmentObject private var workspace: WorkspaceDocument
1212

13+
@AppSettings(\.sourceControl.general.fetchRefreshServerStatus)
14+
var fetchRefreshServerStatus
15+
1316
var body: some View {
1417
if let sourceControlManager = workspace.workspaceFileManager?.sourceControlManager {
1518
VStack(spacing: 0) {
@@ -18,7 +21,9 @@ struct SourceControlNavigatorView: View {
1821
.task {
1922
do {
2023
while true {
21-
try await sourceControlManager.fetch()
24+
if fetchRefreshServerStatus {
25+
try await sourceControlManager.fetch()
26+
}
2227
try await Task.sleep(for: .seconds(10))
2328
}
2429
} catch {

CodeEdit/Features/NavigatorArea/Views/NavigatorAreaView.swift

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,13 @@ struct NavigatorAreaView: View {
1515
@AppSettings(\.general.navigatorTabBarPosition)
1616
var sidebarPosition: SettingsData.SidebarTabBarPosition
1717

18+
@AppSettings(\.sourceControl.general.sourceControlIsEnabled)
19+
private var sourceControlIsEnabled: Bool
20+
1821
init(workspace: WorkspaceDocument, viewModel: NavigatorSidebarViewModel) {
1922
self.workspace = workspace
2023
self.viewModel = viewModel
21-
22-
viewModel.tabItems = [.project, .sourceControl, .search] +
23-
extensionManager
24-
.extensions
25-
.map { ext in
26-
ext.availableFeatures.compactMap {
27-
if case .sidebarItem(let data) = $0, data.kind == .navigator {
28-
return NavigatorTab.uiExtension(endpoint: ext.endpoint, data: data)
29-
}
30-
return nil
31-
}
32-
}
33-
.joined()
24+
updateTabItems()
3425
}
3526

3627
var body: some View {
@@ -63,5 +54,29 @@ struct NavigatorAreaView: View {
6354
.environmentObject(workspace)
6455
.accessibilityElement(children: .contain)
6556
.accessibilityLabel("navigator")
57+
.onChange(of: sourceControlIsEnabled) { _ in
58+
updateTabItems()
59+
}
60+
}
61+
62+
private func updateTabItems() {
63+
viewModel.tabItems = [.project] +
64+
(sourceControlIsEnabled ? [.sourceControl] : []) +
65+
[.search] +
66+
extensionManager
67+
.extensions
68+
.flatMap { ext in
69+
ext.availableFeatures.compactMap {
70+
if case .sidebarItem(let data) = $0, data.kind == .navigator {
71+
return NavigatorTab.uiExtension(endpoint: ext.endpoint, data: data)
72+
}
73+
return nil
74+
}
75+
}
76+
if let selectedTab = viewModel.selectedTab,
77+
!viewModel.tabItems.isEmpty &&
78+
!viewModel.tabItems.contains(selectedTab) {
79+
viewModel.selectedTab = viewModel.tabItems[0]
80+
}
6681
}
6782
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// GlobPattern.swift
3+
// CodeEdit
4+
//
5+
// Created by Austin Condiff on 11/2/24.
6+
//
7+
8+
import Foundation
9+
10+
/// A simple model that associates a UUID with a glob pattern string.
11+
///
12+
/// This type does not interpret or validate the glob pattern itself.
13+
/// It is simply an identifier (`id`) and the glob pattern string (`value`) associated with it.
14+
struct GlobPattern: Identifiable, Hashable, Decodable, Encodable {
15+
/// Ephemeral UUID used to uniquely identify this instance in the UI
16+
var id = UUID()
17+
18+
/// The Glob Pattern string
19+
var value: String
20+
}

0 commit comments

Comments
 (0)