Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion macos/Sources/App/macOS/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ class AppDelegate: NSObject,
/// The observer for the app appearance.
private var appearanceObserver: NSKeyValueObservation?

private var userDefaultsObserver: NSObjectProtocol? = nil
private var userDefaultsObserver: NSObjectProtocol?
private var agentStatusBadgeCancellable: AnyCancellable?

/// Signals
Expand Down
26 changes: 17 additions & 9 deletions macos/Sources/Features/GitDiff/DiffParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ enum DiffParser {
var files: [DiffFile] = []
files.reserveCapacity(32)

var current: FileAccumulator? = nil
var current: FileAccumulator?

func finishCurrent() {
guard var acc = current else { return }
Expand Down Expand Up @@ -148,7 +148,7 @@ enum DiffParser {
var status: DiffFileStatus

var hunks: [HunkAccumulator] = []
var currentHunk: HunkAccumulator? = nil
var currentHunk: HunkAccumulator?

var fallbackLines: [String] = []
var additions: Int = 0
Expand Down Expand Up @@ -383,11 +383,18 @@ enum DiffParser {
return (stripGitDiffPathPrefix(a), stripGitDiffPathPrefix(b))
}

private static func parseHunkHeader(_ line: String) -> (oldStart: Int, oldCount: Int, newStart: Int, newCount: Int) {
struct HunkRange {
let oldStart: Int
let oldCount: Int
let newStart: Int
let newCount: Int
}

private static func parseHunkHeader(_ line: String) -> HunkRange {
let ns = line as NSString
let range = NSRange(location: 0, length: ns.length)
guard let match = hunkHeaderRegex.firstMatch(in: line, options: [], range: range) else {
return (0, 0, 0, 0)
return HunkRange(oldStart: 0, oldCount: 0, newStart: 0, newCount: 0)
}
func intGroup(_ idx: Int, default defaultValue: Int) -> Int {
guard idx < match.numberOfRanges else { return defaultValue }
Expand All @@ -396,11 +403,12 @@ enum DiffParser {
let s = ns.substring(with: r)
return Int(s) ?? defaultValue
}
let oldStart = intGroup(1, default: 0)
let oldCount = intGroup(2, default: 1)
let newStart = intGroup(3, default: 0)
let newCount = intGroup(4, default: 1)
return (oldStart, oldCount, newStart, newCount)
return HunkRange(
oldStart: intGroup(1, default: 0),
oldCount: intGroup(2, default: 1),
newStart: intGroup(3, default: 0),
newCount: intGroup(4, default: 1)
)
}

private static func stripGitDiffPathPrefix(_ token: String) -> String {
Expand Down
14 changes: 7 additions & 7 deletions macos/Sources/Features/GitDiff/GitDiffMainView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import SwiftUI
struct GitDiffMainView: View {
@ObservedObject var state: GitDiffSidebarState

@State private var hoveredLineID: String? = nil
@State private var composer: ComposerLocation? = nil
@State private var hoveredLineID: String?
@State private var composer: ComposerLocation?
@State private var composerText: String = ""
@State private var lastVisibleFileID: String? = nil
@State private var lastVisibleFileID: String?

var body: some View {
content
Expand Down Expand Up @@ -60,11 +60,11 @@ private struct DiffDocumentView: View {
private let lineNumberWidth: CGFloat = 36
private let changeMarkerWidth: CGFloat = 3
@State private var highlightCache = DiffHighlightCache()
@State private var headerOffsetsUpdateTask: Task<Void, Never>? = nil
@State private var headerOffsetsUpdateTask: Task<Void, Never>?
@State private var latestHeaderOffsets: [String: CGFloat] = [:]
@State private var scrollTask: Task<Void, Never>? = nil
@State private var scrollTask: Task<Void, Never>?
@State private var isScrolling: Bool = false
@State private var scrollIdleTask: Task<Void, Never>? = nil
@State private var scrollIdleTask: Task<Void, Never>?

private let initialRenderedFiles: Int = 12
private let renderStep: Int = 8
Expand Down Expand Up @@ -416,7 +416,7 @@ private struct DiffLineRow: View {
let canHighlight: Bool
}

@State private var renderedText: AttributedString? = nil
@State private var renderedText: AttributedString?

var body: some View {
VStack(alignment: .leading, spacing: 0) {
Expand Down
28 changes: 14 additions & 14 deletions macos/Sources/Features/GitDiff/GitDiffSidebarState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ final class GitDiffSidebarState: ObservableObject {

@Published var isVisible: Bool = false
@Published var panelWidth: CGFloat = 320
@Published var repoRoot: String? = nil
@Published var repoRoot: String?
@Published var entries: [GitDiffEntry] = []
@Published var source: GitDiffSource = .workingTree {
didSet {
Expand All @@ -53,36 +53,36 @@ final class GitDiffSidebarState: ObservableObject {
handleScopeChange()
}
}
@Published var selectedPath: String? = nil
@Published var currentVisiblePath: String? = nil
@Published var scrollRequest: GitDiffScrollRequest? = nil
@Published var errorMessage: String? = nil
@Published var selectedPath: String?
@Published var currentVisiblePath: String?
@Published var scrollRequest: GitDiffScrollRequest?
@Published var errorMessage: String?
@Published var isLoading: Bool = false
@Published var diffText: String = ""
@Published var diffError: String? = nil
@Published var diffError: String?
@Published var isDiffLoading: Bool = false
@Published var document: DiffDocument? = nil
@Published var document: DiffDocument?
@Published var commentsEnabled: Bool = false
@Published var reviewDraft: DiffReviewDraft = .empty
@Published var collapsedFileIDs: Set<String> = []
@Published var renderedFileCount: Int = 0
@Published var pullRequest: PRStatus? = nil
@Published var selectedWorktreePath: String? = nil
@Published var pullRequest: PRStatus?
@Published var selectedWorktreePath: String?
private var diffRequestID: Int = 0
private var scrollNonce: Int = 0

private let store = GitDiffStore()
private var lastCwd: URL? = nil
private var lastCwd: URL?
private let draftStore = DiffReviewDraftStore()
private var refreshTask: Task<Void, Never>? = nil
private var pendingRefresh: RefreshRequest? = nil
private var refreshTask: Task<Void, Never>?
private var pendingRefresh: RefreshRequest?
private var lastRefreshAt: Date = .distantPast
private var pollTask: Task<Void, Never>? = nil
private var pollTask: Task<Void, Never>?
private let watchQueue = DispatchQueue(label: "gitdiff.watch", qos: .utility)
private var watchSources: [DispatchSourceFileSystemObject] = []
private var watchFileDescriptors: [Int32] = []
private var watchedPaths: [String] = []
private var watchedWorktreePath: String? = nil
private var watchedWorktreePath: String?
private var ignoreWatchEventsUntil: Date = .distantPast

var allCount: Int {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ class TerminalWindow: NSWindow {
private(set) var derivedConfig: DerivedConfig = .init()

/// Sets up our tab context menu
private var tabMenuObserver: NSObjectProtocol? = nil
private var titlebarFontTabGroupObservation: NSKeyValueObservation? = nil
private var titlebarFontTabBarObservation: NSKeyValueObservation? = nil
private var lastTitlebarFontState: TitlebarFontState? = nil
private var lastAppliedAppearance: AppearanceState? = nil
private var tabMenuObserver: NSObjectProtocol?
private var titlebarFontTabGroupObservation: NSKeyValueObservation?
private var titlebarFontTabBarObservation: NSKeyValueObservation?
private var lastTitlebarFontState: TitlebarFontState?
private var lastAppliedAppearance: AppearanceState?

/// Whether this window supports the update accessory. If this is false, then views within this
/// window should determine how to show update notifications.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool
private var viewModel = ViewModel()

private var worktrunkSidebarWidth: CGFloat = defaultSidebarWidth
private var tabBarLeftConstraint: NSLayoutConstraint? = nil
private var tabBarLeftConstraint: NSLayoutConstraint?
private var displayTitle: String = "👻 Ghostree"
/// Titlebar tabs can't support the update accessory because of the way we layout
/// the native tabs back into the menu bar.
Expand Down Expand Up @@ -272,7 +272,7 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool
func updateWorktrunkSidebarWidth(_ width: CGFloat) {
worktrunkSidebarWidth = max(0, width)

let windowButtonsPadding: CGFloat = switch(self.derivedConfig.macosWindowButtons) {
let windowButtonsPadding: CGFloat = switch self.derivedConfig.macosWindowButtons {
case .hidden: 0
case .visible: windowControlButtonsWidth
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ private let defaultSidebarWidth: CGFloat = 280
/// Titlebar tabs for macOS 13 to 15.
class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
fileprivate var worktrunkSidebarWidth: CGFloat = defaultSidebarWidth
private var windowButtonsBackdropWidthConstraint: NSLayoutConstraint? = nil
private var windowButtonsBackdropWidthConstraint: NSLayoutConstraint?

/// Titlebar tabs can't support the update accessory because of the way we layout
/// the native tabs back into the menu bar.
Expand Down
2 changes: 1 addition & 1 deletion macos/Sources/Features/Update/UpdatePopoverView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ private struct UpdateAvailableView: View {
}
}

fileprivate struct HomebrewUpdateView: View {
private struct HomebrewUpdateView: View {
let update: UpdateState.HomebrewUpdate
let dismiss: DismissAction

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1100,7 +1100,7 @@ private struct CreateWorktreeSheet: View {
@State private var base: String = ""
@State private var createBranch: Bool = true
@State private var isWorking: Bool = false
@State private var errorText: String? = nil
@State private var errorText: String?

var body: some View {
VStack(alignment: .leading, spacing: 12) {
Expand Down
20 changes: 10 additions & 10 deletions macos/Sources/Features/Worktrunk/WorktrunkStore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,8 @@ final class SessionIndexManager {
}

enum WorktreeSortOrder: String, CaseIterable {
case alphabetical = "alphabetical"
case recentActivity = "recentActivity"
case alphabetical
case recentActivity

var label: String {
switch self {
Expand All @@ -181,8 +181,8 @@ enum WorktreeSortOrder: String, CaseIterable {
}

enum WorktrunkSidebarListMode: String {
case nestedByRepo = "nestedByRepo"
case flatWorktrees = "flatWorktrees"
case nestedByRepo
case flatWorktrees
}

final class WorktrunkStore: ObservableObject {
Expand Down Expand Up @@ -269,7 +269,7 @@ final class WorktrunkStore: ObservableObject {
@Published var isRefreshing: Bool = false
@Published var isInstallingWorktrunk: Bool = false
@Published var needsWorktrunkInstall: Bool = false
@Published var errorMessage: String? = nil
@Published var errorMessage: String?
@Published private(set) var sidebarModelRevision: Int = 0
@Published var worktreeSortOrder: WorktreeSortOrder = .recentActivity {
didSet {
Expand All @@ -295,13 +295,13 @@ final class WorktrunkStore: ObservableObject {
private let firstSeenAtKey = "GhostreeWorktrunkWorktreeFirstSeenAtByPath.v1"
private let sessionCache = SessionCacheManager()
private let sessionIndex = SessionIndexManager()
private var agentEventTailer: AgentEventTailer? = nil
private var agentEventTailer: AgentEventTailer?
private var pendingAgentEventsByCwd: [String: AgentLifecycleEvent] = [:]
private var agentStatusAckedAtByWorktreePath: [String: Date] = [:]
private var firstSeenAtByWorktreePath: [String: Date] = [:]
private var lastAppQuitTimestamp: Date?
private var sidebarModelRevisionCounter: Int = 0
private var refreshAllTask: Task<Void, Never>? = nil
private var refreshAllTask: Task<Void, Never>?
private var refreshAllNeedsRerun: Bool = false

init() {
Expand Down Expand Up @@ -631,7 +631,7 @@ final class WorktrunkStore: ObservableObject {
await MainActor.run {
var removedPaths = Set<String>()
var didChangeFirstSeen = false
var lastError: String? = nil
var lastError: String?

for repo in repoSnapshot {
guard let result = resultsByRepoID[repo.id] else { continue }
Expand Down Expand Up @@ -1672,7 +1672,7 @@ final class WorktrunkStore: ObservableObject {
.appendingPathComponent("session")
.appendingPathComponent("message")
.appendingPathComponent(info.id)
var messageDirMtime: TimeInterval? = nil
var messageDirMtime: TimeInterval?
var messageCount = 0
if let dirAttrs = try? FileManager.default.attributesOfItem(atPath: messageDir.path),
let dirMtime = (dirAttrs[.modificationDate] as? Date)?.timeIntervalSince1970 {
Expand Down Expand Up @@ -1977,7 +1977,7 @@ final class WorktrunkStore: ObservableObject {
// MARK: - Session Helpers

private func findMatchingWorktree(_ cwd: String) -> String? {
var bestMatch: String? = nil
var bestMatch: String?
var bestLength = 0
let normalizedCwd = normalizePathForMatch(cwd)

Expand Down
Loading