Skip to content

Commit 6a58c86

Browse files
committed
~ Transferable brewfile rewrite
1 parent e912213 commit 6a58c86

File tree

16 files changed

+242
-42
lines changed

16 files changed

+242
-42
lines changed

Cork/ContentView.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import CorkTerminalFunctions
1414
import Defaults
1515
import FactoryKit
1616
import SwiftUI
17+
import CorkFeature_Brewfiles
1718

1819
struct ContentView: View, Sendable
1920
{
@@ -33,6 +34,8 @@ struct ContentView: View, Sendable
3334

3435
@InjectedObservable(\.appState) var appState: AppState
3536
@InjectedObservable(\.navigationManager) var navigationManager
37+
38+
@InjectedObservable(\.brewfileManager) var brewfileManager
3639

3740
@Environment(BrewPackagesTracker.self) var brewPackagesTracker: BrewPackagesTracker
3841
@Environment(TapTracker.self) var tapTracker: TapTracker
@@ -436,7 +439,7 @@ private extension View
436439
SudoRequiredForRemovalSheet()
437440

438441
case .brewfileExport:
439-
BrewfileExportProgressView()
442+
BrewfileManager.BrewfileExportStage.exporting
440443

441444
case .brewfileImport:
442445
BrewfileImportProgressView()
@@ -447,7 +450,7 @@ private extension View
447450
case false:
448451
MaintenanceView()
449452
case true:
450-
MaintenanceView(shouldPurgeCache: false, shouldUninstallOrphans: false, shouldPerformHealthCheck: false, forcedOptions: true)
453+
MaintenanceView()
451454
}
452455
}
453456
}

Cork/CorkApp.swift

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -182,24 +182,9 @@ struct CorkApp: App
182182
setAppBadge(outdatedPackageNotificationType: outdatedPackageNotificationType)
183183
}
184184
}
185-
.fileExporter(
186-
isPresented: $isShowingBrewfileExporter,
187-
document: StringFile(initialText: brewfileContents),
188-
contentType: .homebrewBackup,
189-
defaultFilename: defaultBackupDateFormat != .omitted ? String(localized: "brewfile.export.default-export-name-\(Date().formatted(date: defaultBackupDateFormat, time: .omitted))") : String(localized: "brewfile.export.default-export-name.empty")
190-
)
191-
{ result in
192-
switch result
193-
{
194-
case .success(let success):
195-
AppConstants.shared.logger.log("Succeeded in exporting: \(success, privacy: .public)")
196-
case .failure(let failure):
197-
AppConstants.shared.logger.error("Failed in exporting: \(failure, privacy: .public)")
198-
}
199-
}
200185
.fileImporter(
201186
isPresented: $isShowingBrewfileImporter,
202-
allowedContentTypes: [.homebrewBackup],
187+
allowedContentTypes: [.brewbak],
203188
allowsMultipleSelection: false
204189
)
205190
{ result in
@@ -429,6 +414,14 @@ struct CorkApp: App
429414
@ViewBuilder
430415
var backupAndRestoreMenuBarSection: some View
431416
{
417+
Button
418+
{
419+
appState.showSheet(ofType: .brewfileExport)
420+
} label: {
421+
Label("navigation.menu.import-export.export-brewfile", systemImage: "square.and.arrow.up")
422+
}
423+
424+
/*
432425
AsyncButton
433426
{
434427
do throws(BrewfileManager.BrewfileDumpingError)
@@ -459,7 +452,8 @@ struct CorkApp: App
459452
Label("navigation.menu.import-export.export-brewfile", systemImage: "square.and.arrow.up")
460453
}
461454
.asyncButtonStyle(.plainStyle)
462-
455+
*/
456+
463457
AsyncButton
464458
{
465459
do throws(BrewfileManager.BrewfileReadingError)

Cork/Extensions/UTType - Homebrew Backup Format.swift

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,3 @@
88
import Foundation
99
import UniformTypeIdentifiers
1010

11-
extension UTType
12-
{
13-
static var homebrewBackup: UTType
14-
{
15-
UTType(exportedAs: "com.davidbures.homebrew-backup")
16-
}
17-
}

Cork/Info.plist

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,18 @@
5252
</dict>
5353
</dict>
5454
</array>
55+
<key>UTExportedTypeDeclarations</key>
56+
<array>
57+
<dict>
58+
<key>UTTypeIdentifier</key>
59+
<string>eu.davidbures.brewfile</string>
60+
<key>UTTypeConformsTo</key>
61+
<array>
62+
<string>public.plain-text</string>
63+
</array>
64+
<key>UTTypeTagSpecification</key>
65+
<dict/>
66+
</dict>
67+
</array>
5568
</dict>
5669
</plist>

Cork/Localizable.xcstrings

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26848,6 +26848,10 @@
2684826848
}
2684926849
}
2685026850
},
26851+
"backup.brewbak-file.name" : {
26852+
"comment" : "A label displayed in the macOS menu bar.",
26853+
"isCommentAutoGenerated" : true
26854+
},
2685126855
"brewfile.export.default-export-name-%@" : {
2685226856
"localizations" : {
2685326857
"cs" : {

Cork/Logic/Services/Load up Services.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,14 @@ extension ServicesTracker
8888

8989
do
9090
{
91-
guard let decodableData: Data = rawOutput.getJsonFromOutput(failOnAnyErrorsPresent: true)
91+
guard !rawOutput.isEmpty && !rawOutput.contains("No services available", in: .standardErrors, .standardOutputs)
92+
else
93+
{
94+
AppConstants.shared.logger.info("There are no services to load")
95+
return
96+
}
97+
98+
guard let decodableData: Data = rawOutput.getJsonFromOutput(failOnAnyErrorsPresent: false)
9299
else
93100
{
94101
AppConstants.shared.logger.error("Failed while converting services string to data")

Cork/Models/Data File.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Foundation
99
import SwiftUI
1010
import UniformTypeIdentifiers
1111

12+
/*
1213
struct StringFile: FileDocument
1314
{
1415
static var readableContentTypes: [UTType]
@@ -75,3 +76,5 @@ struct DataFile: FileDocument
7576
return FileWrapper(regularFileWithContents: data)
7677
}
7778
}
79+
80+
*/

Cork/Views/Start Page/Start Page.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ struct StartPage: View
153153

154154
ButtonBottomRow
155155
{
156+
#if DEBUG
157+
BrewfileIconProxy(brewbak: .init(text: "tap: marsanne/cask"))
158+
#endif
159+
156160
Spacer()
157161

158162
OpenMaintenanceSheetButton(appState: appState, labelType: .openMaintenanceSheet)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// Brewbak File.swift
3+
// Cork
4+
//
5+
// Created by David Bureš - P on 29.03.2026.
6+
//
7+
8+
import Foundation
9+
import UniformTypeIdentifiers
10+
11+
public extension UTType
12+
{
13+
static let brewbak = UTType(exportedAs: "eu.davidbures.brewfile", conformingTo: .plainText)
14+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// Brewbak Transferable.swift
3+
// Cork
4+
//
5+
// Created by David Bureš - P on 29.03.2026.
6+
//
7+
8+
import CoreTransferable
9+
import UniformTypeIdentifiers
10+
11+
public struct BrewbakFile: Transferable
12+
{
13+
public let text: String
14+
15+
public static var transferRepresentation: some TransferRepresentation
16+
{
17+
FileRepresentation(exportedContentType: .brewbak)
18+
{ contents in
19+
let url = FileManager.default.temporaryDirectory
20+
.appending(component: "Brewfile", directoryHint: .notDirectory)
21+
22+
try contents.text.write(to: url, atomically: true, encoding: .utf8)
23+
24+
return SentTransferredFile(url)
25+
}
26+
}
27+
28+
public init(text: String)
29+
{
30+
self.text = text
31+
}
32+
}

0 commit comments

Comments
 (0)