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

- 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:
Hermes
2026-08-16 09:18:15 +05:00
parent 7be75fe14f
commit bd3d825738
14 changed files with 346 additions and 71 deletions

View File

@@ -5,6 +5,7 @@ import (
"database/sql"
"database/sql/driver"
"fmt"
"strings"
"time"
_ "modernc.org/sqlite"
@@ -127,6 +128,7 @@ func (s *Storage) migrate(ctx context.Context) error {
why TEXT NOT NULL DEFAULT '',
ac TEXT NOT NULL DEFAULT '',
task_tag TEXT NOT NULL DEFAULT '',
repos TEXT NOT NULL DEFAULT '',
status TEXT NOT NULL DEFAULT 'draft',
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
@@ -162,9 +164,24 @@ func (s *Storage) migrate(ctx context.Context) error {
if _, err := s.db.ExecContext(ctx, schema); err != nil {
return fmt.Errorf("%w: migrate: %w", ErrDB, err)
}
// Доп. колонка repos (множественные репозитории). Idempotent: если колонка
// уже есть, ALTER вернёт ошибку duplicate column — её игнорируем.
if _, err := s.db.ExecContext(ctx,
`ALTER TABLE tasks ADD COLUMN repos TEXT NOT NULL DEFAULT ''`); err != nil {
// SQLite 3.35+ выдаёт "duplicate column name"; ранние версии — "duplicate column".
if !isDuplicateColumn(err) {
return fmt.Errorf("%w: migrate add repos: %w", ErrDB, err)
}
}
return nil
}
// isDuplicateColumn распознаёт ошибку SQLite «duplicate column name».
func isDuplicateColumn(err error) bool {
msg := strings.ToLower(err.Error())
return strings.Contains(msg, "duplicate column")
}
// Now возвращает текущее время UTC как SQLiteTime.
func Now() SQLiteTime {
return SQLiteTime(time.Now().UTC())