Files
bumpversion/src/git.go
2025-04-04 01:17:34 +03:00

112 lines
3.7 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 (
"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("Repository open error: %v", err)
}
// Получаем рабочее дерево
worktree, err := repo.Worktree()
if err != nil {
log.Fatalf("Work directory open error: %v", err)
}
// Добавляем все изменения в индекс (или конкретные файлы, если нужно)
_, err = worktree.Add(".")
if err != nil {
log.Fatalf("Changes append error: %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("Commit error: %v", err)
}
// Получаем объект коммита (по его хэшу)
commitObj, err := repo.CommitObject(commit)
if err != nil {
log.Fatalf("Commit object error: %v", err)
}
log.Printf("Committed as %s\n", commitObj.Hash)
}
// gitTag ставит тэг на текущий коммит
func gitTag(bc *BumpConfig, newVersion string) {
// Открываем локальный репозиторий (предполагается, что он существует в папке ".")
repo, err := git.PlainOpen(".")
if err != nil {
log.Fatalf("Repository open error: %v", err)
}
// Получаем текущий HEAD (он должен совпадать с только что созданным коммитом)
headRef, err := repo.Head()
if err != nil {
log.Fatalf("HEAD open error: %v", err)
}
log.Printf("Current HEAD is %s\n", headRef.Hash())
// Создаем тег на текущем коммите (HEAD)
commitMsg := strings.ReplaceAll(bc.Message, "{current_version}", bc.CurrentVersion)
commitMsg = strings.ReplaceAll(commitMsg, "{new_version}", newVersion)
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: commitMsg,
})
if err != nil {
log.Fatalf("Tag creation error: %v", err)
}
log.Printf("Tag '%s' is created on commit %s\n", tagName, headRef.Hash())
}
func gitPush(bc *BumpConfig, newVersion string) {
// Открываем локальный репозиторий (предполагается, что он существует в папке ".")
repo, err := git.PlainOpen(".")
if err != nil {
log.Fatalf("Repository open error: %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("Push error: %v", err)
}
log.Println("Changes pushed successfully")
}