diff --git a/pkg/cluster/manager/patch.go b/pkg/cluster/manager/patch.go index e46cb1bad5..3babc36b82 100644 --- a/pkg/cluster/manager/patch.go +++ b/pkg/cluster/manager/patch.go @@ -19,6 +19,7 @@ import ( "os" "os/exec" "path" + "path/filepath" "strings" "github.com/fatih/color" @@ -204,7 +205,13 @@ func overwritePatch(specManager *spec.SpecManager, name, comp, packagePath strin if utils.IsSymExist(symlink) { os.Remove(symlink) } - return os.Symlink(tg, symlink) + + tgRelPath, err := filepath.Rel(filepath.Dir(symlink), tg) + if err != nil { + return err + } + + return os.Symlink(tgRelPath, symlink) } func instancesToPatch(topo spec.Topology, options operator.Options) ([]spec.Instance, error) { diff --git a/pkg/utils/ioutil.go b/pkg/utils/ioutil.go index 42f4335daa..9cb3376b7f 100644 --- a/pkg/utils/ioutil.go +++ b/pkg/utils/ioutil.go @@ -101,11 +101,23 @@ func Tar(writer io.Writer, from string) error { tarW := tar.NewWriter(compressW) defer tarW.Close() + // NOTE: filepath.Walk does not follow the symbolic link. return filepath.Walk(from, func(path string, info fs.FileInfo, err error) error { if err != nil { return err } - header, _ := tar.FileInfoHeader(info, "") + + fm := info.Mode() + + link := "" + if fm&fs.ModeSymlink != 0 { + link, err = os.Readlink(path) + if err != nil { + return err + } + } + + header, _ := tar.FileInfoHeader(info, link) header.Name, _ = filepath.Rel(from, path) // skip "." if header.Name == "." { @@ -116,7 +128,7 @@ func Tar(writer io.Writer, from string) error { if err != nil { return err } - if !info.IsDir() { + if info.Mode().IsRegular() { fd, err := os.Open(path) if err != nil { return err