0
0
Fork 0
mirror of https://github.com/schollz/croc.git synced 2025-10-11 21:30:16 +02:00

zip without chdir

This commit is contained in:
Zack Scholl 2018-10-09 16:40:03 -07:00
parent 9335aca877
commit 71ba80cee0
2 changed files with 39 additions and 35 deletions

View file

@ -5,6 +5,7 @@ import (
"compress/flate" "compress/flate"
"io" "io"
"os" "os"
"path"
"path/filepath" "path/filepath"
"strings" "strings"
@ -79,36 +80,27 @@ func UnzipFile(src, dest string) (err error) {
// ZipFile will zip the folder // ZipFile will zip the folder
func ZipFile(fname string, compress bool) (writtenFilename string, err error) { func ZipFile(fname string, compress bool) (writtenFilename string, err error) {
logger.SetLogLevel(DebugLevel) logger.SetLogLevel(DebugLevel)
log.Debugf("zipping %s with compression? %v", fname, compress)
// get absolute filename
fname, err = filepath.Abs(fname) fname, err = filepath.Abs(fname)
if err != nil {
return
}
log.Debugf("zipping %s with compression? %v", fname, compress)
pathtofile, filename := filepath.Split(fname)
curdir, err := os.Getwd()
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
} }
curdir, err = filepath.Abs(curdir)
if err != nil {
log.Error(err)
return
}
log.Debugf("current directory: %s", curdir)
newfile, err := os.Create(fname + ".croc.zip")
if err != nil {
log.Error(err)
return
}
_, writtenFilename = filepath.Split(newfile.Name())
defer newfile.Close()
defer os.Chdir(curdir) // get path to file and the filename
log.Debugf("changing dir to %s", pathtofile) fpath, fname := filepath.Split(fname)
os.Chdir(pathtofile)
zipWriter := zip.NewWriter(newfile) writtenFilename = fname + ".croc.zip"
log.Debugf("creating file: %s", writtenFilename)
f, err := os.Create(writtenFilename)
if err != nil {
log.Error(err)
return
}
zipWriter := zip.NewWriter(f)
zipWriter.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) { zipWriter.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) {
if compress { if compress {
return flate.NewWriter(out, flate.BestSpeed) return flate.NewWriter(out, flate.BestSpeed)
@ -118,14 +110,15 @@ func ZipFile(fname string, compress bool) (writtenFilename string, err error) {
}) })
defer zipWriter.Close() defer zipWriter.Close()
zipfile, err := os.Open(filename) // Get the file information for the target
log.Debugf("checking %s", path.Join(fpath, fname))
ftarget, err := os.Open(path.Join(fpath, fname))
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return "", err return
} }
defer zipfile.Close() defer ftarget.Close()
// Get the file information info, err := ftarget.Stat()
info, err := zipfile.Stat()
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return
@ -140,20 +133,24 @@ func ZipFile(fname string, compress bool) (writtenFilename string, err error) {
var writer io.Writer var writer io.Writer
if info.IsDir() { if info.IsDir() {
baseDir := filename baseDir := path.Join(fpath, fname)
filepath.Walk(baseDir, func(path string, info os.FileInfo, err error) error { log.Debugf("walking base dir: %s", baseDir)
filepath.Walk(baseDir, func(curpath string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
log.Error(err)
return err return err
} }
header, err := zip.FileInfoHeader(info) header, err := zip.FileInfoHeader(info)
if err != nil { if err != nil {
log.Error(err)
return err return err
} }
if baseDir != "" { if baseDir != "" {
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, baseDir)) header.Name = path.Join(fname, strings.TrimPrefix(curpath, baseDir))
} }
log.Debug(header.Name)
if info.IsDir() { if info.IsDir() {
header.Name += "/" header.Name += "/"
@ -172,8 +169,9 @@ func ZipFile(fname string, compress bool) (writtenFilename string, err error) {
return nil return nil
} }
file, err := os.Open(path) file, err := os.Open(curpath)
if err != nil { if err != nil {
log.Error(err)
return err return err
} }
defer file.Close() defer file.Close()
@ -186,7 +184,7 @@ func ZipFile(fname string, compress bool) (writtenFilename string, err error) {
log.Error(err) log.Error(err)
return return
} }
_, err = io.Copy(writer, zipfile) _, err = io.Copy(writer, ftarget)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
return return

View file

@ -12,12 +12,18 @@ import (
func TestZip(t *testing.T) { func TestZip(t *testing.T) {
defer log.Flush() defer log.Flush()
DebugLevel = "debug" DebugLevel = "debug"
writtenFilename, err := ZipFile("../../README.md", false) writtenFilename, err := ZipFile("../croc", true)
assert.Nil(t, err) assert.Nil(t, err)
defer os.Remove(writtenFilename) defer os.Remove(writtenFilename)
err = UnzipFile(writtenFilename, ".")
assert.Nil(t, err)
assert.True(t, utils.Exists("croc"))
writtenFilename, err = ZipFile("../../README.md", false)
assert.Nil(t, err)
defer os.Remove(writtenFilename)
err = UnzipFile(writtenFilename, ".") err = UnzipFile(writtenFilename, ".")
assert.Nil(t, err) assert.Nil(t, err)
assert.True(t, utils.Exists("README.md")) assert.True(t, utils.Exists("README.md"))
os.RemoveAll("README.md")
} }