X-Git-Url: http://www.git.cypherpunks.ru/?p=goredo.git;a=blobdiff_plain;f=dep.go;h=38d8bb79c200ede2acedeb9ce357fe313211d7c2;hp=e6663e65fb7afaa64dac6f435a6b633d70ff9625;hb=14398260feaf14dac68b9bdb1c810ccba7d1e768;hpb=f8a8a335216a6ec9aa6119d473d2f6aeb43958ca diff --git a/dep.go b/dep.go index e6663e6..38d8bb7 100644 --- a/dep.go +++ b/dep.go @@ -1,6 +1,6 @@ /* goredo -- redo implementation on pure Go -Copyright (C) 2020 Sergey Matveev +Copyright (C) 2020-2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,10 +28,10 @@ import ( "os" "path" "strings" - "syscall" "go.cypherpunks.ru/recfile" "golang.org/x/crypto/blake2b" + "golang.org/x/sys/unix" ) func recfileWrite(fdDep *os.File, fields ...recfile.Field) error { @@ -74,12 +74,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 } @@ -101,6 +100,13 @@ func writeDep(fdDep *os.File, cwd, tgt string) error { return err } defer fd.Close() + fi, err := fd.Stat() + if err != nil { + return err + } + if fi.IsDir() { + return nil + } ts, err := fileCtime(fd) if err != nil { return err