]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Do not forget to install redo-inode
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 8c95d84bd3ed76135ce08086ebb595498b8635e0..39c6d118a0d941ce0a6f113ca378ef55298e39e8 100644 (file)
--- a/main.go
+++ b/main.go
@@ -118,6 +118,7 @@ func main() {
                        CmdNameRedoDot,
                        CmdNameRedoIfchange,
                        CmdNameRedoIfcreate,
+                       CmdNameRedoInode,
                        CmdNameRedoLog,
                        CmdNameRedoOOD,
                        CmdNameRedoSources,
@@ -128,7 +129,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 +142,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,39 +216,41 @@ 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)
        }
 
+       var fdLock *os.File
        if v := os.Getenv(EnvOODTgtsFd); v != "" {
                fd := mustParseFd(v, EnvOODTgtsFd)
-               fdLock := mustParseFd(v, EnvOODTgtsLockFd)
+               fdLock = mustParseFd(v, EnvOODTgtsLockFd)
+               defer fdLock.Close()
                flock := unix.Flock_t{
                        Type:   unix.F_WRLCK,
                        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 +286,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 +353,7 @@ CmdSwitch:
                                path.Join(Cwd, tgt),
                        )
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        err = ifcreate(fdDep, tgtRel)
@@ -381,29 +382,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 +418,7 @@ CmdSwitch:
                                if errors.Is(err, io.EOF) {
                                        break
                                }
+                               err = ErrLine(err)
                                break CmdSwitch
                        }
                        fmt.Println(cwdMustRel(cwd, m["Target"]))
@@ -426,10 +432,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 +441,7 @@ CmdSwitch:
                }
                tgts, err = targetsWalker(tgts)
                if err != nil {
+                       err = ErrLine(err)
                        break
                }
                sort.Strings(tgts)
@@ -446,16 +450,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 +486,7 @@ CmdSwitch:
                for _, tgt := range tgts {
                        ood, err = isOOD(Cwd, tgt, 0, nil)
                        if err != nil {
+                               err = ErrLine(err)
                                break
                        }
                        if ood {
@@ -491,14 +497,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 +528,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 +543,7 @@ CmdSwitch:
                log.Fatalln("unknown command", cmdName)
        }
        if err != nil {
-               log.Println(err)
+               log.Print(err)
        }
        rc := 0
        if !ok || err != nil {