Use git go module

This commit is contained in:
2025-03-29 22:59:37 +03:00
parent b243486822
commit 18a6569dcc
4 changed files with 231 additions and 37 deletions

110
src/git.go Normal file
View File

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

View File

@@ -5,7 +5,6 @@ import (
"fmt"
"log"
"os"
"os/exec"
"regexp"
"strconv"
"strings"
@@ -127,34 +126,6 @@ func updateFiles(filePaths []string, oldVersion, newVersion string) {
}
}
// 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 {
if err := exec.Command("git", "add", ".").Run(); err != nil {
return fmt.Errorf("git add error: %w", err)
}
if err := exec.Command("git", "commit", "-m", commitMsg).Run(); err != nil {
return fmt.Errorf("git commit error: %w", err)
}
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 {
return fmt.Errorf("git tag error: %w", err)
}
log.Printf("Created git tag: %s", tagName)
}
return nil
}
// updateConfigFile обновляет исходный конфигурационный файл
func updateConfigFile(configPath string, newVersion string) error {
cfg, err := ini.Load(configPath)
@@ -238,16 +209,12 @@ func main() {
// Выполняем git commit и tag, если требуется
if shouldCommit {
if err := gitCommit(bc.CurrentVersion, newVersion, bc); err != nil {
log.Printf("Git commit error: %v", err)
}
gitCommit(bc, newVersion)
}
// Выполняем git commit и tag, если требуется
if shouldTag {
if err := gitTag(bc.CurrentVersion, newVersion, bc); err != nil {
log.Printf("Git tag error: %v", err)
}
gitTag(bc, newVersion)
}
// Обновляем конфигурационный файл