feat: Better checks on if semvar has changes prior to writing to a file.
All checks were successful
CI / Ubuntu (push) Successful in 2m51s

This commit is contained in:
2024-12-26 13:06:31 -05:00
parent a0f8611a76
commit 2650bdc670
7 changed files with 37 additions and 18 deletions

View File

@@ -1,9 +1,10 @@
{ {
"target" : { "target" : {
"module" : { "name" : "cli-version" } "module" : { "name" : "bump-version" }
}, },
"strategy" : { "strategy" : {
"semvar" : { "semvar" : {
"preRelease" : { "strategy": { "gitTag" : {} } },
"strategy" : { "gitTag": { "exactMatch": false } } "strategy" : { "gitTag": { "exactMatch": false } }
} }
} }

View File

@@ -82,7 +82,7 @@ public extension CliClient.SharedOptions {
try await fileClient.write(string: string, to: url) try await fileClient.write(string: string, to: url)
} else { } else {
logger.debug("Skipping, due to dry-run being passed.") logger.debug("Skipping, due to dry-run being passed.")
logger.debug("\n\(string)\n") logger.info("\n\(string)\n")
} }
} }
@@ -108,19 +108,19 @@ public struct CurrentVersionContainer: Sendable {
var usesOptionalType: Bool { var usesOptionalType: Bool {
switch version { switch version {
case .string: return false case .string: return false
case let .semvar(_, usesOptionalType): return usesOptionalType case let .semvar(_, usesOptionalType, _): return usesOptionalType
} }
} }
public enum Version: Sendable { public enum Version: Sendable {
case string(String) case string(String)
case semvar(SemVar, usesOptionalType: Bool = true) case semvar(SemVar, usesOptionalType: Bool = true, hasChanges: Bool)
func string(allowPreReleaseTag: Bool) throws -> String { func string(allowPreReleaseTag: Bool) throws -> String {
switch self { switch self {
case let .string(string): case let .string(string):
return string return string
case let .semvar(semvar, usesOptionalType: _): case let .semvar(semvar, usesOptionalType: _, hasChanges: _):
return semvar.versionString(withPreReleaseTag: allowPreReleaseTag) return semvar.versionString(withPreReleaseTag: allowPreReleaseTag)
} }
} }
@@ -149,14 +149,17 @@ extension CliClient.SharedOptions {
logger.debug("Failed to parse semvar, but got current version string.") logger.debug("Failed to parse semvar, but got current version string.")
try await write(container) try await write(container)
case let .semvar(semvar, usesOptionalType: usesOptionalType): case let .semvar(semvar, usesOptionalType: usesOptionalType, hasChanges: hasChanges):
logger.debug("Semvar prior to bumping: \(semvar)") logger.debug("Semvar prior to bumping: \(semvar)")
let bumped = semvar.bump(type) let bumped = semvar.bump(type)
let version = bumped.versionString(withPreReleaseTag: allowPreReleaseTag) let version = bumped.versionString(withPreReleaseTag: allowPreReleaseTag)
guard bumped != semvar else {
// TODO: This doesn't work as expected w/o checking what the loaded semvar in the file is / was.
guard bumped != semvar || hasChanges else {
logger.debug("No change, skipping.") logger.debug("No change, skipping.")
return return
} }
logger.debug("Bumped version: \(version)") logger.debug("Bumped version: \(version)")
let template = usesOptionalType ? Template.optional(version) : Template.build(version) let template = usesOptionalType ? Template.optional(version) : Template.build(version)
try await write(template, to: container.targetUrl) try await write(template, to: container.targetUrl)

View File

@@ -169,9 +169,12 @@ public extension Configuration.SemVar {
// We parsed a semvar from the existing file, use it. // We parsed a semvar from the existing file, use it.
if semVar != nil { if semVar != nil {
return try await .semvar( let semvarWithPreRelease = try await applyingPreRelease(semVar!, gitDirectory)
applyingPreRelease(semVar!, gitDirectory),
usesOptionalType: usesOptionalType ?? false return .semvar(
semvarWithPreRelease,
usesOptionalType: usesOptionalType ?? false,
hasChanges: semvarWithPreRelease != semVar
) )
} }
@@ -189,9 +192,11 @@ public extension Configuration.SemVar {
)).semVar )).semVar
if semVar != nil { if semVar != nil {
return try await .semvar( let semvarWithPreRelease = try await applyingPreRelease(semVar!, gitDirectory)
applyingPreRelease(semVar!, gitDirectory), return .semvar(
usesOptionalType: usesOptionalType ?? false semvarWithPreRelease,
usesOptionalType: usesOptionalType ?? false,
hasChanges: semvarWithPreRelease != semVar
) )
} }
@@ -204,7 +209,8 @@ public extension Configuration.SemVar {
logger.trace("Generating new semvar.") logger.trace("Generating new semvar.")
return try await .semvar( return try await .semvar(
applyingPreRelease(.init(), gitDirectory), applyingPreRelease(.init(), gitDirectory),
usesOptionalType: usesOptionalType ?? false usesOptionalType: usesOptionalType ?? false,
hasChanges: true
) )
} }
} }

View File

@@ -13,6 +13,7 @@ public struct Template: Sendable {
return """ return """
// Do not set this variable, it is set during the build process. // Do not set this variable, it is set during the build process.
let VERSION: \(type.rawValue) = \(versionString) let VERSION: \(type.rawValue) = \(versionString)
""" """
} }

View File

@@ -7,7 +7,7 @@ public extension Logger.Level {
switch verbose { switch verbose {
case 1: self = .debug case 1: self = .debug
case 2...: self = .trace case 2...: self = .trace
default: self = .warning default: self = .info
} }
} }
} }

View File

@@ -5,14 +5,18 @@ import Dependencies
import Foundation import Foundation
import ShellClient import ShellClient
struct GenerateCommand: AsyncParsableCommand { struct GenerateCommand: CommandRepresentable {
static let commandName = "generate" static let commandName = "generate"
static let configuration: CommandConfiguration = .init( static let configuration: CommandConfiguration = .init(
commandName: Self.commandName, commandName: Self.commandName,
abstract: Abstract.default("Generates a version file in your project.").render(), abstract: Abstract.default("Generates a version file in your project."),
usage: Usage.default(commandName: Self.commandName), usage: Usage.default(commandName: Self.commandName),
discussion: Discussion { discussion: Discussion.default(
examples: [
makeExample(label: "Basic usage.", example: "")
]
) {
"This command can be interacted with directly, outside of the plugin usage context." "This command can be interacted with directly, outside of the plugin usage context."
} }
) )

View File

@@ -1,3 +1,7 @@
/*
This file contains helpers for generating the documentation for the commands.
*/
import ArgumentParser import ArgumentParser
import CliDoc import CliDoc
import Rainbow import Rainbow