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