]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Remove excess stat call
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 47ac997b117387eb1c68feeec925e8ef8146eccc..025ecbed5be4972146276c386d0fb14810de6975 100644 (file)
--- a/main.go
+++ b/main.go
@@ -1,6 +1,6 @@
 /*
 goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
 
 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
@@ -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(
@@ -298,7 +295,7 @@ func main() {
                }
        }
 
-       if cmdName == CmdNameRedo || cmdName == CmdNameRedoIfchange {
+       if cmdName == CmdNameRedo {
                statusInit()
        }
 
@@ -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,16 +447,17 @@ 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{}{}
                for _, tgt := range tgtsKnown {
-                       collectDeps(Cwd, tgt, 0, deps, true)
+                       collectDeps(Cwd, tgt, 0, deps, true, map[string]struct{}{})
                }
                seen := map[string]struct{}{}
                for _, tgt := range tgts {
@@ -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,12 +494,14 @@ 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)
+               err = ErrLine(err)
                sort.Strings(srcs)
                for _, src := range srcs {
                        fmt.Println(src)
@@ -508,12 +513,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 +528,7 @@ CmdSwitch:
                log.Fatalln("unknown command", cmdName)
        }
        if err != nil {
-               log.Println(err)
+               log.Print(err)
        }
        rc := 0
        if !ok || err != nil {