| // +build windows |
| |
| package archive |
| |
| import ( |
| "archive/tar" |
| "fmt" |
| "os" |
| "strings" |
| ) |
| |
| // canonicalTarNameForPath returns platform-specific filepath |
| // to canonical posix-style path for tar archival. p is relative |
| // path. |
| func CanonicalTarNameForPath(p string) (string, error) { |
| // windows: convert windows style relative path with backslashes |
| // into forward slashes. Since windows does not allow '/' or '\' |
| // in file names, it is mostly safe to replace however we must |
| // check just in case |
| if strings.Contains(p, "/") { |
| return "", fmt.Errorf("Windows path contains forward slash: %s", p) |
| } |
| return strings.Replace(p, string(os.PathSeparator), "/", -1), nil |
| |
| } |
| |
| // chmodTarEntry is used to adjust the file permissions used in tar header based |
| // on the platform the archival is done. |
| func chmodTarEntry(perm os.FileMode) os.FileMode { |
| perm &= 0755 |
| // Add the x bit: make everything +x from windows |
| perm |= 0111 |
| |
| return perm |
| } |
| |
| func setHeaderForSpecialDevice(hdr *tar.Header, ta *tarAppender, name string, stat interface{}) (nlink uint32, inode uint64, err error) { |
| // do nothing. no notion of Rdev, Inode, Nlink in stat on Windows |
| return |
| } |
| |
| // handleTarTypeBlockCharFifo is an OS-specific helper function used by |
| // createTarFile to handle the following types of header: Block; Char; Fifo |
| func handleTarTypeBlockCharFifo(hdr *tar.Header, path string) error { |
| return nil |
| } |
| |
| func handleLChmod(hdr *tar.Header, path string, hdrInfo os.FileInfo) error { |
| return nil |
| } |