From cebb4031b33feb03233bbf9187d52f0c76277f91 Mon Sep 17 00:00:00 2001 From: priyawadhwa Date: Sat, 14 Apr 2018 08:00:20 -0700 Subject: [PATCH] copy symlinks (#90) --- pkg/commands/copy.go | 13 ++++++++++++- pkg/snapshot/snapshot.go | 2 +- pkg/util/command_util.go | 4 ++-- pkg/util/fs_util.go | 4 ++-- pkg/util/tar_util.go | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/pkg/commands/copy.go b/pkg/commands/copy.go index 93c7f96fa..d9cc5fc2a 100644 --- a/pkg/commands/copy.go +++ b/pkg/commands/copy.go @@ -53,7 +53,7 @@ func (c *CopyCommand) ExecuteCommand(config *manifest.Schema2Config) error { // For each source, iterate through each file within and copy it over for src, files := range srcMap { for _, file := range files { - fi, err := os.Stat(filepath.Join(c.buildcontext, file)) + fi, err := os.Lstat(filepath.Join(c.buildcontext, file)) if err != nil { return err } @@ -67,6 +67,17 @@ func (c *CopyCommand) ExecuteCommand(config *manifest.Schema2Config) error { if err := os.MkdirAll(destPath, fi.Mode()); err != nil { return err } + } else if fi.Mode()&os.ModeSymlink != 0 { + // If file is a symlink, we want to create the same relative symlink + link, err := os.Readlink(filepath.Join(c.buildcontext, file)) + if err != nil { + return err + } + linkDst := filepath.Join(destPath, link) + if err := os.Symlink(linkDst, destPath); err != nil { + logrus.Errorf("unable to symlink %s to %s", linkDst, destPath) + return err + } } else { // ... Else, we want to copy over a file logrus.Infof("Copying file %s to %s", file, destPath) diff --git a/pkg/snapshot/snapshot.go b/pkg/snapshot/snapshot.go index 0601c352c..32517eaf1 100644 --- a/pkg/snapshot/snapshot.go +++ b/pkg/snapshot/snapshot.go @@ -82,7 +82,7 @@ func (s *Snapshotter) TakeSnapshotOfFiles(files []string) ([]byte, error) { w := tar.NewWriter(buf) defer w.Close() for _, file := range files { - info, err := os.Stat(file) + info, err := os.Lstat(file) if err != nil { return nil, err } diff --git a/pkg/util/command_util.go b/pkg/util/command_util.go index 36f2cd57b..33fc510a7 100644 --- a/pkg/util/command_util.go +++ b/pkg/util/command_util.go @@ -142,11 +142,11 @@ func IsDestDir(path string) bool { // Assume dest is also a dir, and copy to dest/relpath // If dest is not an absolute filepath, add /cwd to the beginning func DestinationFilepath(filename, srcName, dest, cwd, buildcontext string) (string, error) { - fi, err := os.Stat(filepath.Join(buildcontext, filename)) + fi, err := os.Lstat(filepath.Join(buildcontext, filename)) if err != nil { return "", err } - src, err := os.Stat(filepath.Join(buildcontext, srcName)) + src, err := os.Lstat(filepath.Join(buildcontext, srcName)) if err != nil { return "", err } diff --git a/pkg/util/fs_util.go b/pkg/util/fs_util.go index b63f1f4b8..3edefacd2 100644 --- a/pkg/util/fs_util.go +++ b/pkg/util/fs_util.go @@ -137,7 +137,7 @@ func Files(root string) ([]string, error) { // FilepathExists returns true if the path exists func FilepathExists(path string) bool { - _, err := os.Stat(path) + _, err := os.Lstat(path) return !os.IsNotExist(err) } @@ -145,7 +145,7 @@ func FilepathExists(path string) bool { func CreateFile(path string, reader io.Reader, perm os.FileMode) error { // Create directory path if it doesn't exist baseDir := filepath.Dir(path) - if _, err := os.Stat(baseDir); os.IsNotExist(err) { + if _, err := os.Lstat(baseDir); os.IsNotExist(err) { logrus.Debugf("baseDir %s for file %s does not exist. Creating.", baseDir, path) if err := os.MkdirAll(baseDir, 0755); err != nil { return err diff --git a/pkg/util/tar_util.go b/pkg/util/tar_util.go index 9c768c35f..c153bb379 100644 --- a/pkg/util/tar_util.go +++ b/pkg/util/tar_util.go @@ -148,7 +148,7 @@ func fileIsUncompressedTar(src string) bool { if err != nil { return false } - fi, err := os.Stat(src) + fi, err := os.Lstat(src) if err != nil { return false }