mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-14 18:30:02 +08:00
(goctl)fix file copy permission missed (#5475)
This commit is contained in:
@@ -64,6 +64,15 @@ func fileCopy(file *zip.File, destPath string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer w.Close()
|
defer w.Close()
|
||||||
|
|
||||||
_, err = io.Copy(w, rc)
|
_, err = io.Copy(w, rc)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if file.Mode().IsRegular() && file.Mode()&0111 != 0 {
|
||||||
|
return w.Chmod(file.Mode())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
118
tools/goctl/util/zipx/zipx_test.go
Normal file
118
tools/goctl/util/zipx/zipx_test.go
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
package zipx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/zip"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func createTestZip(t *testing.T, files map[string]struct {
|
||||||
|
content string
|
||||||
|
mode os.FileMode
|
||||||
|
}) string {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
zipPath := filepath.Join(t.TempDir(), "test.zip")
|
||||||
|
f, err := os.Create(zipPath)
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
w := zip.NewWriter(f)
|
||||||
|
defer w.Close()
|
||||||
|
|
||||||
|
for name, file := range files {
|
||||||
|
header := &zip.FileHeader{
|
||||||
|
Name: name,
|
||||||
|
Method: zip.Deflate,
|
||||||
|
}
|
||||||
|
header.SetMode(file.mode)
|
||||||
|
writer, err := w.CreateHeader(header)
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = writer.Write([]byte(file.content))
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return zipPath
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnpacking(t *testing.T) {
|
||||||
|
dest := t.TempDir()
|
||||||
|
zipPath := createTestZip(t, map[string]struct {
|
||||||
|
content string
|
||||||
|
mode os.FileMode
|
||||||
|
}{
|
||||||
|
"hello.txt": {content: "hello world", mode: 0644},
|
||||||
|
"skip.txt": {content: "should be skipped", mode: 0644},
|
||||||
|
})
|
||||||
|
|
||||||
|
err := Unpacking(zipPath, dest, func(f *zip.File) bool {
|
||||||
|
return f.Name == "hello.txt"
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
content, err := os.ReadFile(filepath.Join(dest, "hello.txt"))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "hello world", string(content))
|
||||||
|
|
||||||
|
_, err = os.Stat(filepath.Join(dest, "skip.txt"))
|
||||||
|
assert.True(t, os.IsNotExist(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnpackingPreservesExecutablePermission(t *testing.T) {
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
t.Skip("file permissions not applicable on Windows")
|
||||||
|
}
|
||||||
|
|
||||||
|
dest := t.TempDir()
|
||||||
|
zipPath := createTestZip(t, map[string]struct {
|
||||||
|
content string
|
||||||
|
mode os.FileMode
|
||||||
|
}{
|
||||||
|
"bin/mybinary": {content: "binary content", mode: 0755},
|
||||||
|
"readme.txt": {content: "readme", mode: 0644},
|
||||||
|
})
|
||||||
|
|
||||||
|
err := Unpacking(zipPath, dest, func(f *zip.File) bool {
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
info, err := os.Stat(filepath.Join(dest, "mybinary"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.NotZero(t, info.Mode()&0111, "executable bit should be set")
|
||||||
|
|
||||||
|
info, err = os.Stat(filepath.Join(dest, "readme.txt"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Zero(t, info.Mode()&0111, "executable bit should not be set for regular files")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnpackingInvalidZip(t *testing.T) {
|
||||||
|
err := Unpacking("/nonexistent/path.zip", t.TempDir(), func(f *zip.File) bool {
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestUnpackingAllFilesFiltered(t *testing.T) {
|
||||||
|
dest := t.TempDir()
|
||||||
|
zipPath := createTestZip(t, map[string]struct {
|
||||||
|
content string
|
||||||
|
mode os.FileMode
|
||||||
|
}{
|
||||||
|
"a.txt": {content: "a", mode: 0644},
|
||||||
|
})
|
||||||
|
|
||||||
|
err := Unpacking(zipPath, dest, func(f *zip.File) bool {
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
entries, err := os.ReadDir(dest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Empty(t, entries)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user