package main import ( "fmt" "log" "os" "strings" "time" git "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing/object" ) // gitCommit выполняет коммит с внесёнными изменениями func gitCommit(bc *BumpConfig, newVersion string) { // Открываем локальный репозиторий (предполагается, что он существует в папке ".") repo, err := git.PlainOpen(".") if err != nil { log.Fatalf("Ошибка открытия репозитория: %v", err) } // Получаем рабочее дерево worktree, err := repo.Worktree() if err != nil { log.Fatalf("Ошибка получения рабочей директории: %v", err) } // Добавляем все изменения в индекс (или конкретные файлы, если нужно) _, err = worktree.Add(".") if err != nil { log.Fatalf("Ошибка добавления изменений: %v", err) } // Формируем сообщение коммита commitMsg := strings.ReplaceAll(bc.Message, "{current_version}", bc.CurrentVersion) commitMsg = strings.ReplaceAll(commitMsg, "{new_version}", newVersion) commit, err := worktree.Commit(commitMsg, &git.CommitOptions{ Author: &object.Signature{ Name: os.Getenv("GIT_USERNAME"), Email: os.Getenv("GIT_EMAIL"), When: time.Now(), }, }) if err != nil { log.Fatalf("Ошибка выполнения коммита: %v", err) } // Получаем объект коммита (по его хэшу) commitObj, err := repo.CommitObject(commit) if err != nil { log.Fatalf("Ошибка получения объекта коммита: %v", err) } fmt.Printf("Коммит выполнен: %s\n", commitObj.Hash) } // gitTag ставит тэг на текущий коммит func gitTag(bc *BumpConfig, newVersion string) { // Открываем локальный репозиторий (предполагается, что он существует в папке ".") repo, err := git.PlainOpen(".") if err != nil { log.Fatalf("Ошибка открытия репозитория: %v", err) } // Получаем текущий HEAD (он должен совпадать с только что созданным коммитом) headRef, err := repo.Head() if err != nil { log.Fatalf("Ошибка получения HEAD: %v", err) } fmt.Printf("Текущий HEAD: %s\n", headRef.Hash()) // Создаем тег на текущем коммите (HEAD) tagName := strings.ReplaceAll(bc.TagName, "{new_version}", newVersion) _, err = repo.CreateTag(tagName, headRef.Hash(), &git.CreateTagOptions{ Tagger: &object.Signature{ Name: os.Getenv("GIT_USERNAME"), Email: os.Getenv("GIT_EMAIL"), When: time.Now(), }, Message: "Тег создан с помощью go-git", }) if err != nil { log.Fatalf("Ошибка создания тега: %v", err) } fmt.Printf("Тег '%s' создан на коммите %s\n", tagName, headRef.Hash()) } func gitPush(bc *BumpConfig, newVersion string) { // Открываем локальный репозиторий (предполагается, что он существует в папке ".") repo, err := git.PlainOpen(".") if err != nil { log.Fatalf("Ошибка открытия репозитория: %v", err) } tagName := strings.ReplaceAll(bc.TagName, "{new_version}", newVersion) // (Опционально) Выполняем push на удаленный репозиторий tagSpec := config.RefSpec("refs/tags/" + tagName + ":refs/tags/" + tagName) err = repo.Push(&git.PushOptions{ RemoteName: "origin", RefSpecs: []config.RefSpec{ "refs/heads/master:refs/heads/master", tagSpec, }, }) if err != nil { log.Fatalf("Ошибка пуша: %v", err) } fmt.Println("Изменения успешно отправлены") }