Skip to content

Commit 81051ab

Browse files
committed
Add git ignore checker
1 parent 9f528c6 commit 81051ab

File tree

3 files changed

+81
-2
lines changed

3 files changed

+81
-2
lines changed

Tool/Package.swift

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ let package = Package(
4242
"AppActivator",
4343
]
4444
),
45+
.library(name: "GitIgnoreCheck", targets: ["GitIgnoreCheck"]),
4546
],
4647
dependencies: [
4748
// A fork of https://github.com/aespinilla/Tiktoken to allow loading from local files.
@@ -202,6 +203,7 @@ let package = Package(
202203
.target(
203204
name: "Workspace",
204205
dependencies: [
206+
"GitIgnoreCheck",
205207
"UserDefaultsObserver",
206208
"SuggestionModel",
207209
"Environment",
@@ -235,6 +237,18 @@ let package = Package(
235237
dependencies: ["FocusedCodeFinder"]
236238
),
237239

240+
.target(
241+
name: "GitIgnoreCheck",
242+
dependencies: [
243+
"Terminal",
244+
"Preferences",
245+
.product(
246+
name: "ComposableArchitecture",
247+
package: "swift-composable-architecture"
248+
),
249+
]
250+
),
251+
238252
// MARK: - Services
239253

240254
.target(
@@ -302,7 +316,7 @@ let package = Package(
302316
.product(
303317
name: "ComposableArchitecture",
304318
package: "swift-composable-architecture"
305-
)
319+
),
306320
]
307321
),
308322
.testTarget(
@@ -312,7 +326,7 @@ let package = Package(
312326
.product(
313327
name: "ComposableArchitecture",
314328
package: "swift-composable-architecture"
315-
)
329+
),
316330
]
317331
),
318332

@@ -344,6 +358,7 @@ let package = Package(
344358
"Preferences",
345359
"FocusedCodeFinder",
346360
"XcodeInspector",
361+
"GitIgnoreCheck",
347362
],
348363
path: "Sources/ChatContextCollectors/ActiveDocumentChatContextCollector"
349364
),
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import Dependencies
2+
import Foundation
3+
import Terminal
4+
import Preferences
5+
6+
public struct CheckIfGitIgnoredDependencyKey: DependencyKey {
7+
public static var liveValue: GitIgnoredChecker = DefaultGitIgnoredChecker()
8+
}
9+
10+
public extension DependencyValues {
11+
var gitIgnoredChecker: GitIgnoredChecker {
12+
get { self[CheckIfGitIgnoredDependencyKey.self] }
13+
set { self[CheckIfGitIgnoredDependencyKey.self] = newValue }
14+
}
15+
}
16+
17+
public protocol GitIgnoredChecker {
18+
func checkIfGitIgnored(fileURL: URL) async -> Bool
19+
}
20+
21+
extension GitIgnoredChecker {
22+
func checkIfGitIgnored(filePath: String) async -> Bool {
23+
await checkIfGitIgnored(fileURL: URL(fileURLWithPath: filePath))
24+
}
25+
}
26+
27+
struct DefaultGitIgnoredChecker: GitIgnoredChecker {
28+
func checkIfGitIgnored(fileURL: URL) async -> Bool {
29+
if UserDefaults.shared.value(for: \.disableGitIgnoreCheck) { return false }
30+
let terminal = Terminal()
31+
guard let gitFolderURL = gitFolderURL(forFileURL: fileURL) else {
32+
return false
33+
}
34+
do {
35+
_ = try await terminal.runCommand(
36+
"/bin/bash",
37+
arguments: ["-c", "check-ignore \"filePath\""],
38+
currentDirectoryPath: gitFolderURL.path,
39+
environment: [:]
40+
)
41+
return true
42+
} catch {
43+
return false
44+
}
45+
}
46+
}
47+
48+
func gitFolderURL(forFileURL fileURL: URL) -> URL? {
49+
var currentURL = fileURL
50+
let fileManager = FileManager.default
51+
while currentURL.path != "/" {
52+
let gitFolderURL = currentURL.appendingPathComponent(".git")
53+
if fileManager.fileExists(atPath: gitFolderURL.path) {
54+
return gitFolderURL
55+
}
56+
currentURL = currentURL.deletingLastPathComponent()
57+
}
58+
return nil
59+
}
60+

Tool/Sources/Preferences/Keys.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,10 @@ public extension UserDefaultPreferenceKeys {
546546
key: "FeatureFlag-DisableGitHubCopilotSettingsAutoRefreshOnAppear"
547547
)
548548
}
549+
550+
var disableGitIgnoreCheck: FeatureFlag {
551+
.init(defaultValue: false, key: "FeatureFlag-DisableGitIgnoreCheck")
552+
}
549553

550554
var disableEnhancedWorkspace: FeatureFlag {
551555
.init(

0 commit comments

Comments
 (0)