93 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package tar
 | |
| 
 | |
| import (
 | |
| 	"archive/tar"
 | |
| 	"bytes"
 | |
| 	"compress/gzip"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| func Compress(source, dest string) error {
 | |
| 	// tar + gzip
 | |
| 	var buf bytes.Buffer
 | |
| 	_ = compress(source, &buf)
 | |
| 
 | |
| 	// write the .tar.gzip
 | |
| 	fileToWrite, err := os.OpenFile(dest, os.O_CREATE|os.O_RDWR, 0666)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err = io.Copy(fileToWrite, &buf)
 | |
| 	return err
 | |
| }
 | |
| 
 | |
| func compress(src string, buf io.Writer) error {
 | |
| 	// tar > gzip > buf
 | |
| 	zr := gzip.NewWriter(buf)
 | |
| 	tw := tar.NewWriter(zr)
 | |
| 
 | |
| 	// walk through every file in the folder
 | |
| 	filepath.Walk(src, func(file string, fi os.FileInfo, err error) error {
 | |
| 
 | |
| 		// generate tar header
 | |
| 		header, err := tar.FileInfoHeader(fi, file)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		// must provide real name
 | |
| 		// (see https://golang.org/src/archive/tar/common.go?#L626)
 | |
| 
 | |
| 		srcWithSlash := src
 | |
| 		if !strings.HasSuffix(src, string(filepath.Separator)) {
 | |
| 			srcWithSlash = src + string(filepath.Separator)
 | |
| 		}
 | |
| 		header.Name = strings.ReplaceAll(file, srcWithSlash, "")
 | |
| 		if header.Name == src || len(strings.TrimSpace(header.Name)) == 0 {
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		// @todo This is a quick hack to speed up whole repo uploads
 | |
| 		// https://github.com/micro/micro/pull/956
 | |
| 		if !fi.IsDir() && !strings.HasSuffix(header.Name, ".go") &&
 | |
| 			!strings.HasSuffix(header.Name, ".mod") &&
 | |
| 			!strings.HasSuffix(header.Name, ".sum") {
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		// write header
 | |
| 		if err := tw.WriteHeader(header); err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		if fi.IsDir() {
 | |
| 			return nil
 | |
| 		}
 | |
| 
 | |
| 		// if not a dir, write file content
 | |
| 
 | |
| 		data, err := os.Open(file)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		if _, err := io.Copy(tw, data); err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		return nil
 | |
| 	})
 | |
| 
 | |
| 	// produce tar
 | |
| 	if err := tw.Close(); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	// produce gzip
 | |
| 	if err := zr.Close(); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	//
 | |
| 	return nil
 | |
| }
 |