@@ -73,24 +73,23 @@ func readData(name string) (buffer []byte, err error) {
7373
7474func ExtractZip (path , artifactPath string ) error {
7575 zipReader , err := zip .OpenReader (artifactPath )
76+ if err != nil {
77+ return ErrExtractZip (err , path )
78+ }
7679 defer func () {
7780 _ = zipReader .Close ()
7881 }()
7982
80- if err != nil {
81- return ErrExtractZip (err , path )
82- }
8383 buffer := make ([]byte , 1 << 4 )
8484 for _ , file := range zipReader .File {
8585
8686 fd , err := file .Open ()
87- defer func () {
88- _ = fd .Close ()
89- }()
90-
9187 if err != nil {
9288 return ErrExtractZip (err , path )
9389 }
90+ defer func () {
91+ _ = fd .Close ()
92+ }()
9493
9594 filePath := filepath .Join (path , file .Name )
9695
@@ -106,31 +105,30 @@ func ExtractZip(path, artifactPath string) error {
106105 }
107106 _ , err = io .CopyBuffer (openedFile , fd , buffer )
108107 if err != nil {
108+ // We need to close the file, but the error from CopyBuffer is more important.
109+ _ = openedFile .Close ()
110+ return ErrExtractZip (err , path )
111+ }
112+ if err := openedFile .Close (); err != nil {
109113 return ErrExtractZip (err , path )
110114 }
111- defer func () {
112- _ = openedFile .Close ()
113- }()
114115 }
115-
116116 }
117117 return nil
118-
119118}
120119
121120func ExtractTarGz (path , downloadfilePath string ) error {
122121 gzipStream , err := os .Open (downloadfilePath )
123122 if err != nil {
124123 return ErrReadFile (err , downloadfilePath )
125124 }
125+ defer gzipStream .Close ()
126+
126127 uncompressedStream , err := gzip .NewReader (gzipStream )
127128 if err != nil {
128129 return ErrExtractTarXZ (err , path )
129130 }
130- defer func () {
131- _ = uncompressedStream .Close ()
132- _ = gzipStream .Close ()
133- }()
131+ defer uncompressedStream .Close ()
134132
135133 tarReader := tar .NewReader (uncompressedStream )
136134
@@ -158,23 +156,35 @@ func ExtractTarGz(path, downloadfilePath string) error {
158156 return ErrExtractTarXZ (err , path )
159157 }
160158 if _ , err = io .Copy (outFile , tarReader ); err != nil {
161- outFile .Close ()
159+ // The subsequent Close() call will handle closing the file.
160+ // Return the more critical I/O error immediately.
161+ _ = outFile .Close () // Attempt to close, but ignore error as we are returning the copy error.
162162 return ErrExtractTarXZ (err , path )
163163 }
164164
165165 // Close the file and check for errors
166166 if err := outFile .Close (); err != nil {
167- return fmt . Errorf ( "failed to close output file %s: %w" , header .Name , err )
167+ return ErrFileClose ( err , header .Name )
168168 }
169169
170170 default :
171- return ErrExtractTarXZ ( err , path )
171+ return ErrUnsupportedTarHeaderType ( header . Typeflag , header . Name )
172172 }
173173 }
174174
175175 return nil
176176}
177177
178+ // ErrFileClose creates a standardized error for file closing failures.
179+ func ErrFileClose (err error , filename string ) error {
180+ return fmt .Errorf ("failed to close file %s: %w" , filename , err )
181+ }
182+
183+ // ErrUnsupportedTarHeaderType creates an error for unsupported tar header types.
184+ func ErrUnsupportedTarHeaderType (typeflag byte , name string ) error {
185+ return fmt .Errorf ("unsupported tar header type %v for file %s" , typeflag , name )
186+ }
187+
178188func ProcessContent (filePath string , f func (path string ) error ) error {
179189 pathInfo , err := os .Stat (filePath )
180190 if err != nil {
0 commit comments