Skip to content

Commit

Permalink
Separate linux and darwin because unix.Timeval differs
Browse files Browse the repository at this point in the history
  • Loading branch information
brandonc committed Oct 24, 2023
1 parent 23d1530 commit c31d54f
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//go:build darwin || linux
// +build darwin linux
//go:build darwin
// +build darwin

package unpackinfo

Expand Down
30 changes: 30 additions & 0 deletions internal/unpackinfo/lchtimes_linux.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//go:build linux
// +build linux

package unpackinfo

import (
"golang.org/x/sys/unix"
)

// Lchtimes modifies the access and modified timestamps on a target path
// This capability is only available on Linux and Darwin as of now. The
// timestamps within UnpackInfo would have already been rounded by
// archive/tar so there is no need for subsecond precision.
func (i UnpackInfo) Lchtimes() error {
return unix.Lutimes(i.Path, []unix.Timeval{
{Sec: i.OriginalAccessTime.Unix(), Usec: i.OriginalAccessTime.UnixMicro() % 1000},
{Sec: i.OriginalModTime.Unix(), Usec: i.OriginalModTime.UnixMicro() % 1000}},
)
}

// CanMaintainSymlinkTimestamps determines whether is is possible to change
// timestamps on symlinks for the the current platform. For regular files
// and directories, attempts are made to restore permissions and timestamps
// after extraction. But for symbolic links, go's cross-platform
// packages (Chmod and Chtimes) are not capable of changing symlink info
// because those methods follow the symlinks. However, a platform-dependent option
// is provided for linux and darwin (see Lchtimes)
func CanMaintainSymlinkTimestamps() bool {
return true
}

0 comments on commit c31d54f

Please sign in to comment.