diff --git a/Package.swift b/Package.swift index b49c4e3..4c9aac0 100644 --- a/Package.swift +++ b/Package.swift @@ -12,6 +12,7 @@ let package = Package( products: [ .executable(name: "rt", targets: ["ReleaseTools"]), .library(name: "Resources", targets: ["Resources"]), + .plugin(name: "ReleaseToolsPlugin", targets: ["ReleaseToolsPlugin"]), ], dependencies: [ @@ -20,7 +21,6 @@ let package = Package( .package(url: "https://github.com/elegantchaos/Logger.git", from: "1.6.0"), .package(url: "https://github.com/elegantchaos/Runner.git", from: "2.0.5"), .package(url: "https://github.com/elegantchaos/ChaosByteStreams", from: "1.0.0"), - .package(url: "https://github.com/elegantchaos/XCTestExtensions.git", from: "1.3.0"), .package(url: "https://github.com/elegantchaos/Versionator.git", from: "2.0.2"), .package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"), ], @@ -52,9 +52,26 @@ let package = Package( ] ), + .plugin( + name: "ReleaseToolsPlugin", + capability: .command( + intent: .custom( + verb: "rt", + description: "Manages archiving and uploading releases." + ), + permissions: [ + .writeToPackageDirectory(reason: "Builds and archives releases.") + ] + ), + + dependencies: [ + "ReleaseTools" + ] + ), + .testTarget( name: "ReleaseToolsTests", - dependencies: ["ReleaseTools", "XCTestExtensions"] + dependencies: ["ReleaseTools"] ), ] ) diff --git a/Plugins/ReleaseToolPlugin/ReleaseToolPlugin.swift b/Plugins/ReleaseToolPlugin/ReleaseToolPlugin.swift new file mode 100644 index 0000000..1200a36 --- /dev/null +++ b/Plugins/ReleaseToolPlugin/ReleaseToolPlugin.swift @@ -0,0 +1,44 @@ +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +// Created by Sam Deane on 03/09/24. +// All code (c) 2024 - present day, Elegant Chaos Limited. +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +import Foundation +import PackagePlugin + +@main struct ReleaseToolsPlugin: CommandPlugin { + func run(tool: String, arguments: [String], context: PackagePlugin.PluginContext, cwd: URL) async throws -> String { + let tool = try context.tool(named: tool) + + Diagnostics.remark("Running \(tool) \(arguments.joined(separator: " ")).") + + let outputPipe = Pipe() + return try await withCheckedThrowingContinuation { continuation in + let process = Process() + process.executableURL = tool.url + process.arguments = arguments + process.currentDirectoryURL = cwd + + process.standardOutput = outputPipe + process.terminationHandler = { process in + let data = outputPipe.fileHandleForReading.readDataToEndOfFile() + continuation.resume( + returning: String(decoding: data, as: UTF8.self) + ) + } + do { + try process.run() + } catch { + continuation.resume(throwing: error) + } + } + } + + func performCommand(context: PackagePlugin.PluginContext, arguments: [String]) async throws { + let output = try await run( + tool: "ActionBuilderTool", arguments: arguments, context: context, cwd: context.package.directoryURL) + + Diagnostics.remark(output) + + } +}