From 2650bdc670591f45b869d3b2264c0d0c39ecd31a Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Thu, 26 Dec 2024 13:06:31 -0500 Subject: [PATCH] feat: Better checks on if semvar has changes prior to writing to a file. --- .bump-version.json | 3 ++- .../CliClient/Internal/CliClient+run.swift | 15 ++++++++------ .../Internal/ConfigurationExtensions.swift | 20 ++++++++++++------- Sources/CliClient/Internal/Template.swift | 1 + .../LoggingExtensions/LogLevel+verbose.swift | 2 +- .../Commands/GenerateCommand.swift | 10 +++++++--- Sources/bump-version/Helpers/DocHelpers.swift | 4 ++++ 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/.bump-version.json b/.bump-version.json index 76e2cff..ee465be 100644 --- a/.bump-version.json +++ b/.bump-version.json @@ -1,9 +1,10 @@ { "target" : { - "module" : { "name" : "cli-version" } + "module" : { "name" : "bump-version" } }, "strategy" : { "semvar" : { + "preRelease" : { "strategy": { "gitTag" : {} } }, "strategy" : { "gitTag": { "exactMatch": false } } } } diff --git a/Sources/CliClient/Internal/CliClient+run.swift b/Sources/CliClient/Internal/CliClient+run.swift index 4ebcabb..bf5d490 100644 --- a/Sources/CliClient/Internal/CliClient+run.swift +++ b/Sources/CliClient/Internal/CliClient+run.swift @@ -82,7 +82,7 @@ public extension CliClient.SharedOptions { try await fileClient.write(string: string, to: url) } else { 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 { switch version { case .string: return false - case let .semvar(_, usesOptionalType): return usesOptionalType + case let .semvar(_, usesOptionalType, _): return usesOptionalType } } public enum Version: Sendable { case string(String) - case semvar(SemVar, usesOptionalType: Bool = true) + case semvar(SemVar, usesOptionalType: Bool = true, hasChanges: Bool) func string(allowPreReleaseTag: Bool) throws -> String { switch self { case let .string(string): return string - case let .semvar(semvar, usesOptionalType: _): + case let .semvar(semvar, usesOptionalType: _, hasChanges: _): return semvar.versionString(withPreReleaseTag: allowPreReleaseTag) } } @@ -149,14 +149,17 @@ extension CliClient.SharedOptions { logger.debug("Failed to parse semvar, but got current version string.") 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)") let bumped = semvar.bump(type) 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.") return } + logger.debug("Bumped version: \(version)") let template = usesOptionalType ? Template.optional(version) : Template.build(version) try await write(template, to: container.targetUrl) diff --git a/Sources/CliClient/Internal/ConfigurationExtensions.swift b/Sources/CliClient/Internal/ConfigurationExtensions.swift index 65f008d..9c64f8a 100644 --- a/Sources/CliClient/Internal/ConfigurationExtensions.swift +++ b/Sources/CliClient/Internal/ConfigurationExtensions.swift @@ -169,9 +169,12 @@ public extension Configuration.SemVar { // We parsed a semvar from the existing file, use it. if semVar != nil { - return try await .semvar( - applyingPreRelease(semVar!, gitDirectory), - usesOptionalType: usesOptionalType ?? false + let semvarWithPreRelease = try await applyingPreRelease(semVar!, gitDirectory) + + return .semvar( + semvarWithPreRelease, + usesOptionalType: usesOptionalType ?? false, + hasChanges: semvarWithPreRelease != semVar ) } @@ -189,9 +192,11 @@ public extension Configuration.SemVar { )).semVar if semVar != nil { - return try await .semvar( - applyingPreRelease(semVar!, gitDirectory), - usesOptionalType: usesOptionalType ?? false + let semvarWithPreRelease = try await applyingPreRelease(semVar!, gitDirectory) + return .semvar( + semvarWithPreRelease, + usesOptionalType: usesOptionalType ?? false, + hasChanges: semvarWithPreRelease != semVar ) } @@ -204,7 +209,8 @@ public extension Configuration.SemVar { logger.trace("Generating new semvar.") return try await .semvar( applyingPreRelease(.init(), gitDirectory), - usesOptionalType: usesOptionalType ?? false + usesOptionalType: usesOptionalType ?? false, + hasChanges: true ) } } diff --git a/Sources/CliClient/Internal/Template.swift b/Sources/CliClient/Internal/Template.swift index 5a3c89c..bcb6758 100644 --- a/Sources/CliClient/Internal/Template.swift +++ b/Sources/CliClient/Internal/Template.swift @@ -13,6 +13,7 @@ public struct Template: Sendable { return """ // Do not set this variable, it is set during the build process. let VERSION: \(type.rawValue) = \(versionString) + """ } diff --git a/Sources/LoggingExtensions/LogLevel+verbose.swift b/Sources/LoggingExtensions/LogLevel+verbose.swift index b907636..ee8d955 100644 --- a/Sources/LoggingExtensions/LogLevel+verbose.swift +++ b/Sources/LoggingExtensions/LogLevel+verbose.swift @@ -7,7 +7,7 @@ public extension Logger.Level { switch verbose { case 1: self = .debug case 2...: self = .trace - default: self = .warning + default: self = .info } } } diff --git a/Sources/bump-version/Commands/GenerateCommand.swift b/Sources/bump-version/Commands/GenerateCommand.swift index 088e439..bdf3f35 100644 --- a/Sources/bump-version/Commands/GenerateCommand.swift +++ b/Sources/bump-version/Commands/GenerateCommand.swift @@ -5,14 +5,18 @@ import Dependencies import Foundation import ShellClient -struct GenerateCommand: AsyncParsableCommand { +struct GenerateCommand: CommandRepresentable { static let commandName = "generate" static let configuration: CommandConfiguration = .init( 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), - discussion: Discussion { + discussion: Discussion.default( + examples: [ + makeExample(label: "Basic usage.", example: "") + ] + ) { "This command can be interacted with directly, outside of the plugin usage context." } ) diff --git a/Sources/bump-version/Helpers/DocHelpers.swift b/Sources/bump-version/Helpers/DocHelpers.swift index dc5d6e3..a718994 100644 --- a/Sources/bump-version/Helpers/DocHelpers.swift +++ b/Sources/bump-version/Helpers/DocHelpers.swift @@ -1,3 +1,7 @@ +/* + This file contains helpers for generating the documentation for the commands. + + */ import ArgumentParser import CliDoc import Rainbow