Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Darwin
import Dispatch
import Foundation
import Testing
@testable import CmuxGit
Expand All @@ -20,6 +21,31 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing {
}

@Suite struct ReftableGitMetadataTests {
// These real-process tests assert Git semantics, not UI latency. Keep them
// bounded while allowing process scheduling during the parallel package run.
private static let integrationWallTime: TimeInterval = 15

@Test func expiredReferenceDeadlineRemainsUnreadable() throws {
let fixture = try GitRepositoryFixture()
try fixture.writeBranch("main")
let repository = try #require(
GitMetadataService.resolveGitRepository(containing: fixture.root.path)
)
let reader = SystemGitReferenceReader(
runner: FakeWorkspaceChangesGitRunner(results: [:], beforeRun: { _, _ in
Issue.record("An expired reference read must not start Git")
})
)

let snapshot = reader.snapshot(
repository: repository,
deadline: DispatchTime(uptimeNanoseconds: 1)
)

#expect(snapshot.checkedOutBranch == .unreadable)
#expect(snapshot.currentCommit == nil)
}

@Test func referenceResolverRetainsAbsoluteUserPathGitCandidates() {
let userGitDirectory = "/Users/cmux-tests/.local/bin"
let resolver = SystemGitExecutableResolver(
Expand Down Expand Up @@ -163,7 +189,12 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing {
)
#expect(head.trimmingCharacters(in: .whitespacesAndNewlines) == "ref: refs/heads/.invalid")

let service = GitMetadataService()
let service = GitMetadataService(
fileStatusReader: SystemGitFileStatusReader(),
safetyConfiguration: GitMetadataSafetyConfiguration(
gitStatusWallTime: Self.integrationWallTime
)
)
let initialMetadata = await service.workspaceMetadata(for: worktree.path)
#expect(initialMetadata.branch == initialBranch)
#expect(await service.checkedOutBranch(forDirectory: worktree.path) == .branch(initialBranch))
Expand Down Expand Up @@ -201,7 +232,9 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing {
let repository = try #require(
GitMetadataService.resolveGitRepository(containing: repositoryRoot.path)
)
let snapshot = SystemGitReferenceReader().snapshot(repository: repository)
let snapshot = SystemGitReferenceReader(
boundedCommandWallTimeLimit: Self.integrationWallTime
).snapshot(repository: repository)

#expect(snapshot.checkedOutBranch == .branch(branch))
#expect(snapshot.currentCommit == nil)
Expand Down Expand Up @@ -355,11 +388,20 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing {
environment["GIT_CONFIG_KEY_0"] = "core.worktree"
environment["GIT_CONFIG_VALUE_0"] = unrelated.path
let reader = SystemGitReferenceReader(
runner: SystemWorkspaceChangesGitRunner(environment: environment)
runner: SystemWorkspaceChangesGitRunner(
// Use the executable that successfully created this repository;
// backend fallback has its own test below.
executableURL: fixture.gitExecutableURL,
environment: environment
)
)

let snapshot = reader.snapshot(repository: intendedRepository)
let snapshot = reader.snapshot(
repository: intendedRepository,
deadline: .now() + Self.integrationWallTime
)

#expect(snapshot.usesGitPlumbing)
#expect(snapshot.checkedOutBranch == .branch(intendedBranch))
}

Expand Down Expand Up @@ -389,7 +431,10 @@ private struct NeverDirectoryProbe: GitReferenceStorageProbing {
let snapshot = SystemGitReferenceReader(runners: [
SystemWorkspaceChangesGitRunner(executableURL: URL(fileURLWithPath: "/usr/bin/false")),
SystemWorkspaceChangesGitRunner(executableURL: fixture.gitExecutableURL),
]).snapshot(repository: repository)
]).snapshot(
repository: repository,
deadline: .now() + Self.integrationWallTime
)

#expect(snapshot.checkedOutBranch == .branch(branch))
}
Expand Down
Loading