]>
Commit | Line | Data |
---|---|---|
15c0b25d AP |
1 | package getter |
2 | ||
3 | import ( | |
4 | "fmt" | |
5 | "io" | |
6 | "os" | |
7 | "path/filepath" | |
8 | ||
9 | "github.com/ulikunitz/xz" | |
10 | ) | |
11 | ||
12 | // XzDecompressor is an implementation of Decompressor that can | |
13 | // decompress xz files. | |
14 | type XzDecompressor struct{} | |
15 | ||
16 | func (d *XzDecompressor) Decompress(dst, src string, dir bool) error { | |
17 | // Directory isn't supported at all | |
18 | if dir { | |
19 | return fmt.Errorf("xz-compressed files can only unarchive to a single file") | |
20 | } | |
21 | ||
22 | // If we're going into a directory we should make that first | |
23 | if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { | |
24 | return err | |
25 | } | |
26 | ||
27 | // File first | |
28 | f, err := os.Open(src) | |
29 | if err != nil { | |
30 | return err | |
31 | } | |
32 | defer f.Close() | |
33 | ||
34 | // xz compression is second | |
35 | xzR, err := xz.NewReader(f) | |
36 | if err != nil { | |
37 | return err | |
38 | } | |
39 | ||
40 | // Copy it out | |
41 | dstF, err := os.Create(dst) | |
42 | if err != nil { | |
43 | return err | |
44 | } | |
45 | defer dstF.Close() | |
46 | ||
47 | _, err = io.Copy(dstF, xzR) | |
48 | return err | |
49 | } |