123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package updates
- import (
- "archive/tar"
- "compress/gzip"
- "errors"
- "io"
- "net/http"
- "os"
- "path/filepath"
- "strconv"
- )
- func getFileSize(filename string) int64 {
- fi, err := os.Stat(filename)
- if err != nil {
- return -1
- }
- // get the size
- return fi.Size()
- }
- func getDownloadFileSize(url string) (int, error) {
- headResp, err := http.Head(url)
- if err != nil {
- return -1, err
- }
- defer headResp.Body.Close()
- return strconv.Atoi(headResp.Header.Get("Content-Length"))
- }
- func downloadFile(url string, dest string) error {
- out, err := os.Create(dest)
- if err != nil {
- return err
- }
- defer out.Close()
- if err != nil {
- return err
- }
- resp, err := http.Get(url)
- if err != nil {
- return err
- }
- defer resp.Body.Close()
- _, err = io.Copy(out, resp.Body)
- if err != nil {
- return err
- }
- return nil
- }
- func extractTarGz(gzipStream io.Reader, unzipPath string, progressUpdateFunction func(int, float64, string)) error {
- uncompressedStream, err := gzip.NewReader(gzipStream)
- if err != nil {
- return err
- }
- tarReader := tar.NewReader(uncompressedStream)
- for {
- header, err := tarReader.Next()
- if err == io.EOF {
- break
- }
- if err != nil {
- return err
- }
- switch header.Typeflag {
- case tar.TypeDir:
- if err := os.Mkdir(filepath.Join(unzipPath, header.Name), 0755); err != nil {
- return err
- }
- case tar.TypeReg:
- progressUpdateFunction(2, 100, "Extracting: "+header.Name)
- outFile, err := os.Create(filepath.Join(unzipPath, header.Name))
- if err != nil {
- return err
- }
- if _, err := io.Copy(outFile, tarReader); err != nil {
- return err
- }
- outFile.Close()
- default:
- return errors.New("Unable to decode .tar.gz")
- }
- }
- return nil
- }
|