diff --git a/ChangeLog b/ChangeLog index d52542548..581fc60a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Version 17.13.1 +--------------- + * Preserve symlinks when copying files + Version 17.13.0 --------------- * Add a `break` statement to the build language (#3320) @@ -5,7 +9,6 @@ Version 17.13.0 to output directories in remote execution (#3330) * Make output target display not have local targets hanging around so much (#3276) - Version 17.12.7 --------------- * Fix BuildTarget.ProvideFor not checking named data when deciding whether diff --git a/VERSION b/VERSION index 5cc477aa8..a2d5303b4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -17.13.0 +17.13.1 diff --git a/src/fs/copy.go b/src/fs/copy.go index 6d6812103..a3d8345d7 100644 --- a/src/fs/copy.go +++ b/src/fs/copy.go @@ -64,7 +64,7 @@ func RecursiveCopyOrLinkFile(from string, to string, mode os.FileMode, link, fal return os.MkdirAll(dest, DirPermissions) } if fileMode.IsSymlink() { - return recursiveCopyOrLinkSymlink(name, dest, mode, link, fallback) + return copySymlink(name, dest) } return CopyOrLinkFile(name, dest, fileMode.ModeType(), mode, link, fallback) }) @@ -72,19 +72,13 @@ func RecursiveCopyOrLinkFile(from string, to string, mode os.FileMode, link, fal return CopyOrLinkFile(from, to, info.Mode(), mode, link, fallback) } -// recursiveCopyOrLinkSymlink will resolve the symlink, and recursively copy the content to the destination -func recursiveCopyOrLinkSymlink(name, dest string, mode os.FileMode, link, fallback bool) error { +// copySymlink will resolve the symlink and create an equivalent symlink at dest. Assumes the symlink is relative, not absolute. +func copySymlink(name, dest string) error { resolvedPath, err := os.Readlink(name) if err != nil { return err } - if !filepath.IsAbs(resolvedPath) { - resolvedPath = filepath.Join(filepath.Dir(name), resolvedPath) - } - if err := RecursiveCopyOrLinkFile(resolvedPath, dest, mode, link, fallback); err != nil { - return err - } - return nil + return os.Symlink(resolvedPath, dest) } type LinkFunc func(string, string) error