From 782491164d4ce243571c8d35755edf3aae6b8e48 Mon Sep 17 00:00:00 2001 From: iotanbo Date: Tue, 19 Oct 2021 10:28:41 +0300 Subject: [PATCH] Fix issue #222 --- archiver.go | 3 +++ tar.go | 9 +++++++-- zip.go | 11 ++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/archiver.go b/archiver.go index b09699d6..dc549fc5 100644 --- a/archiver.go +++ b/archiver.go @@ -125,6 +125,9 @@ type File struct { type FileInfo struct { os.FileInfo CustomName string + // Stores path to the source. + // Used when reading a symlink. + SrcPath string } // Name returns fi.CustomName if not empty; diff --git a/tar.go b/tar.go index b672a71e..d68616d3 100644 --- a/tar.go +++ b/tar.go @@ -327,6 +327,7 @@ func (t *Tar) writeWalk(source, topLevelFolder, destination string) error { FileInfo: FileInfo{ FileInfo: info, CustomName: nameInArchive, + SrcPath: fpath, }, ReadCloser: file, }) @@ -372,10 +373,14 @@ func (t *Tar) Write(f File) error { var linkTarget string if isSymlink(f) { + fi, ok := f.FileInfo.(FileInfo) + if !ok { + return fmt.Errorf("failed to cast fs.FileInfo to archiver.FileInfo: %v", f) + } var err error - linkTarget, err = os.Readlink(f.Name()) + linkTarget, err = os.Readlink(fi.SrcPath) if err != nil { - return fmt.Errorf("%s: readlink: %v", f.Name(), err) + return fmt.Errorf("%s: readlink: %v", fi.SrcPath, err) } } diff --git a/zip.go b/zip.go index 07fcc756..31ee38d3 100644 --- a/zip.go +++ b/zip.go @@ -350,6 +350,7 @@ func (z *Zip) writeWalk(source, topLevelFolder, destination string) error { FileInfo: FileInfo{ FileInfo: info, CustomName: nameInArchive, + SrcPath: fpath, }, ReadCloser: file, }) @@ -431,14 +432,18 @@ func (z *Zip) writeFile(f File, writer io.Writer) error { return nil // directories have no contents } if isSymlink(f) { + fi, ok := f.FileInfo.(FileInfo) + if !ok { + return fmt.Errorf("failed to cast fs.FileInfo to archiver.FileInfo: %v", f) + } // file body for symlinks is the symlink target - linkTarget, err := os.Readlink(f.Name()) + linkTarget, err := os.Readlink(fi.SrcPath) if err != nil { - return fmt.Errorf("%s: readlink: %v", f.Name(), err) + return fmt.Errorf("%s: readlink: %v", fi.SrcPath, err) } _, err = writer.Write([]byte(filepath.ToSlash(linkTarget))) if err != nil { - return fmt.Errorf("%s: writing symlink target: %v", f.Name(), err) + return fmt.Errorf("%s: writing symlink target: %v", fi.SrcPath, err) } return nil }