]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
redo-affects
[goredo.git] / main.go
diff --git a/main.go b/main.go
index ee5bf041f5f608dbc70a79e0d1c8c56b31223064..8c9c16da1430a761779856688da8382b82a98e18 100644 (file)
--- a/main.go
+++ b/main.go
@@ -30,6 +30,7 @@ import (
        "path"
        "path/filepath"
        "runtime"
+       "sort"
        "strconv"
 
        "go.cypherpunks.ru/recfile"
@@ -78,13 +79,17 @@ func main() {
                rc := 0
                for _, cmdName := range []string{
                        "redo",
+                       "redo-affects",
                        "redo-always",
                        "redo-cleanup",
                        "redo-dot",
                        "redo-ifchange",
                        "redo-ifcreate",
                        "redo-log",
+                       "redo-ood",
+                       "redo-sources",
                        "redo-stamp",
+                       "redo-targets",
                        "redo-whichdo",
                } {
                        fmt.Println(os.Args[0], "<-", cmdName)
@@ -156,10 +161,11 @@ func main() {
        if *flagTraceAll {
                mustSetenv(EnvTrace, "1")
        }
-       if *flagTrace {
+       if os.Getenv(EnvTrace) == "1" {
+               TracedAll = true
                traced = true
        } else {
-               traced = os.Getenv(EnvTrace) == "1"
+               traced = *flagTrace
        }
 
        // Those are internal envs
@@ -184,7 +190,7 @@ func main() {
                if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil {
                        panic(err)
                }
-               if _, err = fd.Seek(0, os.SEEK_SET); err != nil {
+               if _, err = fd.Seek(0, io.SeekStart); err != nil {
                        panic(err)
                }
                tgtsRaw, err := ioutil.ReadAll(bufio.NewReader(fd))
@@ -192,7 +198,7 @@ func main() {
                        panic(err)
                }
                unix.Flock(int(fdLock.Fd()), unix.LOCK_UN)
-               OODTgts = make(map[string]struct{})
+               OODTgts = map[string]struct{}{}
                for _, tgtRaw := range bytes.Split(tgtsRaw, []byte{0}) {
                        t := string(tgtRaw)
                        if t == "" {
@@ -221,6 +227,7 @@ func main() {
 
        tgts := flag.Args()
        BuildUUID = os.Getenv(EnvBuildUUID)
+       tgtsWasEmpty := len(tgts) == 0
        if BuildUUID == "" {
                raw := new([16]byte)
                if _, err = io.ReadFull(rand.Reader, raw[:]); err != nil {
@@ -231,7 +238,7 @@ func main() {
                        "%x-%x-%x-%x-%x",
                        raw[0:4], raw[4:6], raw[6:8], raw[8:10], raw[10:],
                )
-               if len(tgts) == 0 {
+               if tgtsWasEmpty {
                        tgts = []string{"all"}
                }
        }
@@ -323,7 +330,7 @@ CmdSwitch:
                if err != nil {
                        break
                }
-               _, err = fdTmp.Seek(0, os.SEEK_SET)
+               _, err = fdTmp.Seek(0, io.SeekStart)
                if err != nil {
                        break
                }
@@ -353,6 +360,75 @@ CmdSwitch:
                        }
                        fmt.Println(rel)
                }
+       case "redo-targets":
+               if tgtsWasEmpty {
+                       tgts = []string{Cwd}
+               }
+               tgts, err = targetsWalker(tgts)
+               if err != nil {
+                       break
+               }
+               sort.Strings(tgts)
+               for _, tgt := range tgts {
+                       fmt.Println(tgt)
+               }
+       case "redo-affects":
+               if tgtsWasEmpty {
+                       log.Fatalln("no targets specified")
+               }
+               var tgtsKnown []string
+               tgtsKnown, err = targetsWalker([]string{Cwd})
+               if err != nil {
+                       break
+               }
+               deps := map[string]map[string]struct{}{}
+               for _, tgt := range tgtsKnown {
+                       collectDeps(Cwd, tgt, 0, deps, true)
+               }
+               seen := map[string]struct{}{}
+               for _, tgt := range tgts {
+                       collectWholeDeps(deps[tgt], deps, seen)
+               }
+               tgts := make([]string, 0, len(seen))
+               for dep := range seen {
+                       tgts = append(tgts, dep)
+               }
+               sort.Strings(tgts)
+               for _, dep := range tgts {
+                       fmt.Println(dep)
+               }
+       case "redo-ood":
+               if tgtsWasEmpty {
+                       tgts, err = targetsWalker([]string{Cwd})
+                       if err != nil {
+                               break
+                       }
+               }
+               sort.Strings(tgts)
+               var ood bool
+               for _, tgt := range tgts {
+                       ood, err = isOOD(Cwd, tgt, 0, nil)
+                       if err != nil {
+                               break
+                       }
+                       if ood {
+                               fmt.Println(tgt)
+                       }
+               }
+       case "redo-sources":
+               if tgtsWasEmpty {
+                       tgts, err = targetsWalker([]string{Cwd})
+                       if err != nil {
+                               break
+                       }
+               }
+               sort.Strings(tgts)
+               var srcs []string
+               srcs, err = sourcesWalker(tgts)
+               sort.Strings(srcs)
+               for _, src := range srcs {
+                       fmt.Println(src)
+               }
        default:
                log.Fatalln("unknown command", cmdName)
        }