diff --git a/internal/third_party/dep/fs/fs.go b/internal/third_party/dep/fs/fs.go index c1e2f4292..ce85e4174 100644 --- a/internal/third_party/dep/fs/fs.go +++ b/internal/third_party/dep/fs/fs.go @@ -178,7 +178,8 @@ func CopyFile(src, dst string) (err error) { if fi, err := os.Lstat(src); err != nil { return fmt.Errorf("stat failed: %w", err) } else if !fi.Mode().IsRegular() { - slog.Debug("skipping non-regular file", "path", src, "mode", fi.Mode()) + fileType := fileTypeString(fi.Mode()) + slog.Debug("skipping non-regular file", "path", src, "type", fileType, "mode", fi.Mode()) return nil } } @@ -254,6 +255,31 @@ func IsSymlink(path string) (bool, error) { return l.Mode()&os.ModeSymlink == os.ModeSymlink, nil } +// fileTypeString returns a human-readable description of the file type based on the mode. +func fileTypeString(mode os.FileMode) string { + switch { + case mode&os.ModeDir != 0: + return "directory" + case mode&os.ModeSymlink != 0: + return "symlink" + case mode&os.ModeNamedPipe != 0: + return "named pipe (FIFO)" + case mode&os.ModeSocket != 0: + return "socket" + case mode&os.ModeDevice != 0: + if mode&os.ModeCharDevice != 0 { + return "character device" + } + return "block device" + case mode&os.ModeIrregular != 0: + return "irregular file" + case mode.IsRegular(): + return "regular file" + default: + return "unknown file type" + } +} + // fixLongPath returns the extended-length (\\?\-prefixed) form of // path when needed, in order to avoid the default 260 character file // path limit imposed by Windows. If path is not easily converted to