]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Optimise memory storage of dependency information
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 0fb48d6819911eed9647a20611bf9c50580c61a1..c05d3c777e2247d8a2b4ad69ef73aed78b571d92 100644 (file)
--- a/main.go
+++ b/main.go
@@ -128,7 +128,7 @@ func main() {
                        fmt.Println(os.Args[0], "<-", cmdName)
                        if err := os.Symlink(os.Args[0], cmdName); err != nil {
                                rc = 1
-                               log.Println(err)
+                               log.Print(err)
                        }
                }
                os.Exit(rc)
@@ -141,17 +141,14 @@ func main() {
        var err error
        Cwd, err = os.Getwd()
        if err != nil {
-               log.Fatalln(err)
+               log.Fatal(err)
        }
 
        TopDir = os.Getenv(EnvTopDir)
        if TopDir == "" {
                TopDir = "/"
        } else {
-               TopDir, err = filepath.Abs(TopDir)
-               if err != nil {
-                       panic(err)
-               }
+               TopDir = mustAbs(TopDir)
        }
        DirPrefix = os.Getenv(EnvDirPrefix)
        DepCwd = os.Getenv(EnvDepCwd)
@@ -218,17 +215,17 @@ func main() {
        // Those are internal envs
        FdOODTgts, err = os.CreateTemp("", "ood-tgts")
        if err != nil {
-               log.Fatalln(err)
+               log.Fatal(err)
        }
        if err = os.Remove(FdOODTgts.Name()); err != nil {
-               log.Fatalln(err)
+               log.Fatal(err)
        }
        FdOODTgtsLock, err = os.CreateTemp("", "ood-tgts.lock")
        if err != nil {
-               log.Fatalln(err)
+               log.Fatal(err)
        }
        if err = os.Remove(FdOODTgtsLock.Name()); err != nil {
-               log.Fatalln(err)
+               log.Fatal(err)
        }
 
        if v := os.Getenv(EnvOODTgtsFd); v != "" {
@@ -239,18 +236,18 @@ func main() {
                        Whence: io.SeekStart,
                }
                if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLKW, &flock); err != nil {
-                       log.Fatalln(err)
+                       log.Fatal(err)
                }
                if _, err = fd.Seek(0, io.SeekStart); err != nil {
-                       log.Fatalln(err)
+                       log.Fatal(err)
                }
                tgtsRaw, err := io.ReadAll(bufio.NewReader(fd))
                if err != nil {
-                       log.Fatalln(err)
+                       log.Fatal(err)
                }
                flock.Type = unix.F_UNLCK
                if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLK, &flock); err != nil {
-                       log.Fatalln(err)
+                       log.Fatal(err)
                }
                OODTgts = map[string]struct{}{}
                for _, tgtRaw := range bytes.Split(tgtsRaw, []byte{0}) {
@@ -286,7 +283,7 @@ func main() {
                IsTopRedo = true
                raw := new([16]byte)
                if _, err = io.ReadFull(rand.Reader, raw[:]); err != nil {
-                       log.Fatalln(err)
+                       log.Fatal(err)
                }
                raw[6] = (raw[6] & 0x0F) | uint8(4<<4) // version 4
                BuildUUID = fmt.Sprintf(
@@ -353,6 +350,7 @@ CmdSwitch:
                                path.Join(Cwd, tgt),
                        )
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        err = ifcreate(fdDep, tgtRel)
@@ -381,29 +379,33 @@ CmdSwitch:
                err = stamp(fdDep, os.Stdin)
        case CmdNameRedoLog:
                if len(tgts) != 1 {
-                       log.Fatalln("single target expected")
+                       log.Fatal("single target expected")
                }
                d, t := cwdAndTgt(tgts[0])
                err = showBuildLog(d, t, nil, 0)
        case CmdNameRedoWhichdo:
                if len(tgts) != 1 {
-                       log.Fatalln("single target expected")
+                       log.Fatal("single target expected")
                }
                var fdTmp *os.File
                fdTmp, err = os.CreateTemp("", "whichdo")
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                if err = os.Remove(fdTmp.Name()); err != nil {
+                       err = ErrLine(err)
                        break
                }
                cwd, tgt := cwdAndTgt(tgts[0])
                doFile, upLevels, err := findDo(fdTmp, cwd, tgt)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                _, err = fdTmp.Seek(0, io.SeekStart)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                r := recfile.NewReader(fdTmp)
@@ -413,6 +415,7 @@ CmdSwitch:
                                if errors.Is(err, io.EOF) {
                                        break
                                }
+                               err = ErrLine(err)
                                break CmdSwitch
                        }
                        fmt.Println(cwdMustRel(cwd, m["Target"]))
@@ -426,10 +429,7 @@ CmdSwitch:
                                p = append(p, "..")
                        }
                        p = append(p, doFile)
-                       rel, err := filepath.Rel(Cwd, path.Join(p...))
-                       if err != nil {
-                               panic(err)
-                       }
+                       rel := mustRel(Cwd, path.Join(p...))
                        fmt.Println(rel)
                }
        case CmdNameRedoTargets:
@@ -438,6 +438,7 @@ CmdSwitch:
                }
                tgts, err = targetsWalker(tgts)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                sort.Strings(tgts)
@@ -446,11 +447,12 @@ CmdSwitch:
                }
        case CmdNameRedoAffects:
                if tgtsWasEmpty {
-                       log.Fatalln("no targets specified")
+                       log.Fatal("no targets specified")
                }
                var tgtsKnown []string
                tgtsKnown, err = targetsWalker([]string{Cwd})
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                deps := map[string]map[string]struct{}{}
@@ -481,6 +483,7 @@ CmdSwitch:
                for _, tgt := range tgts {
                        ood, err = isOOD(Cwd, tgt, 0, nil)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        if ood {
@@ -491,14 +494,28 @@ CmdSwitch:
                if tgtsWasEmpty {
                        tgts, err = targetsWalker([]string{Cwd})
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                }
                sort.Strings(tgts)
-               var srcs []string
-               srcs, err = sourcesWalker(tgts)
-               sort.Strings(srcs)
-               for _, src := range srcs {
+               seen := make(map[string]struct{})
+               seenDeps := make(map[string]struct{})
+               srcs := make(map[string]struct{})
+               err = ErrLine(sourcesWalker(tgts, seen, seenDeps, srcs))
+               seen = nil
+               seenDeps = nil
+               if err != nil {
+                       break
+               }
+               seenDeps = nil
+               res := make([]string, 0, len(srcs))
+               for p := range srcs {
+                       res = append(res, p)
+               }
+               srcs = nil
+               sort.Strings(res)
+               for _, src := range res {
                        fmt.Println(src)
                }
        case CmdNameRedoDepFix:
@@ -508,12 +525,14 @@ CmdSwitch:
                for _, tgt := range tgts {
                        inode, err = inodeFromFileByPath(tgt)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        err = recfileWrite(os.Stdout, append(
                                []recfile.Field{{Name: "Target", Value: tgt}},
                                inode.RecfileFields()...)...)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                }
@@ -521,7 +540,7 @@ CmdSwitch:
                log.Fatalln("unknown command", cmdName)
        }
        if err != nil {
-               log.Println(err)
+               log.Print(err)
        }
        rc := 0
        if !ok || err != nil {