Files
go-webhook/internal/services/git.go
Andrey Epifancev 04cea69d6e refactor: разделение кода на пакеты и улучшение архитектуры
- Создана новая структура проекта с разделением на пакеты
- Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build)
- Реализован Dependency Injection для сервисов
- Добавлены middleware для логирования, Request ID и Response Time
- Создан пакет конфигурации с валидацией
- Улучшено логирование через интерфейс
- Добавлены обработчики HTTP в отдельных пакетах
- Создана структура для тестирования
- Добавлены конфигурационные файлы и документация
2025-08-11 19:45:54 +04:00

94 lines
2.4 KiB
Go

package services
import (
"fmt"
"path/filepath"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"go-webhook-server/internal/config"
"go-webhook-server/pkg/logger"
)
// GitService интерфейс для Git операций
type GitService interface {
UpdateRepository() error
IsRepositoryExists() bool
}
// gitServiceImpl реализация Git сервиса
type gitServiceImpl struct {
config *config.Config
logger logger.Logger
}
// NewGitService создает новый экземпляр Git сервиса
func NewGitService(cfg *config.Config, log logger.Logger) GitService {
return &gitServiceImpl{
config: cfg,
logger: log,
}
}
// UpdateRepository обновляет репозиторий из удаленного источника
func (g *gitServiceImpl) UpdateRepository() error {
g.logger.Info("Updating repository...")
// Открываем репозиторий
repo, err := git.PlainOpen(g.config.Paths.Obsidian)
if err != nil {
return fmt.Errorf("failed to open repository: %w", err)
}
// Получаем worktree
worktree, err := repo.Worktree()
if err != nil {
return fmt.Errorf("failed to get worktree: %w", err)
}
// Проверяем текущую ветку
head, err := repo.Head()
if err != nil {
return fmt.Errorf("failed to get HEAD: %w", err)
}
g.logger.Infof("Current branch: %s", head.Name().Short())
// Выполняем git pull
err = worktree.Pull(&git.PullOptions{
RemoteName: g.config.Git.Remote,
ReferenceName: plumbing.NewBranchReferenceName(g.config.Git.Branch),
})
if err != nil {
if err == git.NoErrAlreadyUpToDate {
g.logger.Info("Repository is already up to date")
return nil
}
return fmt.Errorf("failed to pull from remote: %w", err)
}
g.logger.Info("Repository updated successfully")
return nil
}
// IsRepositoryExists проверяет существование Git репозитория
func (g *gitServiceImpl) IsRepositoryExists() bool {
gitPath := filepath.Join(g.config.Paths.Obsidian, ".git")
// Проверяем существование .git директории
if _, err := filepath.Abs(gitPath); err != nil {
return false
}
// Пытаемся открыть репозиторий
repo, err := git.PlainOpen(g.config.Paths.Obsidian)
if err != nil {
return false
}
// Проверяем что это действительно Git репозиторий
_, err = repo.Head()
return err == nil
}