Files
bumpversion/src/git.go
2025-03-29 23:06:39 +03:00

111 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("Изменения успешно отправлены")
}