]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
bmake/gmake jobserver protocol compatibility
[goredo.git] / main.go
diff --git a/main.go b/main.go
index 092d38957ce4cd50bbef6cacaa8db5d88c45c65b..860d63a5bd43f315a97350ca6efeaf729a332662 100644 (file)
--- a/main.go
+++ b/main.go
@@ -40,6 +40,7 @@ import (
 var (
        Cwd       string
        BuildUUID string
+       IsTopRedo bool // is it the top redo instance
 )
 
 func mustSetenv(key, value string) {
@@ -79,6 +80,7 @@ func main() {
                rc := 0
                for _, cmdName := range []string{
                        "redo",
+                       "redo-affects",
                        "redo-always",
                        "redo-cleanup",
                        "redo-dot",
@@ -197,7 +199,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 == "" {
@@ -228,6 +230,7 @@ func main() {
        BuildUUID = os.Getenv(EnvBuildUUID)
        tgtsWasEmpty := len(tgts) == 0
        if BuildUUID == "" {
+               IsTopRedo = true
                raw := new([16]byte)
                if _, err = io.ReadFull(rand.Reader, raw[:]); err != nil {
                        log.Fatalln(err)
@@ -371,6 +374,31 @@ CmdSwitch:
                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})