From e055d1937c4441b84d3882113bd450e781655666 Mon Sep 17 00:00:00 2001 From: Hermes Date: Sun, 16 Aug 2026 22:04:16 +0500 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=20worktree=20=D0=B2=20prepareRepos=20(decider:=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B3=D1=83=20=D1=81=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D0=B0=D0=BF=D0=BA=D1=83=20=D0=BD=D0=B0=20?= =?UTF-8?q?./worktrees)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/worker/worker.go | 5 +++++ internal/worker/worker_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/internal/worker/worker.go b/internal/worker/worker.go index c885c69..360632f 100644 --- a/internal/worker/worker.go +++ b/internal/worker/worker.go @@ -338,6 +338,11 @@ func (w *Worker) finalizeTrace(ctx context.Context, traceID int64, status storag // prepareRepos гарантирует наличие всех репозиториев в общем каталоге: // папка есть → используем как есть; нет → git clone. func (w *Worker) prepareRepos(ctx context.Context, repos []string) error { + // Общий каталог worktree может отсутствовать на свежей машине: git clone не + // создаёт родительский каталог, а decider стартует с cwd=Worktree. Создаём заранее. + if err := os.MkdirAll(w.Worktree, 0o755); err != nil { + return fmt.Errorf("%w: создать каталог worktree %s: %v", ErrClone, w.Worktree, err) + } for _, r := range repos { dst := filepath.Join(w.Worktree, r) if _, err := os.Stat(dst); err == nil { diff --git a/internal/worker/worker_test.go b/internal/worker/worker_test.go index 247180c..368202e 100644 --- a/internal/worker/worker_test.go +++ b/internal/worker/worker_test.go @@ -464,6 +464,31 @@ func TestPrepareRepos(t *testing.T) { } } +// TestPrepareRepos_CreatesWorktreeDir проверяет, что prepareRepos создаёт сам +// каталог worktree на свежей машине (иначе git clone не может создать родителя, +// а decider падает с «не могу сменить папку на ./worktrees»). +func TestPrepareRepos_CreatesWorktreeDir(t *testing.T) { + // worktree ещё НЕ существует (родитель TempDir есть, сам каталог — нет). + base := t.TempDir() + wt := filepath.Join(base, "nested", "worktrees") + if _, err := os.Stat(wt); !os.IsNotExist(err) { + t.Fatalf("предусловие: %s должен отсутствовать, %v", wt, err) + } + + w := &Worker{Worktree: wt, GitBaseURL: "http://gitea.hal9000.home"} + // Пустой список репо → prepareRepos всё равно создаёт каталог worktree. + if err := w.prepareRepos(context.Background(), nil); err != nil { + t.Fatalf("prepareRepos создал каталог: %v", err) + } + st, err := os.Stat(wt) + if err != nil { + t.Fatalf("worktree должен существовать после prepareRepos: %v", err) + } + if !st.IsDir() { + t.Fatalf("worktree не директория: %v", st.Mode()) + } +} + func TestPrepareReposNonGitDir(t *testing.T) { wt := t.TempDir() w := &Worker{Worktree: wt}