- Создана новая структура проекта с разделением на пакеты - Добавлены интерфейсы для всех сервисов (Git, Quartz, Files, Build) - Реализован Dependency Injection для сервисов - Добавлены middleware для логирования, Request ID и Response Time - Создан пакет конфигурации с валидацией - Улучшено логирование через интерфейс - Добавлены обработчики HTTP в отдельных пакетах - Создана структура для тестирования - Добавлены конфигурационные файлы и документация
94 lines
2.4 KiB
Go
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
|
|
}
|