|
@@ -1,11 +1,11 @@
|
|
|
package util
|
|
|
|
|
|
import (
|
|
|
- "archive/zip"
|
|
|
"fmt"
|
|
|
"io"
|
|
|
"io/fs"
|
|
|
"os"
|
|
|
+ "os/exec"
|
|
|
"path/filepath"
|
|
|
"sort"
|
|
|
"strings"
|
|
@@ -13,73 +13,22 @@ import (
|
|
|
|
|
|
|
|
|
func ZipDir(src, dest, excludeDir string) error {
|
|
|
-
|
|
|
- zipf, err := os.Create(dest)
|
|
|
+
|
|
|
+ relExcludeDir, err := filepath.Rel(src, excludeDir)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- defer zipf.Close()
|
|
|
|
|
|
-
|
|
|
- archive := zip.NewWriter(zipf)
|
|
|
- defer archive.Close()
|
|
|
+
|
|
|
+ cmd := exec.Command("zip", "-r", dest, ".", "-x", filepath.Join(relExcludeDir, "*"))
|
|
|
|
|
|
-
|
|
|
- err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- relPath, err := filepath.Rel(src, path)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if strings.HasPrefix(relPath, excludeDir) {
|
|
|
- if info.IsDir() {
|
|
|
- return filepath.SkipDir
|
|
|
- }
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- header, err := zip.FileInfoHeader(info)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- header.Name = relPath
|
|
|
-
|
|
|
- if info.IsDir() {
|
|
|
- header.Name += "/"
|
|
|
- } else {
|
|
|
- header.Method = zip.Deflate
|
|
|
- }
|
|
|
-
|
|
|
- writer, err := archive.CreateHeader(header)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- if !info.IsDir() {
|
|
|
- file, err := os.Open(path)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- defer file.Close()
|
|
|
-
|
|
|
- _, err = io.Copy(writer, file)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return nil
|
|
|
- })
|
|
|
+
|
|
|
+ cmd.Dir = src
|
|
|
|
|
|
+
|
|
|
+ output, err := cmd.CombinedOutput()
|
|
|
if err != nil {
|
|
|
- return err
|
|
|
+ return fmt.Errorf("zip command failed: %v, output: %s", err, string(output))
|
|
|
}
|
|
|
|
|
|
return nil
|