fix: создавать каталог worktree в prepareRepos (decider: не могу сменить папку на ./worktrees)
This commit is contained in:
@@ -338,6 +338,11 @@ func (w *Worker) finalizeTrace(ctx context.Context, traceID int64, status storag
|
|||||||
// prepareRepos гарантирует наличие всех репозиториев в общем каталоге:
|
// prepareRepos гарантирует наличие всех репозиториев в общем каталоге:
|
||||||
// папка есть → используем как есть; нет → git clone.
|
// папка есть → используем как есть; нет → git clone.
|
||||||
func (w *Worker) prepareRepos(ctx context.Context, repos []string) error {
|
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 {
|
for _, r := range repos {
|
||||||
dst := filepath.Join(w.Worktree, r)
|
dst := filepath.Join(w.Worktree, r)
|
||||||
if _, err := os.Stat(dst); err == nil {
|
if _, err := os.Stat(dst); err == nil {
|
||||||
|
|||||||
@@ -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) {
|
func TestPrepareReposNonGitDir(t *testing.T) {
|
||||||
wt := t.TempDir()
|
wt := t.TempDir()
|
||||||
w := &Worker{Worktree: wt}
|
w := &Worker{Worktree: wt}
|
||||||
|
|||||||
Reference in New Issue
Block a user