feat: множественные репозитории (Repos) и клонирование в воркере
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, darwin) (push) Successful in 36s
CI / build-and-package (amd64, linux) (push) Successful in 37s
CI / build-and-package (amd64, windows) (push) Successful in 44s
CI / build-and-package (arm64, darwin) (push) Successful in 35s
CI / build-and-package (arm64, linux) (push) Successful in 36s
All checks were successful
CI / test (push) Successful in 46s
CI / build-and-package (amd64, darwin) (push) Successful in 36s
CI / build-and-package (amd64, linux) (push) Successful in 37s
CI / build-and-package (amd64, windows) (push) Successful in 44s
CI / build-and-package (arm64, darwin) (push) Successful in 35s
CI / build-and-package (arm64, linux) (push) Successful in 36s
- Task.Repos []string (XML-колонка repos, обратная совместимость с repo)
- config: блок git {base_url, token}
- аналитик: ответ repos[], шаблон показывает список
- core: propose без repos → возврат в сбор (E1)
- worker вариант A: один dev из общего cwd, prepareRepos клонирует
недостающие репо (git clone), validateRepoName (E3), ErrRepoNotGit (E4)
- ошибки E1-E4 в worker/errors.go
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package storage
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
// Status — статус задачи (state machine).
|
||||
type Status string
|
||||
|
||||
@@ -63,15 +65,48 @@ type Task struct {
|
||||
ChatID string `json:"chat_id"` // tg://<id>
|
||||
Title string `json:"title"`
|
||||
Goal string `json:"goal"`
|
||||
Repo string `json:"repo"`
|
||||
Repo string `json:"repo"` // обратная совместимость: одиночный репозиторий
|
||||
Repos []string `json:"repos"` // список репозиториев (основной)
|
||||
Why string `json:"why"`
|
||||
AC string `json:"ac"` // acceptance criteria
|
||||
TaskTag string `json:"task_tag"` // UUID, стабильный на всю жизнь
|
||||
AC string `json:"ac"` // acceptance criteria
|
||||
TaskTag string `json:"task_tag"` // UUID, стабильный на всю жизнь
|
||||
Status Status `json:"status"`
|
||||
CreatedAt SQLiteTime `json:"created_at"`
|
||||
UpdatedAt SQLiteTime `json:"updated_at"`
|
||||
}
|
||||
|
||||
// ReposJoined возвращает repos как одну строку (JSON-массив) для хранения в БД.
|
||||
// Пустой список → пустая строка.
|
||||
func (t *Task) ReposJoined() string {
|
||||
if len(t.Repos) == 0 {
|
||||
return ""
|
||||
}
|
||||
b, _ := json.Marshal(t.Repos)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// EffectiveRepos возвращает сам репо: если Repos пуст, но Repo задан —
|
||||
// подтягивает одиночный (обратная совместимость).
|
||||
func (t *Task) EffectiveRepos() []string {
|
||||
if len(t.Repos) > 0 {
|
||||
return t.Repos
|
||||
}
|
||||
if t.Repo != "" {
|
||||
return []string{t.Repo}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetReposFromDB заполняет Repos из сохранённой строки (JSON), либо
|
||||
// из одиночного repo (обратная совместимость).
|
||||
func (t *Task) SetReposFromDB(repos string) {
|
||||
if repos == "" {
|
||||
t.Repos = nil
|
||||
return
|
||||
}
|
||||
_ = json.Unmarshal([]byte(repos), &t.Repos)
|
||||
}
|
||||
|
||||
// Trace — запись трассировки выполнения.
|
||||
type TraceStatus string
|
||||
|
||||
|
||||
Reference in New Issue
Block a user