worker: add reviewer stage (branch→review→push) with R1-R6 errors
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

This commit is contained in:
Hermes
2026-08-16 21:21:21 +05:00
parent 130dc59840
commit 4a6ed57971
8 changed files with 610 additions and 65 deletions

57
internal/worker/gitops.go Normal file
View File

@@ -0,0 +1,57 @@
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
}