|
1 | 1 | package installer |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "archive/tar" |
5 | | - "compress/gzip" |
6 | | - "errors" |
7 | 4 | "fmt" |
8 | 5 | "github.com/linuxsuren/http-downloader/pkg/common" |
| 6 | + "github.com/linuxsuren/http-downloader/pkg/compress" |
9 | 7 | "github.com/linuxsuren/http-downloader/pkg/exec" |
10 | 8 | "io" |
11 | 9 | "os" |
12 | 10 | "path" |
13 | 11 | "path/filepath" |
14 | 12 | "runtime" |
15 | | - "strings" |
16 | 13 | ) |
17 | 14 |
|
18 | 15 | // Install installs a package |
@@ -116,71 +113,8 @@ func (o *Installer) OverWriteBinary(sourceFile, targetPath string) (err error) { |
116 | 113 | } |
117 | 114 |
|
118 | 115 | func (o *Installer) extractFiles(tarFile, targetName string) (err error) { |
119 | | - if targetName == "" { |
120 | | - err = errors.New("target filename is empty") |
121 | | - return |
122 | | - } |
123 | | - |
124 | | - var f *os.File |
125 | | - var gzf *gzip.Reader |
126 | | - if f, err = os.Open(tarFile); err != nil { |
127 | | - return |
128 | | - } |
129 | | - defer func() { |
130 | | - _ = f.Close() |
131 | | - }() |
132 | | - |
133 | | - if gzf, err = gzip.NewReader(f); err != nil { |
134 | | - return |
135 | | - } |
136 | | - |
137 | | - tarReader := tar.NewReader(gzf) |
138 | | - var header *tar.Header |
139 | | - var found bool |
140 | | - for { |
141 | | - if header, err = tarReader.Next(); err == io.EOF { |
142 | | - err = nil |
143 | | - break |
144 | | - } else if err != nil { |
145 | | - break |
146 | | - } |
147 | | - name := header.Name |
148 | | - |
149 | | - switch header.Typeflag { |
150 | | - case tar.TypeReg: |
151 | | - if err = extraFile(name, targetName, tarFile, header, tarReader); err == nil { |
152 | | - found = true |
153 | | - } else { |
154 | | - break |
155 | | - } |
156 | | - |
157 | | - for i := range o.AdditionBinaries { |
158 | | - addition := o.AdditionBinaries[i] |
159 | | - if err = extraFile(addition, addition, tarFile, header, tarReader); err != nil { |
160 | | - return |
161 | | - } |
162 | | - } |
163 | | - } |
164 | | - } |
165 | | - |
166 | | - if err == nil && !found { |
167 | | - err = fmt.Errorf("cannot found item '%s' from '%s'", targetName, tarFile) |
168 | | - } |
169 | | - return |
170 | | -} |
171 | | - |
172 | | -func extraFile(name, targetName, tarFile string, header *tar.Header, tarReader *tar.Reader) (err error) { |
173 | | - if name != targetName && !strings.HasSuffix(name, "/"+targetName) { |
174 | | - return |
175 | | - } |
176 | | - var targetFile *os.File |
177 | | - if targetFile, err = os.OpenFile(fmt.Sprintf("%s/%s", filepath.Dir(tarFile), targetName), |
178 | | - os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)); err != nil { |
179 | | - return |
180 | | - } |
181 | | - if _, err = io.Copy(targetFile, tarReader); err != nil { |
182 | | - return |
183 | | - } |
184 | | - _ = targetFile.Close() |
| 116 | + // TODO choose a correct compress instance |
| 117 | + compressor := compress.NewGZip(o.AdditionBinaries) |
| 118 | + err = compressor.ExtractFiles(tarFile, targetName) |
185 | 119 | return |
186 | 120 | } |
0 commit comments