fix: создавать каталог worktree при старте app (decider запускается до воркера)
This commit is contained in:
@@ -58,6 +58,15 @@ func New(configPath, version, updateToken string) (*App, error) {
|
|||||||
// Относительные пути (db, worktree) — рядом с .exe, а не от CWD запуска.
|
// Относительные пути (db, worktree) — рядом с .exe, а не от CWD запуска.
|
||||||
cfg.ResolveExePaths()
|
cfg.ResolveExePaths()
|
||||||
|
|
||||||
|
// Каталог worktree может отсутствовать на свежей машине. Decider (analyst) и
|
||||||
|
// воркер запускают opencode с cwd=worktree, а git clone не создаёт родительский
|
||||||
|
// каталог — поэтому создаём его заранее, до любых запусков субагентов.
|
||||||
|
if cfg.Paths.Worktree != "" {
|
||||||
|
if err := os.MkdirAll(cfg.Paths.Worktree, 0o755); err != nil {
|
||||||
|
return nil, fmt.Errorf("app: создать каталог worktree %s: %w", cfg.Paths.Worktree, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SQLite для задач и трасс
|
// SQLite для задач и трасс
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,43 @@ func TestMain(t *testing.T) {
|
|||||||
t.Log("main.go exists")
|
t.Log("main.go exists")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestNew_WorktreeCreated проверяет, что New создаёт каталог worktree (decider и
|
||||||
|
// воркер запускают opencode с cwd=worktree — каталог должен существовать заранее).
|
||||||
|
func TestNew_WorktreeCreated(t *testing.T) {
|
||||||
|
tmp := t.TempDir()
|
||||||
|
wt := filepath.Join(tmp, "nested", "worktrees")
|
||||||
|
configPath := filepath.Join(tmp, "config.yaml")
|
||||||
|
content := strings.Join([]string{
|
||||||
|
"telegram:",
|
||||||
|
" token: \"test:token\"",
|
||||||
|
" chat_id: \"12345\"",
|
||||||
|
"paths:",
|
||||||
|
" db: \"" + filepath.Join(tmp, "test.db") + "\"",
|
||||||
|
" worktree: \"" + wt + "\"",
|
||||||
|
"",
|
||||||
|
}, "\n")
|
||||||
|
if err := os.WriteFile(configPath, []byte(content), 0o600); err != nil {
|
||||||
|
t.Fatalf("write config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
a, err := New(configPath, "dev", "")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("New() err = %v", err)
|
||||||
|
}
|
||||||
|
defer a.Store.Close()
|
||||||
|
st, err := os.Stat(wt)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("worktree должен существовать после New: %v", err)
|
||||||
|
}
|
||||||
|
if !st.IsDir() {
|
||||||
|
t.Fatalf("worktree не директория: %v", st.Mode())
|
||||||
|
}
|
||||||
|
if a.Worker.Worktree != wt {
|
||||||
|
t.Errorf("Worker.Worktree = %q, want %q", a.Worker.Worktree, wt)
|
||||||
|
}
|
||||||
|
t.Logf("worktree создан: %s", wt)
|
||||||
|
}
|
||||||
|
|
||||||
// TestNew_UpdateWiring проверяет: 1) update.base_url берётся из update-блока
|
// TestNew_UpdateWiring проверяет: 1) update.base_url берётся из update-блока
|
||||||
// (не git.base_url); 2) приоритет токена: вшитый updateToken > update.token.
|
// (не git.base_url); 2) приоритет токена: вшитый updateToken > update.token.
|
||||||
func TestNew_UpdateWiring(t *testing.T) {
|
func TestNew_UpdateWiring(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user