X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=main.go;h=860d63a5bd43f315a97350ca6efeaf729a332662;hb=d830f32d30e4ea9d9f06ae835db6ec5c4822dcfc;hp=4de78be52fa786830cfbb92862c1c495cd59140a;hpb=314f58ec690c7321535d6718e8d3a0ecb4cac019;p=goredo.git diff --git a/main.go b/main.go index 4de78be..860d63a 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,8 @@ import ( "os" "path" "path/filepath" + "runtime" + "sort" "strconv" "go.cypherpunks.ru/recfile" @@ -38,6 +40,7 @@ import ( var ( Cwd string BuildUUID string + IsTopRedo bool // is it the top redo instance ) func mustSetenv(key, value string) { @@ -63,27 +66,31 @@ func main() { warranty := flag.Bool("warranty", false, "print warranty information") symlinks := flag.Bool("symlinks", false, "create necessary symlinks in current directory") - flag.Usage = usage + flag.Usage = func() { usage(os.Args[0]) } flag.Parse() if *warranty { fmt.Println(Warranty) return } if *version { - fmt.Println(versionGet()) + fmt.Println("goredo", Version, "built with", runtime.Version()) return } if *symlinks { 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) @@ -155,10 +162,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 @@ -183,7 +191,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)) @@ -191,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 == "" { @@ -220,7 +228,9 @@ func main() { tgts := flag.Args() 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) @@ -230,7 +240,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"} } } @@ -322,7 +332,7 @@ CmdSwitch: if err != nil { break } - _, err = fdTmp.Seek(0, os.SEEK_SET) + _, err = fdTmp.Seek(0, io.SeekStart) if err != nil { break } @@ -352,6 +362,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) }