diff --git a/Sources/BumpVersion/Commands/ConfigCommand.swift b/Sources/BumpVersion/Commands/ConfigCommand.swift index 32ff697..c311359 100644 --- a/Sources/BumpVersion/Commands/ConfigCommand.swift +++ b/Sources/BumpVersion/Commands/ConfigCommand.swift @@ -60,6 +60,7 @@ extension ConfigCommand { @OptionGroup var globals: ConfigCommandOptions func run() async throws { + @Dependency(\.logger) var logger let configuration = try await globals .shared(command: Self.commandName) .runClient(\.parsedConfiguration) @@ -183,7 +184,11 @@ private extension ConfigCommand.DumpConfig { private extension ConfigCommand.ConfigCommandOptions { func shared(command: String) throws -> CliClient.SharedOptions { - try configOptions.shared(command: command, extraOptions: extraOptions, verbose: verbose) + try configOptions.shared( + command: command, + extraOptions: extraOptions, + verbose: verbose + ) } func handlePrintJson(_ configuration: Configuration) throws { diff --git a/Sources/BumpVersion/GlobalOptions.swift b/Sources/BumpVersion/GlobalOptions.swift index 089c78f..8aa01d4 100644 --- a/Sources/BumpVersion/GlobalOptions.swift +++ b/Sources/BumpVersion/GlobalOptions.swift @@ -173,5 +173,19 @@ struct SemVarOptions: ParsableArguments { ) var customCommand: Bool = false + @Option( + name: .long, + help: """ + Set the precence to prefer version from file or strategy. + """ + ) + var precedence: Configuration.SemVar.Precedence? + @OptionGroup var preRelease: PreReleaseOptions } + +extension Configuration.SemVar.Precedence: ExpressibleByArgument { + public init?(argument: String) { + self.init(rawValue: argument) + } +} diff --git a/Sources/BumpVersion/Helpers/GlobalOptions+run.swift b/Sources/BumpVersion/Helpers/GlobalOptions+run.swift index 4e2f453..bd59555 100644 --- a/Sources/BumpVersion/Helpers/GlobalOptions+run.swift +++ b/Sources/BumpVersion/Helpers/GlobalOptions+run.swift @@ -136,8 +136,11 @@ extension SemVarOptions { """) } + logger.trace("precedence: \(String(describing: precedence))") + return try .init( allowPreRelease: !preRelease.disablePreRelease, + precedence: precedence, preRelease: customCommand ? nil : preRelease.configPreReleaseStrategy( includeCommitSha: includeCommitSha, extraOptions: extraOptions diff --git a/Sources/CliClient/Internal/VersionContainer.swift b/Sources/CliClient/Internal/VersionContainer.swift index c113727..9a312a1 100644 --- a/Sources/CliClient/Internal/VersionContainer.swift +++ b/Sources/CliClient/Internal/VersionContainer.swift @@ -95,6 +95,11 @@ extension CurrentVersionContainer where Version == String { extension CurrentVersionContainer where Version == SemVar { + // var preferredSemvar: SemVar? { + // switch precedence { + // } + // } + // TODO: Update to use precedence and not fetch `nextVersion` if we loaded a file version. static func load(semvar: Configuration.SemVar, gitDirectory: String?, url: URL) async throws -> Self { @Dependency(\.fileClient) var fileClient diff --git a/Sources/ConfigurationClient/Configuration+merge.swift b/Sources/ConfigurationClient/Configuration+merge.swift index 9b11054..e0f3642 100644 --- a/Sources/ConfigurationClient/Configuration+merge.swift +++ b/Sources/ConfigurationClient/Configuration+merge.swift @@ -1,6 +1,7 @@ import Dependencies import FileClient import Foundation +import LoggingExtensions @_spi(Internal) public extension Configuration { @@ -44,8 +45,12 @@ public extension Configuration.Branch { @_spi(Internal) public extension Configuration.SemVar { func merging(_ other: Self?) -> Self { - .init( + @Dependency(\.logger) var logger + logger.dump(other, level: .trace) { "Merging semvar:\n\($0)" } + + return .init( allowPreRelease: other?.allowPreRelease ?? allowPreRelease, + precedence: other?.precedence ?? precedence, preRelease: preRelease == nil ? other?.preRelease : preRelease!.merging(other?.preRelease), requireExistingFile: other?.requireExistingFile ?? requireExistingFile, requireExistingSemVar: other?.requireExistingSemVar ?? requireExistingSemVar, diff --git a/Sources/ConfigurationClient/Configuration.swift b/Sources/ConfigurationClient/Configuration.swift index 04a8b8e..abb86a0 100644 --- a/Sources/ConfigurationClient/Configuration.swift +++ b/Sources/ConfigurationClient/Configuration.swift @@ -145,6 +145,7 @@ public extension Configuration { case semvar( allowPreRelease: Bool? = nil, + precedence: SemVar.Precedence? = nil, preRelease: PreRelease? = nil, requireExistingFile: Bool? = nil, requireExistingSemVar: Bool? = nil, @@ -159,10 +160,16 @@ public extension Configuration { } public var semvar: SemVar? { - guard case let .semvar(allowPreRelease, preRelease, requireExistingFile, requireExistingSemVar, strategy) = self + guard case let .semvar( + allowPreRelease, + precedence, + preRelease, + requireExistingFile, requireExistingSemVar, strategy + ) = self else { return nil } return .init( allowPreRelease: allowPreRelease, + precedence: precedence, preRelease: preRelease, requireExistingFile: requireExistingFile ?? false, requireExistingSemVar: requireExistingSemVar ?? false, @@ -177,6 +184,7 @@ public extension Configuration { public static func semvar(_ value: SemVar) -> Self { .semvar( allowPreRelease: value.allowPreRelease, + precedence: value.precedence, preRelease: value.preRelease, requireExistingFile: value.requireExistingFile, requireExistingSemVar: value.requireExistingSemVar, @@ -285,7 +293,7 @@ public extension Configuration { case gitTag(exactMatch: Bool? = false) } - public enum Precedence: String, Codable, Equatable, Sendable { + public enum Precedence: String, CaseIterable, Codable, Equatable, Sendable { case file case strategy