From dc05c68ee25939360029c23d63bf11231cc9bbd6 Mon Sep 17 00:00:00 2001 From: Ruslan Popov Date: Wed, 24 Dec 2025 11:32:11 +0300 Subject: [PATCH] Add build metadata injection --- src/build_info.go | 33 +++++++++++++++++++++++++++++++ src/main.go | 49 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 src/build_info.go diff --git a/src/build_info.go b/src/build_info.go new file mode 100644 index 0000000..39f4b71 --- /dev/null +++ b/src/build_info.go @@ -0,0 +1,33 @@ +package main + +import "runtime/debug" + +func init() { + if AppCommit == "" || AppCommit == "unknown" { + if commit := resolveCommitFromBuildInfo(); commit != "" { + AppCommit = commit + } + } +} + +func resolveCommitFromBuildInfo() string { + info, ok := debug.ReadBuildInfo() + if !ok { + return "" + } + + for _, setting := range info.Settings { + if setting.Key == "vcs.revision" && setting.Value != "" { + return shortCommit(setting.Value) + } + } + + return "" +} + +func shortCommit(commit string) string { + if len(commit) >= 8 { + return commit[:8] + } + return commit +} diff --git a/src/main.go b/src/main.go index 9301a27..5dcd897 100644 --- a/src/main.go +++ b/src/main.go @@ -27,7 +27,7 @@ type BumpConfig struct { func getBumpConfig(cfg_name string) (*BumpConfig, error) { cfg, err := ini.Load(cfg_name) if err != nil { - log.Fatalf("Error loading config: %v", err) + return nil, fmt.Errorf("error loading config: %w", err) } sec, err := cfg.GetSection("bumpversion") @@ -70,6 +70,7 @@ func bumpVersion(bc *BumpConfig, part string) (string, error) { // Создадим карту групп по именам groupNames := re.SubexpNames() var major, minor, patch int + var hasMajor, hasMinor, hasPatch bool for i, name := range groupNames { switch name { case "major": @@ -77,18 +78,24 @@ func bumpVersion(bc *BumpConfig, part string) (string, error) { if err != nil { return "", err } + hasMajor = true case "minor": minor, err = strconv.Atoi(matches[i]) if err != nil { return "", err } + hasMinor = true case "patch": patch, err = strconv.Atoi(matches[i]) if err != nil { return "", err } + hasPatch = true } } + if !hasMajor || !hasMinor || !hasPatch { + return "", fmt.Errorf("parse pattern must contain major, minor, and patch groups") + } switch part { case "major": major++ @@ -143,39 +150,45 @@ func updateConfigFile(configPath string, newVersion string) error { // resolveFlag проверяет два логических флага: positive и negative. // Если оба заданы как true, вызывается ошибка; если задан negative, возвращается false; // если задан positive, возвращается true; иначе возвращается defaultValue. -func resolveFlag(positive, negative *bool, defaultValue bool) bool { +func resolveFlag(positive, negative *bool, defaultValue bool) (bool, error) { if *positive && *negative { - // Если оба флага заданы, это противоречивое состояние. - // Здесь можно завершить программу с ошибкой или выбрать приоритет. - // Например, завершим выполнение: - panic("conflicting flags: both positive and negative are set") + return false, fmt.Errorf("conflicting flags: both positive and negative are set") } if *negative { - return false + return false, nil } if *positive { - return true + return true, nil } - return defaultValue + return defaultValue, nil } // Версия приложения -const ( - AppName = "BumpVersion" +const AppName = "BumpVersion" + +var ( AppVersion = "0.1.3" + AppCommit = "unknown" ) +func versionString() string { + if AppCommit == "" || AppCommit == "unknown" { + return AppVersion + } + return fmt.Sprintf("%s (%s)", AppVersion, AppCommit) +} + func main() { const cfg_name = ".bumpversion.cfg" args := os.Args[1:] // Проверяем аргументы командной строки if len(args) > 0 && strings.ToLower(args[0]) == "--version" { - fmt.Printf("%s version %s\n", AppName, AppVersion) + fmt.Printf("%s version %s\n", AppName, versionString()) return } // Печатаем название и версию при старте - fmt.Printf("Starting %s version %s\n", AppName, AppVersion) + fmt.Printf("Starting %s version %s\n", AppName, versionString()) bc, err := getBumpConfig(cfg_name) if err != nil { @@ -198,8 +211,14 @@ func main() { } // Разрешаем флаги: - shouldCommit := resolveFlag(commit, noCommit, bc.Commit) - shouldTag := resolveFlag(tag, noTag, bc.Tag) + shouldCommit, err := resolveFlag(commit, noCommit, bc.Commit) + if err != nil { + log.Fatalf("Error resolving commit flags: %v", err) + } + shouldTag, err := resolveFlag(tag, noTag, bc.Tag) + if err != nil { + log.Fatalf("Error resolving tag flags: %v", err) + } newVersion, err := bumpVersion(bc, *part) if err != nil {