if TopDir == "" {
TopDir = "/"
} else {
- TopDir, err = filepath.Abs(TopDir)
- if err != nil {
- panic(err)
- }
+ TopDir = mustAbs(TopDir)
}
DirPrefix = os.Getenv(EnvDirPrefix)
DepCwd = os.Getenv(EnvDepCwd)
log.Fatal(err)
}
+ var fdLock *os.File
if v := os.Getenv(EnvOODTgtsFd); v != "" {
fd := mustParseFd(v, EnvOODTgtsFd)
- fdLock := mustParseFd(v, EnvOODTgtsLockFd)
+ fdLock = mustParseFd(v, EnvOODTgtsLockFd)
+ defer fdLock.Close()
flock := unix.Flock_t{
Type: unix.F_WRLCK,
Whence: io.SeekStart,
path.Join(Cwd, tgt),
)
if err != nil {
+ err = ErrLine(err)
break
}
err = ifcreate(fdDep, tgtRel)
var fdTmp *os.File
fdTmp, err = os.CreateTemp("", "whichdo")
if err != nil {
+ err = ErrLine(err)
break
}
if err = os.Remove(fdTmp.Name()); err != nil {
+ err = ErrLine(err)
break
}
cwd, tgt := cwdAndTgt(tgts[0])
doFile, upLevels, err := findDo(fdTmp, cwd, tgt)
if err != nil {
+ err = ErrLine(err)
break
}
_, err = fdTmp.Seek(0, io.SeekStart)
if err != nil {
+ err = ErrLine(err)
break
}
r := recfile.NewReader(fdTmp)
if errors.Is(err, io.EOF) {
break
}
+ err = ErrLine(err)
break CmdSwitch
}
fmt.Println(cwdMustRel(cwd, m["Target"]))
p = append(p, "..")
}
p = append(p, doFile)
- rel, err := filepath.Rel(Cwd, path.Join(p...))
- if err != nil {
- panic(err)
- }
+ rel := mustRel(Cwd, path.Join(p...))
fmt.Println(rel)
}
case CmdNameRedoTargets:
}
tgts, err = targetsWalker(tgts)
if err != nil {
+ err = ErrLine(err)
break
}
sort.Strings(tgts)
var tgtsKnown []string
tgtsKnown, err = targetsWalker([]string{Cwd})
if err != nil {
+ err = ErrLine(err)
break
}
deps := map[string]map[string]struct{}{}
for _, tgt := range tgts {
ood, err = isOOD(Cwd, tgt, 0, nil)
if err != nil {
+ err = ErrLine(err)
break
}
if ood {
if tgtsWasEmpty {
tgts, err = targetsWalker([]string{Cwd})
if err != nil {
+ err = ErrLine(err)
break
}
}
sort.Strings(tgts)
- var srcs []string
- srcs, err = sourcesWalker(tgts)
- sort.Strings(srcs)
- for _, src := range srcs {
+ seen := make(map[string]struct{})
+ seenDeps := make(map[string]struct{})
+ srcs := make(map[string]struct{})
+ err = ErrLine(sourcesWalker(tgts, seen, seenDeps, srcs))
+ seen = nil
+ seenDeps = nil
+ if err != nil {
+ break
+ }
+ seenDeps = nil
+ res := make([]string, 0, len(srcs))
+ for p := range srcs {
+ res = append(res, p)
+ }
+ srcs = nil
+ sort.Strings(res)
+ for _, src := range res {
fmt.Println(src)
}
case CmdNameRedoDepFix:
for _, tgt := range tgts {
inode, err = inodeFromFileByPath(tgt)
if err != nil {
+ err = ErrLine(err)
break
}
err = recfileWrite(os.Stdout, append(
[]recfile.Field{{Name: "Target", Value: tgt}},
inode.RecfileFields()...)...)
if err != nil {
+ err = ErrLine(err)
break
}
}