(filePath string, unpackDir string, compression string)
| 86 | } |
| 87 | |
| 88 | func unTar(filePath string, unpackDir string, compression string) (fileList []file.FormFile, err error) { |
| 89 | // get file handle |
| 90 | openFile, err := os.Open(filePath) |
| 91 | if err != nil { |
| 92 | return |
| 93 | } |
| 94 | defer openFile.Close() |
| 95 | |
| 96 | // filter through compression if use |
| 97 | ucReader, ucErr := UncompressReader(compression, openFile) |
| 98 | if ucErr != nil { |
| 99 | return nil, ucErr |
| 100 | } |
| 101 | |
| 102 | // extract tarball |
| 103 | tarBallReader := tar.NewReader(ucReader) |
| 104 | for { |
| 105 | header, nerr := tarBallReader.Next() |
| 106 | if nerr != nil { |
| 107 | if nerr == io.EOF { |
| 108 | break |
| 109 | } |
| 110 | return nil, nerr |
| 111 | } |
| 112 | |
| 113 | // set names |
| 114 | path := filepath.Join(unpackDir, header.Name) |
| 115 | baseName := filepath.Base(header.Name) |
| 116 | // skip hidden |
| 117 | if strings.HasPrefix(baseName, ".") { |
| 118 | continue |
| 119 | } |
| 120 | |
| 121 | // only handle real files and dirs, ignore links |
| 122 | switch header.Typeflag { |
| 123 | // handle regualar file |
| 124 | case tar.TypeReg: |
| 125 | // open output file |
| 126 | var writer *os.File |
| 127 | if writer, err = os.Create(path); err != nil { |
| 128 | return |
| 129 | } |
| 130 | // get md5 |
| 131 | md5h := md5.New() |
| 132 | dst := io.MultiWriter(writer, md5h) |
| 133 | // write it |
| 134 | _, err = io.Copy(dst, tarBallReader) |
| 135 | writer.Close() |
| 136 | if err != nil { |
| 137 | return |
| 138 | } |
| 139 | // add to filelist |
| 140 | ffile := file.FormFile{Name: baseName, Path: path, Checksum: make(map[string]string)} |
| 141 | ffile.Checksum["md5"] = fmt.Sprintf("%x", md5h.Sum(nil)) |
| 142 | fileList = append(fileList, ffile) |
| 143 | case tar.TypeDir: |
| 144 | // handle directory |
| 145 | if merr := os.MkdirAll(path, 0777); merr != nil { |
no test coverage detected