@@ -104,80 +104,105 @@ func (i *Installer) listResources() error {
104
104
return nil
105
105
}
106
106
107
- // extractResources extracts the embedded resources into a the base directory.
107
+ // extractResources extracts the embedded resources into the base directory.
108
108
func (i * Installer ) extractResources () error {
109
109
tr := tar .NewReader (bytes .NewReader (installer .InstallerTarball ))
110
110
111
111
for {
112
112
header , err := tr .Next ()
113
- if err != nil {
114
- if err == io .EOF {
115
- break
116
- }
113
+ if err == io .EOF {
114
+ break
115
+ } else if err != nil {
117
116
return err
118
117
}
119
118
120
119
target := filepath .Join (i .extract , header .Name )
121
120
122
- // Creating the base directory if it does not exist.
123
- baseDir := filepath .Dir (target )
124
- if _ , err := os .Stat (baseDir ); os .IsNotExist (err ) {
125
- fmt .Printf ("- Creating base directory %q\n " , baseDir )
126
- if err := os .MkdirAll (baseDir , dirMode ); err != nil {
127
- return err
128
- }
121
+ err = i .extractResource (target , header , tr )
122
+ if err != nil {
123
+ return err
129
124
}
125
+ }
126
+ return nil
127
+ }
130
128
131
- switch header .Typeflag {
132
- case tar .TypeDir :
133
- fmt .Printf ("- Creating directory %q\n " , target )
134
- if err := os .MkdirAll (target , dirMode ); err != nil {
135
- return err
136
- }
137
- case tar .TypeReg :
138
- fmt .Printf ("- Extracting %q\n " , target )
139
- f , err := os .OpenFile (
140
- target ,
141
- os .O_CREATE | os .O_WRONLY | os .O_TRUNC ,
142
- os .FileMode (header .Mode ),
143
- )
144
- if err != nil {
145
- return err
146
- }
147
- defer f .Close ()
129
+ // extractResource extracts an embedded resource into the base directory.
130
+ func (i * Installer ) extractResource (target string , header * tar.Header , tr * tar.Reader ) error {
148
131
149
- if _ , err := io .Copy (f , tr ); err != nil {
150
- return err
151
- }
152
- case tar .TypeSymlink :
153
- // Checking for existing symlinks and removing them if they point to a
154
- // different target location.
155
- if existingTarget , err := os .Readlink (target ); err == nil {
156
- if existingTarget == header .Linkname {
157
- fmt .Printf (
158
- "- Symlink %q already exists and points to %q\n " ,
159
- target ,
160
- header .Linkname ,
161
- )
162
- continue
163
- } else {
164
- // Removing the existing symlink if it points to a different
165
- // target.
166
- if err := os .Remove (target ); err != nil {
167
- return err
168
- }
169
- }
170
- } else if ! os .IsNotExist (err ) {
171
- return err
172
- }
132
+ // Creating the base directory if it does not exist.
133
+ baseDir := filepath .Dir (target )
134
+ if _ , err := os .Stat (baseDir ); os .IsNotExist (err ) {
135
+ fmt .Printf ("- Creating base directory %q\n " , baseDir )
136
+ if err := os .MkdirAll (baseDir , dirMode ); err != nil {
137
+ return err
138
+ }
139
+ }
140
+
141
+ switch header .Typeflag {
142
+ case tar .TypeDir :
143
+ fmt .Printf ("- Creating directory %q\n " , target )
144
+ if err := os .MkdirAll (target , dirMode ); err != nil {
145
+ return err
146
+ }
147
+ case tar .TypeReg :
148
+ if err := i .extractFile (target , header , tr ); err != nil {
149
+ return err
150
+ }
151
+ case tar .TypeSymlink :
152
+ if err := i .extractSymlink (target , header ); err != nil {
153
+ return err
154
+ }
155
+ default :
156
+ log .Printf ("Unsupported type: %v in %s" , header .Typeflag , header .Name )
157
+ }
158
+ return nil
159
+ }
173
160
174
- fmt .Printf ("- Creating symlink %q -> %q\n " , target , header .Linkname )
175
- if err := os .Symlink (header .Linkname , target ); err != nil {
161
+ // extractFile extracts an embedded file into the base directory.
162
+ func (i * Installer ) extractFile (target string , header * tar.Header , tr * tar.Reader ) error {
163
+ fmt .Printf ("- Extracting %q\n " , target )
164
+ f , err := os .OpenFile (
165
+ target ,
166
+ os .O_CREATE | os .O_WRONLY | os .O_TRUNC ,
167
+ os .FileMode (header .Mode ),
168
+ )
169
+ if err != nil {
170
+ return err
171
+ }
172
+ defer f .Close ()
173
+
174
+ if _ , err := io .Copy (f , tr ); err != nil {
175
+ return err
176
+ }
177
+ return nil
178
+ }
179
+
180
+ // extractSymlink extracts an embedded symlink into the base directory.
181
+ func (i * Installer ) extractSymlink (target string , header * tar.Header ) error {
182
+ // Checking for existing symlinks and removing them if they point to a
183
+ // different target location.
184
+ if existingTarget , err := os .Readlink (target ); err == nil {
185
+ if existingTarget == header .Linkname {
186
+ fmt .Printf (
187
+ "- Symlink %q already exists and points to %q\n " ,
188
+ target ,
189
+ header .Linkname ,
190
+ )
191
+ return nil
192
+ } else {
193
+ // Removing the existing symlink if it points to a different
194
+ // target.
195
+ if err := os .Remove (target ); err != nil {
176
196
return err
177
197
}
178
- default :
179
- log .Printf ("Unsupported type: %v in %s" , header .Typeflag , header .Name )
180
198
}
199
+ } else if ! os .IsNotExist (err ) {
200
+ return err
201
+ }
202
+
203
+ fmt .Printf ("- Creating symlink %q -> %q\n " , target , header .Linkname )
204
+ if err := os .Symlink (header .Linkname , target ); err != nil {
205
+ return err
181
206
}
182
207
return nil
183
208
}
0 commit comments