mirror of
https://github.com/octoleo/restic.git
synced 2024-12-05 03:13:18 +00:00
8f20d5dcd5
Previously, nodeRestoreTimestamps would do something like if node.Type == restic.NodeTypeSymlink { return nodeRestoreSymlinkTimestamps(...) } return syscall.UtimesNano(...) where nodeRestoreSymlinkTimestamps was either a no-op or a reimplementation of syscall.UtimesNano that handles symlinks, with some repeated converting between timestamp types. The Linux implementation was a bit clumsy, requiring three syscalls to set the timestamps. In this new setup, there is a function utimesNano that has three implementations: * on Linux, it's a modified syscall.UtimesNano that uses AT_SYMLINK_NOFOLLOW and AT_FDCWD so it can handle any type in a single call; * on other Unix platforms, it just calls the syscall function after skipping symlinks; * on Windows, it's the modified UtimesNano that was previously called nodeRestoreSymlinkTimestamps, except with different arguments.
20 lines
532 B
Go
20 lines
532 B
Go
package fs
|
|
|
|
import (
|
|
"io/fs"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/restic/restic/internal/errors"
|
|
"github.com/restic/restic/internal/restic"
|
|
rtest "github.com/restic/restic/internal/test"
|
|
)
|
|
|
|
func TestRestoreSymlinkTimestampsError(t *testing.T) {
|
|
d := t.TempDir()
|
|
node := restic.Node{Type: restic.NodeTypeSymlink}
|
|
err := nodeRestoreTimestamps(&node, d+"/nosuchfile")
|
|
rtest.Assert(t, errors.Is(err, fs.ErrNotExist), "want ErrNotExist, got %q", err)
|
|
rtest.Assert(t, strings.Contains(err.Error(), d), "filename not in %q", err)
|
|
}
|