32
32
)
33
33
34
34
// DecompressCommand decompresses the given source. Archive and compression format is
35
- // automatically detected from 'url' parameter, which represents the URL of asset.
35
+ // automatically detected from 'url' parameter, which represents the URL of asset,
36
+ // or simply a filename (with an extension).
36
37
// This returns a reader for the decompressed command given by 'cmd'. '.zip',
37
38
// '.tar.gz', '.tar.xz', '.tgz', '.gz', '.bz2' and '.xz' are supported.
39
+ //
40
+ // These wrapped errors can be returned:
41
+ // - ErrCannotDecompressFile
42
+ // - ErrExecutableNotFoundInArchive
43
+ // - ErrCannotReadStream
38
44
func DecompressCommand (src io.Reader , url , cmd , os , arch string ) (io.Reader , error ) {
39
45
for _ , fileType := range fileTypes {
40
46
if strings .HasSuffix (url , fileType .ext ) {
@@ -52,13 +58,13 @@ func unzip(src io.Reader, cmd, os, arch string) (io.Reader, error) {
52
58
// So we need to read the HTTP response into a buffer at first.
53
59
buf , err := ioutil .ReadAll (src )
54
60
if err != nil {
55
- return nil , fmt .Errorf ("failed to create buffer for zip file: %s" , err )
61
+ return nil , fmt .Errorf ("%w for zip file: %v" , ErrCannotReadStream , err )
56
62
}
57
63
58
64
r := bytes .NewReader (buf )
59
65
z , err := zip .NewReader (r , r .Size ())
60
66
if err != nil {
61
- return nil , fmt .Errorf ("failed to decompress zip file: %s" , err )
67
+ return nil , fmt .Errorf ("%w zip file: %s" , ErrCannotDecompressFile , err )
62
68
}
63
69
64
70
for _ , file := range z .File {
@@ -69,15 +75,15 @@ func unzip(src io.Reader, cmd, os, arch string) (io.Reader, error) {
69
75
}
70
76
}
71
77
72
- return nil , fmt .Errorf ("file %q is not found" , cmd )
78
+ return nil , fmt .Errorf ("%w in zip file: %q" , ErrExecutableNotFoundInArchive , cmd )
73
79
}
74
80
75
81
func untar (src io.Reader , cmd , os , arch string ) (io.Reader , error ) {
76
82
log .Print ("Decompressing tar.gz file" )
77
83
78
84
gz , err := gzip .NewReader (src )
79
85
if err != nil {
80
- return nil , fmt .Errorf ("failed to decompress . tar.gz file: %s" , err )
86
+ return nil , fmt .Errorf ("%w tar.gz file: %s" , ErrCannotDecompressFile , err )
81
87
}
82
88
83
89
return unarchiveTar (gz , cmd , os , arch )
@@ -88,12 +94,12 @@ func gunzip(src io.Reader, cmd, os, arch string) (io.Reader, error) {
88
94
89
95
r , err := gzip .NewReader (src )
90
96
if err != nil {
91
- return nil , fmt .Errorf ("failed to decompress gzip file: %s" , err )
97
+ return nil , fmt .Errorf ("%w gzip file: %s" , ErrCannotDecompressFile , err )
92
98
}
93
99
94
100
name := r .Header .Name
95
101
if ! matchExecutableName (cmd , os , arch , name ) {
96
- return nil , fmt .Errorf ("file name '%s' does not match to command '%s' found " , name , cmd )
102
+ return nil , fmt .Errorf ("%w: expected %q but found %q " , ErrExecutableNotFoundInArchive , cmd , name )
97
103
}
98
104
99
105
log .Printf ("Executable file %q was found in gzip file" , name )
@@ -105,7 +111,7 @@ func untarxz(src io.Reader, cmd, os, arch string) (io.Reader, error) {
105
111
106
112
xzip , err := xz .NewReader (src )
107
113
if err != nil {
108
- return nil , fmt .Errorf ("failed to decompress .tar.xz file: %s" , err )
114
+ return nil , fmt .Errorf ("%w .tar.xz file: %s" , ErrCannotDecompressFile , err )
109
115
}
110
116
111
117
return unarchiveTar (xzip , cmd , os , arch )
@@ -116,7 +122,7 @@ func unxz(src io.Reader, cmd, os, arch string) (io.Reader, error) {
116
122
117
123
xzip , err := xz .NewReader (src )
118
124
if err != nil {
119
- return nil , fmt .Errorf ("failed to decompress xzip file: %s" , err )
125
+ return nil , fmt .Errorf ("%w xzip file: %s" , ErrCannotDecompressFile , err )
120
126
}
121
127
122
128
log .Printf ("Decompressed file from xzip is assumed to be an executable: %s" , cmd )
@@ -160,13 +166,13 @@ func unarchiveTar(src io.Reader, cmd, os, arch string) (io.Reader, error) {
160
166
break
161
167
}
162
168
if err != nil {
163
- return nil , fmt .Errorf ("failed to unarchive tar file: %s" , err )
169
+ return nil , fmt .Errorf ("%w tar file: %s" , ErrCannotDecompressFile , err )
164
170
}
165
171
_ , name := filepath .Split (h .Name )
166
172
if matchExecutableName (cmd , os , arch , name ) {
167
173
log .Printf ("Executable file %q was found in tar archive" , h .Name )
168
174
return t , nil
169
175
}
170
176
}
171
- return nil , fmt .Errorf ("file %q is not found in tar" , cmd )
177
+ return nil , fmt .Errorf ("%w in tar: %q" , ErrExecutableNotFoundInArchive , cmd )
172
178
}
0 commit comments