1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
   |  func Extract(buffer io.Reader, targetDir string) error { 	uncompressedStream, err := gzip.NewReader(buffer) 	if err != nil { 		return err 	}
  	if err := os.MkdirAll(targetDir, 0755); err != nil { 		return err 	}
  	tarReader := tar.NewReader(uncompressedStream) 	for { 		header, err := tarReader.Next() 		if err == io.EOF { 			break 		} 		if err != nil { 			return err 		}
  		path, err := cleanJoin(targetDir, header.Name) 		if err != nil { 			return err 		}
  		switch header.Typeflag { 		case tar.TypeDir: 			if err := os.Mkdir(path, 0755); err != nil { 				return err 			} 		case tar.TypeReg: 			outFile, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) 			if err != nil { 				return err 			} 			if _, err := io.Copy(outFile, tarReader); err != nil { 				outFile.Close() 				return err 			} 			outFile.Close() 		 		case tar.TypeXGlobalHeader, tar.TypeXHeader: 			continue 		default: 			return errors.Errorf("unknown type: %b in %s", header.Typeflag, header.Name) 		} 	} 	return nil }
 
  |