"os"
"path"
"path/filepath"
+ "runtime"
+ "sort"
"strconv"
"go.cypherpunks.ru/recfile"
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)
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
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))
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 == "" {
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 {
"%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"}
}
}
if err != nil {
break
}
- _, err = fdTmp.Seek(0, os.SEEK_SET)
+ _, err = fdTmp.Seek(0, io.SeekStart)
if err != nil {
break
}
}
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)
}