diff --git a/Release.md b/Release.md index 333cff8..7ecbb7f 100644 --- a/Release.md +++ b/Release.md @@ -2,8 +2,12 @@ This is a reminder of the steps used to create a release and update the homebrew formula. -1. Push a tagged branch, this will initiate the release being created. - 1. Don't forget to also update the version in `Sources/hpa/Version.swift`, prior. +> Note: These steps apply to the version hosted on `gitea`, on `github` more of these steps can be +> automated in `ci`, but there are no `macOS` host runners currently in `gitea`. + +1. Update the version in `Sources/hpa/Version.swift`. +1. Tag the commit with the next version tag. +1. Push the tagged commit, this will initiate the release being created. 1. Get the `sha` of the `*.tar.gz` in the release. 1. `just get-release-sha` 1. Update the homebrew formula url, sha256, and version at top of the homebrew formula. @@ -11,5 +15,8 @@ This is a reminder of the steps used to create a release and update the homebrew 1. Build and generate a homebrew bottle. 1. `just bottle` 1. Update the `bottle do` section of homebrew formula with output during previous step. + 1. Also make sure the `root_url` in the bottle section points to the new release. 1. Upload the bottle `*.tar.gz` file that was created to the release. 1. Generate a pull-request to the formula repo. +1. Remove the bottle from current directory. + 1. `just remove-bottles` diff --git a/Sources/FileClient/FileClient.swift b/Sources/FileClient/FileClient.swift index 6619b8a..abf17b2 100644 --- a/Sources/FileClient/FileClient.swift +++ b/Sources/FileClient/FileClient.swift @@ -120,7 +120,11 @@ struct LiveFileClient: Sendable { func isDirectory(_ url: URL) -> Bool { var isDirectory: ObjCBool = false - manager.fileExists(atPath: url.cleanFilePath, isDirectory: &isDirectory) + #if os(Linux) + _ = manager.fileExists(atPath: url.cleanFilePath, isDirectory: &isDirectory) + #else + manager.fileExists(atPath: url.cleanFilePath, isDirectory: &isDirectory) + #endif return isDirectory.boolValue } diff --git a/Sources/PlaybookClient/PlaybookClient+RunPlaybook.swift b/Sources/PlaybookClient/PlaybookClient+RunPlaybook.swift index 6bdd7d9..ba303f0 100644 --- a/Sources/PlaybookClient/PlaybookClient+RunPlaybook.swift +++ b/Sources/PlaybookClient/PlaybookClient+RunPlaybook.swift @@ -81,6 +81,8 @@ extension PlaybookClient.RunPlaybook.SharedRunOptions { ) async throws -> T { @Dependency(\.commandClient) var commandClient + try await ensurePlaybookExists() + return try await commandClient.run( logging: loggingOptions, quiet: quiet, @@ -101,6 +103,17 @@ extension PlaybookClient.RunPlaybook.SharedRunOptions { return (arguments, output) } } + + private func ensurePlaybookExists() async throws { + @Dependency(\.fileClient) var fileClient + @Dependency(\.playbookClient.repository) var repository + + let directory = try await repository.directory() + let exists = try await fileClient.isDirectory(URL(filePath: directory)) + if !exists { + try await repository.install() + } + } } @_spi(Internal) diff --git a/Tests/FileClientTests/FileClientTests.swift b/Tests/FileClientTests/FileClientTests.swift index 2b77fa3..9cdaad4 100644 --- a/Tests/FileClientTests/FileClientTests.swift +++ b/Tests/FileClientTests/FileClientTests.swift @@ -23,7 +23,11 @@ struct FileClientTests { let fileClient = FileClient.liveValue let vaultFilePath = url.appending(path: fileName) - FileManager.default.createFile(atPath: vaultFilePath.cleanFilePath, contents: nil) + #if os(Linux) + _ = FileManager.default.createFile(atPath: vaultFilePath.cleanFilePath, contents: nil) + #else + FileManager.default.createFile(atPath: vaultFilePath.cleanFilePath, contents: nil) + #endif let output = try await fileClient.findVaultFile(url)! #expect(output.cleanFilePath == vaultFilePath.cleanFilePath) @@ -43,7 +47,11 @@ struct FileClientTests { try await fileClient.createDirectory(subDir) let vaultFilePath = subDir.appending(path: fileName) - FileManager.default.createFile(atPath: vaultFilePath.cleanFilePath, contents: nil) + #if os(Linux) + _ = FileManager.default.createFile(atPath: vaultFilePath.cleanFilePath, contents: nil) + #else + FileManager.default.createFile(atPath: vaultFilePath.cleanFilePath, contents: nil) + #endif let output = try await fileClient.findVaultFile(url)! #expect(output.cleanFilePath == vaultFilePath.cleanFilePath) diff --git a/Tests/PlaybookClientTests/PlaybookClientTests.swift b/Tests/PlaybookClientTests/PlaybookClientTests.swift index ae55130..db2eabd 100644 --- a/Tests/PlaybookClientTests/PlaybookClientTests.swift +++ b/Tests/PlaybookClientTests/PlaybookClientTests.swift @@ -145,6 +145,7 @@ struct PlaybookClientTests: TestCase { @Test func generateTemplate() async throws { try await withCapturingCommandClient("generateTemplate") { + $0.fileClient.isDirectory = { _ in true } $0.configurationClient = .mock() $0.playbookClient = .liveValue } run: { @@ -180,6 +181,7 @@ struct PlaybookClientTests: TestCase { operation: @Sendable @escaping () async throws -> Void ) async rethrows { try await withDependencies { + $0.fileClient.isDirectory = { _ in true } $0.configurationClient = .mock(configuration) $0.commandClient = .capturing(capturing) $0.playbookClient = .liveValue