X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=dep.go;h=df5ae27f2af9737b070b84df719a24f255328d2b;hb=7eba00581c3ce34f0944eb31e74cca6d4d5cda8f;hp=a362a3840b5ded3a4b141bd85a8451bc0a624f7e;hpb=68c7d1136890bf7b70e78e3612d79965c261b68f;p=goredo.git diff --git a/dep.go b/dep.go index a362a38..df5ae27 100644 --- a/dep.go +++ b/dep.go @@ -27,13 +27,15 @@ import ( "io" "os" "path" - "strings" - "syscall" + "path/filepath" "go.cypherpunks.ru/recfile" "golang.org/x/crypto/blake2b" + "golang.org/x/sys/unix" ) +var DirPrefix string + func recfileWrite(fdDep *os.File, fields ...recfile.Field) error { w := recfile.NewWriter(fdDep) if _, err := w.RecordStart(); err != nil { @@ -74,12 +76,11 @@ func stamp(fdDep, src *os.File) error { } func fileCtime(fd *os.File) (string, error) { - fi, err := fd.Stat() - if err != nil { + var stat unix.Stat_t + if err := unix.Fstat(int(fd.Fd()), &stat); err != nil { return "", err } - stat := fi.Sys().(*syscall.Stat_t) - sec, nsec := stat.Ctimespec.Unix() + sec, nsec := stat.Ctim.Unix() return fmt.Sprintf("%d.%d", sec, nsec), nil } @@ -130,17 +131,22 @@ func writeDeps(fdDep *os.File, tgts []string) error { trace(CDebug, "no opened fdDep: %s", tgts) return nil } - ups := []string{} - upLevels := strings.Count(os.Getenv(EnvDirPrefix), "/") - for i := 0; i < upLevels; i++ { - ups = append(ups, "..") - } - up := path.Join(ups...) for _, tgt := range tgts { if _, err := os.Stat(tgt); err == nil { - if err = writeDep(fdDep, Cwd, path.Join(up, tgt)); err != nil { + tgtAbs, err := filepath.Abs(tgt) + if err != nil { + panic(err) + } + tgtDir := path.Join(Cwd, DirPrefix) + tgtRel, err := filepath.Rel(tgtDir, tgtAbs) + if err != nil { + panic(err) + } + if err = writeDep(fdDep, tgtDir, tgtRel); err != nil { return err } + } else { + trace(CDebug, "skipping dep record, can not stat: %s", tgt) } } return nil