Skip to content
Open
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
7 changes: 2 additions & 5 deletions Sources/Container-Compose/Commands/ComposeBuild.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,10 @@ public struct ComposeBuild: AsyncParsableCommand, @unchecked Sendable {
@Flag(name: .long, help: "Do not use cache when building")
var noCache: Bool = false

@OptionGroup
var process: Flags.Process

@OptionGroup
var logging: Flags.Logging

private var cwd: String { process.cwd ?? FileManager.default.currentDirectoryPath }
private var cwd: String { composeFileOptions.workdir ?? FileManager.default.currentDirectoryPath }

private var cwdURL: URL { URL(fileURLWithPath: cwd) }

Expand Down Expand Up @@ -80,7 +77,7 @@ public struct ComposeBuild: AsyncParsableCommand, @unchecked Sendable {
}

private var envFilePath: String {
let envFile = process.envFile.first ?? ".env"
let envFile = composeFileOptions.envFile ?? ".env"
return resolvedPath(for: envFile, relativeTo: cwdURL)
}

Expand Down
8 changes: 2 additions & 6 deletions Sources/Container-Compose/Commands/ComposeDown.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
//

import ArgumentParser
import ContainerCommands
import ContainerAPIClient
import Foundation
import Yams
Expand All @@ -38,14 +37,11 @@ public struct ComposeDown: AsyncParsableCommand {
@Argument(help: "Specify the services to stop")
var services: [String] = []

@OptionGroup
var process: Flags.Process

private var cwd: String { process.cwd ?? FileManager.default.currentDirectoryPath }

@OptionGroup
var composeFileOptions: ComposeFileOptions

private var cwd: String { composeFileOptions.workdir ?? FileManager.default.currentDirectoryPath }

private static let supportedComposeFilenames = [
"compose.yml",
"compose.yaml",
Expand Down
12 changes: 12 additions & 0 deletions Sources/Container-Compose/Commands/ComposeFileOptions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,19 @@ import ArgumentParser

public struct ComposeFileOptions: ParsableArguments, Sendable {
public init() {}

public init(composeFilename: String? = nil, envFile: String? = nil, workdir: String? = nil) {
self.composeFilename = composeFilename
self.envFile = envFile
self.workdir = workdir
}

@Option(name: [.customShort("f"), .customLong("file")], help: "The path to your Docker Compose file")
public var composeFilename: String?

@Option(name: .long, help: "Specify an alternate environment file")
public var envFile: String?

@Option(name: [.customShort("w"), .customLong("workdir")], help: "Specify an alternate working directory (default: the current directory)")
public var workdir: String?
}
7 changes: 2 additions & 5 deletions Sources/Container-Compose/Commands/ComposeUp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public struct ComposeUp: AsyncParsableCommand, @unchecked Sendable {
}

private var envFilePath: String {
let envFile = process.envFile.first ?? ".env"
let envFile = composeFileOptions.envFile ?? ".env"
return resolvedPath(for: envFile, relativeTo: cwdURL)
}

Expand All @@ -89,13 +89,10 @@ public struct ComposeUp: AsyncParsableCommand, @unchecked Sendable {
@Flag(name: .long, help: "Do not use cache")
var noCache: Bool = false

@OptionGroup
var process: Flags.Process

@OptionGroup
var logging: Flags.Logging

private var cwd: String { process.cwd ?? FileManager.default.currentDirectoryPath }
private var cwd: String { composeFileOptions.workdir ?? FileManager.default.currentDirectoryPath }

private var fileManager: FileManager { FileManager.default }
private var projectName: String?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,46 @@ struct ComposeCommandParsingTests {
let cmd = try Main.parseAsRoot(["-f", "my-compose.yaml", "up"]) as! ComposeUp
#expect(cmd.composeFileOptions.composeFilename == "my-compose.yaml")
}

@Test("Main+ComposeUp command accepts --env-file flag from root")
func composeUpCommandAcceptsEnvFileFlag() throws {
let cmd = try Main.parseAsRoot(["--env-file", "custom.env", "up"]) as! ComposeUp
#expect(cmd.composeFileOptions.envFile == "custom.env")
}

@Test("Main+ComposeUp command accepts --env-file flag on subcommand")
func composeUpCommandAcceptsEnvFileFlagOnSubcommand() throws {
let cmd = try Main.parseAsRoot(["up", "--env-file", "custom.env"]) as! ComposeUp
#expect(cmd.composeFileOptions.envFile == "custom.env")
}

@Test("Main+ComposeUp command accepts -w flag for workdir")
func composeUpCommandAcceptsWorkdirFlag() throws {
let cmd = try Main.parseAsRoot(["-w", "/some/path", "up"]) as! ComposeUp
#expect(cmd.composeFileOptions.workdir == "/some/path")
}

@Test("Main+ComposeDown command accepts --env-file flag")
func composeDownCommandAcceptsEnvFileFlag() throws {
let cmd = try Main.parseAsRoot(["--env-file", "prod.env", "down"]) as! ComposeDown
#expect(cmd.composeFileOptions.envFile == "prod.env")
}

@Test("Main+ComposeBuild command accepts --env-file flag")
func composeBuildCommandAcceptsEnvFileFlag() throws {
let cmd = try Main.parseAsRoot(["--env-file", "build.env", "build"]) as! ComposeBuild
#expect(cmd.composeFileOptions.envFile == "build.env")
}

@Test("envFile is nil when not specified")
func envFileDefaultsToNil() throws {
let cmd = try Main.parseAsRoot(["up"]) as! ComposeUp
#expect(cmd.composeFileOptions.envFile == nil)
}

@Test("workdir is nil when not specified")
func workdirDefaultsToNil() throws {
let cmd = try Main.parseAsRoot(["up"]) as! ComposeUp
#expect(cmd.composeFileOptions.workdir == nil)
}
}
Loading