]> Cypherpunks.ru repositories - goredo.git/blobdiff - buildlog.go
Download link for 2.4.0 release
[goredo.git] / buildlog.go
index 297808080f112443487832145e17ce6753d4bdb4..a2843846a47e5ac395dc4bf9c92327f651c9d7e9 100644 (file)
@@ -23,6 +23,7 @@ import (
        "flag"
        "fmt"
        "io"
+       "io/fs"
        "os"
        "path"
        "sort"
@@ -37,8 +38,7 @@ import (
 const HumanTimeFmt = "2006-01-02 15:04:05.000000000 Z07:00"
 
 type BuildLogJob struct {
-       dir      string
-       tgt      string
+       tgt      *Tgt
        started  time.Time
        exitCode int
        rec      map[string][]string
@@ -74,8 +74,9 @@ func init() {
        buildLogSeen = make(map[string]struct{})
 }
 
-func parseBuildLogRec(dir, tgt string) (map[string][]string, error) {
-       fd, err := os.Open(path.Join(dir, RedoDir, tgt+LogRecSuffix))
+func parseBuildLogRec(tgt *Tgt) (map[string][]string, error) {
+       h, t := path.Split(tgt.a)
+       fd, err := os.Open(path.Join(h, RedoDir, t+LogRecSuffix))
        if err != nil {
                return nil, ErrLine(err)
        }
@@ -93,18 +94,17 @@ func depthPrefix(depth int) string {
 }
 
 func showBuildLogSub(sub *BuildLogJob, depth int) error {
-       abs := mustAbs(path.Join(sub.dir, sub.tgt))
-       if _, ok := buildLogSeen[abs]; ok {
+       if _, ok := buildLogSeen[sub.tgt.rel]; ok {
                return nil
        }
-       buildLogSeen[abs] = struct{}{}
+       buildLogSeen[sub.tgt.rel] = struct{}{}
        dp := depthPrefix(depth)
        fmt.Printf(
                "%s%s%s\n",
                sub.rec["Started"][0], dp,
-               colourize(CRedo, "redo "+sub.tgt),
+               colourize(CRedo, "redo "+sub.tgt.rel),
        )
-       if err := showBuildLog(sub.dir, sub.tgt, sub.rec, depth+1); err != nil {
+       if err := showBuildLog(sub.tgt, sub.rec, depth+1); err != nil {
                return err
        }
        durationSec, durationNsec, err := durationToInts(sub.rec["Duration"][0])
@@ -115,14 +115,14 @@ func showBuildLogSub(sub *BuildLogJob, depth int) error {
                fmt.Printf(
                        "%s%s%s (code: %d) (%d.%ds)\n\n",
                        sub.rec["Finished"][0], dp,
-                       colourize(CErr, "err "+sub.tgt),
+                       colourize(CErr, "err "+sub.tgt.rel),
                        sub.exitCode, durationSec, durationNsec,
                )
        } else {
                fmt.Printf(
                        "%s%s%s (%d.%ds)\n\n",
                        sub.rec["Finished"][0], dp,
-                       colourize(CRedo, "done "+sub.tgt),
+                       colourize(CRedo, "done "+sub.tgt.rel),
                        durationSec, durationNsec,
                )
        }
@@ -167,11 +167,10 @@ func showBuildLogCmd(m map[string][]string, depth int) error {
        return nil
 }
 
-func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) error {
+func showBuildLog(tgt *Tgt, buildLogRec map[string][]string, depth int) error {
        var err error
-       dirNormalized, tgtNormalized := cwdAndTgt(path.Join(dir, tgt))
        if *flagBuildLogCommands || *flagBuildLogRecursive {
-               buildLogRec, err = parseBuildLogRec(dirNormalized, tgtNormalized)
+               buildLogRec, err = parseBuildLogRec(tgt)
                if err != nil {
                        return err
                }
@@ -181,7 +180,8 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
                        return err
                }
        }
-       fd, err := os.Open(path.Join(dirNormalized, RedoDir, tgtNormalized+LogSuffix))
+       tgtH, tgtT := path.Split(tgt.a)
+       fd, err := os.Open(path.Join(tgtH, RedoDir, tgtT+LogSuffix))
        if err != nil {
                return ErrLine(err)
        }
@@ -197,14 +197,14 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
        }
        defer fd.Close()
        subs := make([]*BuildLogJob, 0, len(buildLogRec["Ifchange"]))
-       for _, dep := range buildLogRec["Ifchange"] {
-               subDir, subTgt := cwdAndTgt(path.Join(dirNormalized, dep))
-               if subDir == dirNormalized && subTgt == tgtNormalized {
+       for _, depPath := range buildLogRec["Ifchange"] {
+               dep := NewTgt(path.Join(tgtH, depPath))
+               if dep.rel == tgt.rel {
                        continue
                }
-               rec, err := parseBuildLogRec(subDir, subTgt)
+               rec, err := parseBuildLogRec(dep)
                if err != nil {
-                       if os.IsNotExist(err) {
+                       if errors.Is(err, fs.ErrNotExist) {
                                continue
                        }
                        return err
@@ -224,7 +224,6 @@ func showBuildLog(dir, tgt string, buildLogRec map[string][]string, depth int) e
                        }
                }
                subs = append(subs, &BuildLogJob{
-                       dir:      dirNormalized,
                        tgt:      dep,
                        started:  started,
                        exitCode: exitCode,