+ p := make([]string, 0, upLevels+2)
+ p = append(p, cwd)
+ for i := 0; i < upLevels; i++ {
+ p = append(p, "..")
+ }
+ p = append(p, doFile)
+ rel, err := filepath.Rel(Cwd, path.Join(p...))
+ if err != nil {
+ panic(err)
+ }
+ fmt.Println(rel)
+ }
+ case CmdNameRedoTargets:
+ if tgtsWasEmpty {
+ tgts = []string{Cwd}
+ }
+ tgts, err = targetsWalker(tgts)
+ if err != nil {
+ break
+ }
+ sort.Strings(tgts)
+ for _, tgt := range tgts {
+ fmt.Println(tgt)
+ }
+ case CmdNameRedoAffects:
+ 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 CmdNameRedoOOD:
+ 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 CmdNameRedoSources:
+ 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)
+ }
+ case CmdNameRedoDepFix:
+ err = depFix(Cwd)
+ case CmdNameRedoInode:
+ var inode *Inode
+ for _, tgt := range tgts {
+ inode, err = inodeFromFileByPath(tgt)
+ if err != nil {
+ break
+ }
+ err = recfileWrite(os.Stdout, append(
+ []recfile.Field{{Name: "Target", Value: tgt}},
+ inode.RecfileFields()...)...)
+ if err != nil {
+ break
+ }