+ closer = src
+ return
+ }
+
+ if !mode.IsDir() {
+ rerr = errors.New("unsupported file type")
+ return
+ }
+
+ // It is directory, create PAX archive with its contents
+ archived = true
+ basePath := filepath.Base(srcPath)
+ rootPath, err := filepath.Abs(srcPath)
+ if err != nil {
+ rerr = err
+ return
+ }
+ type einfo struct {
+ path string
+ modTime time.Time
+ size int64
+ }
+ dirs := make([]einfo, 0, 1<<10)
+ files := make([]einfo, 0, 1<<10)
+ rerr = filepath.Walk(rootPath, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if info.IsDir() {
+ // directory header, PAX record header+contents
+ fileSize += TarBlockSize + 2*TarBlockSize
+ dirs = append(dirs, einfo{path: path, modTime: info.ModTime()})
+ } else {
+ // file header, PAX record header+contents, file content
+ fileSize += TarBlockSize + 2*TarBlockSize + info.Size()
+ if n := info.Size() % TarBlockSize; n != 0 {
+ fileSize += TarBlockSize - n // padding
+ }
+ files = append(files, einfo{
+ path: path,
+ modTime: info.ModTime(),
+ size: info.Size(),
+ })
+ }
+ return nil
+ })
+ if rerr != nil {
+ return