From 4b5ebf265dbc654c84f5fb69409c96334e741ea9 Mon Sep 17 00:00:00 2001 From: Ruslan Popov Date: Sat, 29 Mar 2025 22:13:44 +0300 Subject: [PATCH] Improve commit/tag flags logic --- src/main.go | 89 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/src/main.go b/src/main.go index 5535399..f9396f8 100644 --- a/src/main.go +++ b/src/main.go @@ -24,11 +24,13 @@ type BumpConfig struct { FilePaths []string } -func loadConfig(configPath string) (*ini.File, error) { - return ini.Load(configPath) -} +// getBumpConfig загружает конфигурацию из указанного файла +func getBumpConfig(cfg_name string) (*BumpConfig, error) { + cfg, err := ini.Load(cfg_name) + if err != nil { + log.Fatalf("Error loading config: %v", err) + } -func getBumpConfig(cfg *ini.File) (*BumpConfig, error) { sec, err := cfg.GetSection("bumpversion") if err != nil { return nil, fmt.Errorf("missing [bumpversion] section: %w", err) @@ -108,6 +110,7 @@ func bumpVersion(bc *BumpConfig, part string) (string, error) { return newVersion, nil } +// updateFiles обновляет версию в файле func updateFiles(filePaths []string, oldVersion, newVersion string) { for _, path := range filePaths { data, err := os.ReadFile(path) @@ -124,7 +127,8 @@ func updateFiles(filePaths []string, oldVersion, newVersion string) { } } -func gitCommitAndTag(currentVersion, newVersion string, bc *BumpConfig) error { +// gitCommit выполняет коммит с внесёнными изменениями +func gitCommit(currentVersion, newVersion string, bc *BumpConfig) error { commitMsg := strings.ReplaceAll(bc.Message, "{current_version}", currentVersion) commitMsg = strings.ReplaceAll(commitMsg, "{new_version}", newVersion) if bc.Commit { @@ -136,6 +140,11 @@ func gitCommitAndTag(currentVersion, newVersion string, bc *BumpConfig) error { } log.Printf("Committed with message: %s", commitMsg) } + return nil +} + +// gitTag ставит тэг на коммит +func gitTag(currentVersion, newVersion string, bc *BumpConfig) error { if bc.Tag { tagName := strings.ReplaceAll(bc.TagName, "{new_version}", newVersion) if err := exec.Command("git", "tag", tagName).Run(); err != nil { @@ -146,6 +155,7 @@ func gitCommitAndTag(currentVersion, newVersion string, bc *BumpConfig) error { return nil } +// updateConfigFile обновляет исходный конфигурационный файл func updateConfigFile(configPath string, newVersion string) error { cfg, err := ini.Load(configPath) if err != nil { @@ -155,15 +165,35 @@ func updateConfigFile(configPath string, newVersion string) error { return cfg.SaveTo(configPath) } +// resolveFlag проверяет два логических флага: positive и negative. +// Если оба заданы как true, вызывается ошибка; если задан negative, возвращается false; +// если задан positive, возвращается true; иначе возвращается defaultValue. +func resolveFlag(positive, negative *bool, defaultValue bool) bool { + if *positive && *negative { + // Если оба флага заданы, это противоречивое состояние. + // Здесь можно завершить программу с ошибкой или выбрать приоритет. + // Например, завершим выполнение: + panic("conflicting flags: both positive and negative are set") + } + if *negative { + return false + } + if *positive { + return true + } + return defaultValue +} + // Версия приложения const ( AppName = "BumpVersion" - AppVersion = "0.1.0" + AppVersion = "0.1.4" ) 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) return @@ -172,21 +202,31 @@ func main() { // Печатаем название и версию при старте fmt.Printf("Starting %s version %s\n", AppName, AppVersion) - part := flag.String("part", "patch", "Part to bump: major, minor, patch") - configPath := flag.String("config", ".bumpversion.cfg", "Path to config file") - flag.Parse() - - cfgFile, err := loadConfig(*configPath) - if err != nil { - log.Fatalf("Error loading config: %v", err) - } - - bc, err := getBumpConfig(cfgFile) + bc, err := getBumpConfig(cfg_name) if err != nil { log.Fatalf("Error reading bumpversion configuration: %v", err) } fmt.Printf("Current version: %s\n", bc.CurrentVersion) + + // Парсинг аргументов командной строки + part := flag.String("part", "patch", "Part of the version to bump (major/minor/patch)") + commit := flag.Bool("commit", false, "Create a commit") + noCommit := flag.Bool("no-commit", false, "Do not create a commit") + tag := flag.Bool("tag", false, "Add a git tag") + noTag := flag.Bool("no-tag", false, "Do not add a git tag") + flag.Parse() + + // Обработка флагов + if *part != "major" && *part != "minor" && *part != "patch" { + fmt.Printf("Error: part must be one of 'major', 'minor', or 'patch'. Got '%s'\n", *part) + os.Exit(1) + } + + // Разрешаем флаги: + shouldCommit := resolveFlag(commit, noCommit, bc.Commit) + shouldTag := resolveFlag(tag, noTag, bc.Tag) + newVersion, err := bumpVersion(bc, *part) if err != nil { log.Fatalf("Error bumping version: %v", err) @@ -197,12 +237,21 @@ func main() { updateFiles(bc.FilePaths, bc.CurrentVersion, newVersion) // Выполняем git commit и tag, если требуется - if err := gitCommitAndTag(bc.CurrentVersion, newVersion, bc); err != nil { - log.Printf("Git commit/tag error: %v", err) + if shouldCommit { + if err := gitCommit(bc.CurrentVersion, newVersion, bc); err != nil { + log.Printf("Git commit error: %v", err) + } + } + + // Выполняем git commit и tag, если требуется + if shouldTag { + if err := gitTag(bc.CurrentVersion, newVersion, bc); err != nil { + log.Printf("Git tag error: %v", err) + } } // Обновляем конфигурационный файл - if err := updateConfigFile(*configPath, newVersion); err != nil { + if err := updateConfigFile(cfg_name, newVersion); err != nil { log.Printf("Error updating config file: %v", err) } }