X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=main.go;h=8c9c16da1430a761779856688da8382b82a98e18;hb=480ab4060b2762490e72a2a89ddf3d106f1402e1;hp=a3773f43b3ce5b7dc96b09a1e52b5570ab084ba8;hpb=eb14a3333a632b22a4b698ca28fea6e6d11048b8;p=goredo.git diff --git a/main.go b/main.go index a3773f4..8c9c16d 100644 --- a/main.go +++ b/main.go @@ -79,6 +79,7 @@ func main() { rc := 0 for _, cmdName := range []string{ "redo", + "redo-affects", "redo-always", "redo-cleanup", "redo-dot", @@ -160,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 @@ -196,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 == "" { @@ -225,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 { @@ -235,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"} } } @@ -358,13 +361,49 @@ CmdSwitch: fmt.Println(rel) } case "redo-targets": - tgts, err = targetsWalker(Cwd) + 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": - tgts, err = targetsWalker(Cwd) + if tgtsWasEmpty { + tgts, err = targetsWalker([]string{Cwd}) + if err != nil { + break + } + } sort.Strings(tgts) var ood bool for _, tgt := range tgts { @@ -377,10 +416,18 @@ CmdSwitch: } } case "redo-sources": - tgts, err = sourcesWalker() + if tgtsWasEmpty { + tgts, err = targetsWalker([]string{Cwd}) + if err != nil { + break + } + } sort.Strings(tgts) - for _, tgt := range tgts { - fmt.Println(tgt) + var srcs []string + srcs, err = sourcesWalker(tgts) + sort.Strings(srcs) + for _, src := range srcs { + fmt.Println(src) } default: log.Fatalln("unknown command", cmdName)