diff --git a/cmd/dirdiff/main.go b/cmd/dirdiff/main.go index 94ffe47a5..23182f5bf 100644 --- a/cmd/dirdiff/main.go +++ b/cmd/dirdiff/main.go @@ -62,7 +62,8 @@ func (e *entry) equals(other *entry) bool { if e.fi.ModTime() != other.fi.ModTime() { fmt.Printf("%s: ModTime does not match\n", e.path) - // TODO: Fix ModTime for directories, return false + // TODO: Fix ModTime for symlinks, return false + // see http://grokbase.com/t/gg/golang-nuts/154wnph4y8/go-nuts-no-way-to-utimes-a-symlink return true } diff --git a/node.go b/node.go index 7785e7099..13d44ca04 100644 --- a/node.go +++ b/node.go @@ -155,12 +155,23 @@ func (node Node) restoreMetadata(path string) error { return errors.Annotate(err, "Chmod") } + if node.Type != "dir" { + err = node.RestoreTimestamps(path) + if err != nil { + return err + } + } + + return nil +} + +func (node Node) RestoreTimestamps(path string) error { var utimes = []syscall.Timespec{ syscall.NsecToTimespec(node.AccessTime.UnixNano()), syscall.NsecToTimespec(node.ModTime.UnixNano()), } - err = syscall.UtimesNano(path, utimes) - if err != nil { + + if err := syscall.UtimesNano(path, utimes); err != nil { return errors.Annotate(err, "UtimesNano") } diff --git a/restorer.go b/restorer.go index 9511d3bc9..d97bd0a5f 100644 --- a/restorer.go +++ b/restorer.go @@ -61,6 +61,12 @@ func (res *Restorer) restoreTo(dst string, dir string, treeID backend.ID) error return err } } + + // Restore directory timestamp at the end. If we would do it earlier, restoring files within + // the directory would overwrite the timestamp of the directory they are in. + if err := node.RestoreTimestamps(filepath.Join(dst, dir, node.Name)); err != nil { + return err + } } }