исправлены находки ревью проектной стороны

- манифест читается так, как записан: решётка внутри строки не открывает
  комментарий, скобка внутри комментария не закрывает массив, имя внутри
  комментария не становится подпиской; новый ключ встаёт после массива,
  а не внутрь него
- всё записываемое проходит через manifest.Quote — обратный слэш в пути
  делал файл, который инструмент сам не читает
- маркер локальной части переехал в doc и пропускает огороженные блоки:
  процитированный в примере маркер больше не считается границей, а копия
  без маркера не перезаписывается молча
- лишний позиционный аргумент отсекается: flag прекращал разбор и прятал
  флаги после себя, из-за чего pull, list и check игнорировали --for
- заведены тесты проверок копий, включая молчание на исправной копии
This commit is contained in:
av
2026-07-27 21:16:29 +03:00
parent 23d88c4048
commit b6b0976c19
19 changed files with 904 additions and 197 deletions
+8 -8
View File
@@ -28,7 +28,7 @@ const projectSkeleton = `# What this repository takes from a conventions suite.
# Where the copies come from: a path on disk, relative to this file or absolute,
# or a git repository over http or https. A trailing #branch, #tag or #commit
# pins a revision.
source = "%s"
source = %s
# ─── Components ─────────────────────────────────────────────────────────────
#
@@ -54,6 +54,9 @@ func runInit(env Env, args []string) ExitCode {
if err := fs.Parse(args); err != nil {
return Usage
}
if code := noStrayArgs(env, "convy init", fs.Args()); code != OK {
return code
}
where := *root
if where == "" {
@@ -102,7 +105,7 @@ func runInit(env Env, args []string) ExitCode {
return Failed
}
entries := [][2]string{{"dir", quote(given["dir"])}}
entries := [][2]string{{"dir", manifest.Quote(given["dir"])}}
if list := split(given["lang"]); len(list) > 0 {
entries = append(entries, [2]string{"lang", array(list)})
}
@@ -111,7 +114,7 @@ func runInit(env Env, args []string) ExitCode {
}
entries = append(entries, [2]string{"topics", "[]"})
body, err := manifest.AddTable([]byte(fmt.Sprintf(projectSkeleton, given["source"])),
body, err := manifest.AddTable(fmt.Appendf(nil, projectSkeleton, manifest.Quote(given["source"])),
"components."+given["component"], entries)
if err != nil {
fmt.Fprintln(env.Err, err)
@@ -179,14 +182,11 @@ func initFields() []Field {
}}
}
func quote(s string) string {
return `"` + strings.ReplaceAll(s, `"`, `\"`) + `"`
}
// array writes a TOML array of strings.
func array(values []string) string {
parts := make([]string, len(values))
for i, v := range values {
parts[i] = quote(v)
parts[i] = manifest.Quote(v)
}
return "[" + strings.Join(parts, ", ") + "]"
}