X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=main.go;h=3a7088d16431492773e78a07781e54ff85eeef19;hb=a1394bc35f4473f55d6e56afa720c490d3e7f6bd;hp=092d38957ce4cd50bbef6cacaa8db5d88c45c65b;hpb=cb183690cc59ad772dab941adc3e9b8d5b90fbc0;p=goredo.git diff --git a/main.go b/main.go index 092d389..3a7088d 100644 --- 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", @@ -121,6 +123,7 @@ func main() { } } DirPrefix = os.Getenv(EnvDirPrefix) + DepCwd = os.Getenv(EnvDepCwd) if *flagStderrKeep { mustSetenv(EnvStderrKeep, "1") @@ -197,7 +200,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 +231,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 +375,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})