diff --git a/supacode/Domain/ArchiveScriptProgress.swift b/supacode/Domain/ArchiveScriptProgress.swift index c80a5e00..ecb2ffbd 100644 --- a/supacode/Domain/ArchiveScriptProgress.swift +++ b/supacode/Domain/ArchiveScriptProgress.swift @@ -3,15 +3,18 @@ import Foundation nonisolated struct ArchiveScriptProgress: Hashable, Sendable { var titleText: String var detailText: String + var commandText: String? var outputLines: [String] init( titleText: String, detailText: String, + commandText: String? = nil, outputLines: [String] = [] ) { self.titleText = titleText self.detailText = detailText + self.commandText = commandText self.outputLines = outputLines } diff --git a/supacode/Domain/WorktreeCreationProgress.swift b/supacode/Domain/WorktreeCreationProgress.swift index 130d70ac..64a62edf 100644 --- a/supacode/Domain/WorktreeCreationProgress.swift +++ b/supacode/Domain/WorktreeCreationProgress.swift @@ -6,6 +6,7 @@ nonisolated struct WorktreeCreationProgress: Hashable, Sendable { var copyUntracked: Bool? var ignoredFilesToCopyCount: Int? var untrackedFilesToCopyCount: Int? + var commandText: String? var latestOutputLine: String? var outputLines: [String] @@ -17,6 +18,7 @@ nonisolated struct WorktreeCreationProgress: Hashable, Sendable { copyUntracked: Bool? = nil, ignoredFilesToCopyCount: Int? = nil, untrackedFilesToCopyCount: Int? = nil, + commandText: String? = nil, latestOutputLine: String? = nil, outputLines: [String] = [] ) { @@ -27,6 +29,7 @@ nonisolated struct WorktreeCreationProgress: Hashable, Sendable { self.copyUntracked = copyUntracked self.ignoredFilesToCopyCount = ignoredFilesToCopyCount self.untrackedFilesToCopyCount = untrackedFilesToCopyCount + self.commandText = commandText self.latestOutputLine = latestOutputLine self.outputLines = outputLines } diff --git a/supacode/Domain/WorktreeLoadingInfo.swift b/supacode/Domain/WorktreeLoadingInfo.swift index 1670f269..779e9d92 100644 --- a/supacode/Domain/WorktreeLoadingInfo.swift +++ b/supacode/Domain/WorktreeLoadingInfo.swift @@ -4,5 +4,6 @@ struct WorktreeLoadingInfo: Hashable { let state: WorktreeLoadingState let statusTitle: String? let statusDetail: String? + let statusCommand: String? let statusLines: [String] } diff --git a/supacode/Features/Repositories/Reducer/RepositoriesFeature.swift b/supacode/Features/Repositories/Reducer/RepositoriesFeature.swift index 1edbb5d1..c0410c58 100644 --- a/supacode/Features/Repositories/Reducer/RepositoriesFeature.swift +++ b/supacode/Features/Repositories/Reducer/RepositoriesFeature.swift @@ -970,6 +970,13 @@ struct RepositoriesFeature { progress.untrackedFilesToCopyCount = copyUntracked ? ((try? await gitClient.untrackedFileCount(repository.rootURL)) ?? 0) : 0 progress.stage = .creatingWorktree + progress.commandText = worktreeCreateCommand( + repositoryRootURL: repository.rootURL, + name: name, + copyIgnored: copyIgnored, + copyUntracked: copyUntracked, + baseRef: resolvedBaseRef + ) await send( .pendingWorktreeProgressUpdated( id: pendingID, diff --git a/supacode/Features/Repositories/Views/WorktreeDetailView.swift b/supacode/Features/Repositories/Views/WorktreeDetailView.swift index 9a29205d..327a3d98 100644 --- a/supacode/Features/Repositories/Views/WorktreeDetailView.swift +++ b/supacode/Features/Repositories/Views/WorktreeDetailView.swift @@ -389,6 +389,7 @@ struct WorktreeDetailView: View { state: .removing, statusTitle: nil, statusDetail: nil, + statusCommand: nil, statusLines: [] ) } @@ -400,6 +401,7 @@ struct WorktreeDetailView: View { state: .archiving, statusTitle: progress?.titleText ?? selectedRow.name, statusDetail: progress?.detailText ?? selectedRow.detail, + statusCommand: progress?.commandText, statusLines: progress?.outputLines ?? [] ) } @@ -413,6 +415,7 @@ struct WorktreeDetailView: View { state: .creating, statusTitle: progress?.titleText ?? selectedRow.name, statusDetail: progress?.detailText ?? selectedRow.detail, + statusCommand: progress?.commandText, statusLines: progress?.liveOutputLines ?? [] ) } diff --git a/supacode/Features/Repositories/Views/WorktreeLoadingView.swift b/supacode/Features/Repositories/Views/WorktreeLoadingView.swift index 4ec7fca1..62c44f22 100644 --- a/supacode/Features/Repositories/Views/WorktreeLoadingView.swift +++ b/supacode/Features/Repositories/Views/WorktreeLoadingView.swift @@ -21,6 +21,7 @@ struct WorktreeLoadingView: View { "\(actionLabel) worktree..." } let statusLine = info.statusDetail ?? info.statusTitle ?? fallbackStatus + let statusCommand = info.statusCommand VStack(spacing: 10) { ProgressView() Text(info.name) @@ -31,10 +32,25 @@ struct WorktreeLoadingView: View { .font(.subheadline) .foregroundStyle(.secondary) .multilineTextAlignment(.center) + if let statusCommand { + Text(statusCommand) + .font(.caption) + .monospaced() + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } } else { ScrollViewReader { scrollProxy in ScrollView { VStack(alignment: .leading, spacing: 4) { + if let statusCommand { + Text(statusCommand) + .font(.caption) + .monospaced() + .foregroundStyle(.secondary) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + } ForEach(Array(info.statusLines.enumerated()), id: \.offset) { _, line in Text(line) .font(.caption)