Files
ratatoskr-go/internal/worker/gitops.go
Hermes 4a6ed57971
All checks were successful
CI / test (push) Successful in 47s
CI / build-and-package (amd64, linux) (push) Successful in 43s
CI / build-and-package (amd64, windows) (push) Successful in 40s
worker: add reviewer stage (branch→review→push) with R1-R6 errors
2026-08-16 21:21:21 +05:00

57 lines
2.2 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 worker
import (
"context"
"fmt"
"os/exec"
"strings"
)
// baseBranch — ветка, от которой отходит feature-работа dev (свежайший main).
const baseBranch = "main"
// ensureBranch создаёт/переключает feature-ветку для задачи в repoDir,
// беря за базу свежайший origin/<baseBranch>. Возвращает ошибку при сбое.
func (w *Worker) ensureBranch(ctx context.Context, repoDir, branch string) error {
if _, err := w.git(ctx, repoDir, "fetch", "origin"); err != nil {
return err
}
if _, err := w.git(ctx, repoDir, "checkout", "-B", branch, "origin/"+baseBranch); err != nil {
return err
}
return nil
}
// branchDiff возвращает diff всей feature-ветки относительно базы:
// это все изменения коммитов ветки (base...branch), а не только последний.
func (w *Worker) branchDiff(ctx context.Context, repoDir, branch string) (string, error) {
return w.git(ctx, repoDir, "diff", "origin/"+baseBranch+"..."+branch)
}
// pushBranch пушит feature-ветку в origin (remote 'origin' создан при клоне).
// Токен передаётся через http.extraHeader, если задан.
func (w *Worker) pushBranch(ctx context.Context, repoDir, branch string) error {
args := []string{"push"}
if w.GitToken != "" {
args = append(args, "--config", "http.extraHeader=Authorization: Bearer "+w.GitToken)
}
args = append(args, "origin", "HEAD:"+branch)
_, err := w.git(ctx, repoDir, args...)
return err
}
// git выполняет git-команду в каталоге dir. Ошибки оборачиваются с выводом.
func (w *Worker) git(ctx context.Context, dir string, args ...string) (string, error) {
cmd := exec.CommandContext(ctx, "git", args...)
cmd.Dir = dir
out, err := cmd.CombinedOutput()
if err != nil {
return "", fmt.Errorf("git %v: %s", args, strings.TrimSpace(string(out)))
}
return string(out), nil
}
// featureBranchName — имя ветки задачи: feat/<taskTag>.
func featureBranchName(taskTag string) string {
return "feat/" + taskTag
}