X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=dot.go;h=a77ec69197fda3e1b2c07daf950de2a542f73d8c;hb=6dce71355599d4caf8267f6f02520037480f7ba3;hp=39c90194f8bf1bdf63394e528a9fa015d27f2f1a;hpb=cd29a67e26ef05f0ffadd83448f09886edef4111;p=goredo.git diff --git a/dot.go b/dot.go index 39c9019..a77ec69 100644 --- a/dot.go +++ b/dot.go @@ -1,6 +1,6 @@ /* goredo -- djb's redo implementation on pure Go -Copyright (C) 2020-2021 Sergey Matveev +Copyright (C) 2020-2023 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,11 +21,8 @@ package main import ( "fmt" - "io" "os" "path" - - "go.cypherpunks.ru/recfile" ) type DotNodes struct { @@ -33,34 +30,43 @@ type DotNodes struct { to string } -func dotWalker(data map[DotNodes]bool, tgtOrig string) (map[DotNodes]bool, error) { - cwd, tgt := cwdAndTgt(tgtOrig) - depPath := path.Join(cwd, RedoDir, tgt+DepSuffix) - fdDep, err := os.Open(depPath) +func dotWalker(data map[DotNodes]bool, tgt *Tgt) (map[DotNodes]bool, error) { + raw, err := os.ReadFile(tgt.dep) + if err != nil { + return nil, ErrLine(err) + } + _, raw, err = depHeadParse(raw) if err != nil { - return nil, err + return nil, ErrLine(err) } - defer fdDep.Close() - var dep string - r := recfile.NewReader(fdDep) - for { - m, err := r.NextMap() + var typ byte + var name string + var dep *Tgt + var chunk []byte + tgtH, _ := pathSplit(tgt.a) + for len(raw) > 0 { + typ, chunk, raw, err = chunkRead(raw) if err != nil { - if err == io.EOF { - break - } - return nil, err + return nil, ErrLine(err) } - switch m["Type"] { + switch typ { case DepTypeIfcreate: - data[DotNodes{tgtOrig, cwdMustRel(cwd, m["Target"])}] = true - case DepTypeIfchange: - dep = m["Target"] - data[DotNodes{tgtOrig, cwdMustRel(cwd, dep)}] = false - if isSrc(cwd, dep) || dep == tgt { + data[DotNodes{tgt.rel, NewTgt(path.Join(tgtH, string(chunk))).rel}] = true + case DepTypeIfchange, DepTypeIfchangeDummy: + if typ == DepTypeIfchangeDummy { + name = string(chunk) + } else { + name = string(chunk[InodeLen+HashLen:]) + } + dep = NewTgt(path.Join(tgtH, name)) + if dep.a == tgt.a { + continue + } + data[DotNodes{tgt.rel, dep.rel}] = false + if isSrc(dep) { continue } - data, err = dotWalker(data, cwdMustRel(cwd, dep)) + data, err = dotWalker(data, dep) if err != nil { return nil, err } @@ -69,7 +75,7 @@ func dotWalker(data map[DotNodes]bool, tgtOrig string) (map[DotNodes]bool, error return data, nil } -func dotPrint(tgts []string) error { +func dotPrint(tgts []*Tgt) error { data := map[DotNodes]bool{} var err error for _, tgt := range tgts {