исправлены находки ревью проектной стороны
- манифест читается так, как записан: решётка внутри строки не открывает комментарий, скобка внутри комментария не закрывает массив, имя внутри комментария не становится подпиской; новый ключ встаёт после массива, а не внутрь него - всё записываемое проходит через manifest.Quote — обратный слэш в пути делал файл, который инструмент сам не читает - маркер локальной части переехал в doc и пропускает огороженные блоки: процитированный в примере маркер больше не считается границей, а копия без маркера не перезаписывается молча - лишний позиционный аргумент отсекается: flag прекращал разбор и прятал флаги после себя, из-за чего pull, list и check игнорировали --for - заведены тесты проверок копий, включая молчание на исправной копии
This commit is contained in:
+32
-19
@@ -11,7 +11,6 @@ import (
|
||||
|
||||
"git.vakhrushev.me/av/convy/internal/check"
|
||||
"git.vakhrushev.me/av/convy/internal/doc"
|
||||
"git.vakhrushev.me/av/convy/internal/manifest"
|
||||
"git.vakhrushev.me/av/convy/internal/project"
|
||||
)
|
||||
|
||||
@@ -29,13 +28,19 @@ func runCheck(env Env, args []string) ExitCode {
|
||||
if err := fs.Parse(args); err != nil {
|
||||
return Usage
|
||||
}
|
||||
if code := noStrayArgs(env, "convy check", fs.Args()); code != OK {
|
||||
return code
|
||||
}
|
||||
|
||||
dir, code := projectRoot(env, *root)
|
||||
if code != OK {
|
||||
return code
|
||||
}
|
||||
m, err := manifest.LoadProject(dir)
|
||||
if err != nil {
|
||||
m, code := loadProject(env, dir)
|
||||
if code != OK {
|
||||
return code
|
||||
}
|
||||
if err := distinctDirs(m); err != nil {
|
||||
fmt.Fprintln(env.Err, err)
|
||||
return Usage
|
||||
}
|
||||
@@ -47,10 +52,16 @@ func runCheck(env Env, args []string) ExitCode {
|
||||
var docs []*doc.Document
|
||||
var broken []error
|
||||
for _, name := range names {
|
||||
found, errs := copies(dir, m.Components[name].Dir)
|
||||
c := m.Components[name]
|
||||
if c.Dir == "" {
|
||||
fmt.Fprintf(env.Err, "the component %q names no dir, and there is nothing to look in\n", name)
|
||||
return Usage
|
||||
}
|
||||
found, errs := copies(dir, c.Dir)
|
||||
docs = append(docs, found...)
|
||||
broken = append(broken, errs...)
|
||||
}
|
||||
docs = distinct(docs)
|
||||
|
||||
rep := check.Copies(docs)
|
||||
for _, err := range broken {
|
||||
@@ -104,23 +115,25 @@ func copies(root, dir string) ([]*doc.Document, []error) {
|
||||
return docs, broken
|
||||
}
|
||||
|
||||
// distinct drops a document reached through two components. Directories are
|
||||
// checked for equality before this, but one may still lie inside another, and a
|
||||
// finding printed twice reads as two.
|
||||
func distinct(docs []*doc.Document) []*doc.Document {
|
||||
seen := make(map[string]bool, len(docs))
|
||||
out := docs[:0]
|
||||
for _, d := range docs {
|
||||
if seen[d.Path] {
|
||||
continue
|
||||
}
|
||||
seen[d.Path] = true
|
||||
out = append(out, d)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func printCopyReport(w io.Writer, rep *check.Report, files, comps int, quiet bool) {
|
||||
findings := rep.Findings()
|
||||
current := ""
|
||||
for _, f := range findings {
|
||||
if f.Path != current {
|
||||
if current != "" {
|
||||
fmt.Fprintln(w)
|
||||
}
|
||||
fmt.Fprintf(w, "%s\n", f.Path)
|
||||
current = f.Path
|
||||
}
|
||||
where := ""
|
||||
if f.Line > 0 {
|
||||
where = fmt.Sprintf(":%d", f.Line)
|
||||
}
|
||||
fmt.Fprintf(w, " %s%s %s [%s]\n", f.Severity, where, f.Msg, f.Family)
|
||||
}
|
||||
printFindings(w, findings)
|
||||
|
||||
if quiet {
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user