MCPcopy Create free account
hub / github.com/MG-RAST/Shock / unTar

Function unTar

shock-server/node/archive/archive.go:88–152  ·  view source on GitHub ↗
(filePath string, unpackDir string, compression string)

Source from the content-addressed store, hash-verified

86}
87
88func 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 {

Callers 1

FilesFromArchiveFunction · 0.85

Calls 4

UncompressReaderFunction · 0.85
CloseMethod · 0.65
CreateMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected