From 8560ee1755967f2d3b6abbff0a4c87728f749ef2 Mon Sep 17 00:00:00 2001 From: Shunsuke Suzuki Date: Sun, 16 Feb 2025 16:19:58 +0900 Subject: [PATCH] fix: replace symlinks with hard links on windows --- pkg/installpackage/link.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pkg/installpackage/link.go b/pkg/installpackage/link.go index 1e04b4c74..2da749fc3 100644 --- a/pkg/installpackage/link.go +++ b/pkg/installpackage/link.go @@ -153,16 +153,38 @@ func (is *Installer) createLink(logE *logrus.Entry, linkPath, linkDest string) e if err := is.fs.Remove(linkPath); err != nil { return fmt.Errorf("remove a file to create a symbolic link (%s): %w", linkPath, err) } + if is.realRuntime.IsWindows() { + if err := is.linker.Hardlink(linkDest, linkPath); err != nil { + return fmt.Errorf("create a hard link: %w", err) + } + return nil + } if err := is.linker.Symlink(linkDest, linkPath); err != nil { return fmt.Errorf("create a symbolic link: %w", err) } return nil case mode&os.ModeSymlink != 0: + if is.realRuntime.IsWindows() { + if err := is.fs.Remove(linkPath); err != nil { + return fmt.Errorf("remove a file to create a symbolic link (%s): %w", linkPath, err) + } + if err := is.linker.Hardlink(linkDest, linkPath); err != nil { + return fmt.Errorf("create a hard link: %w", err) + } + return nil + } return is.recreateLink(logE, linkPath, linkDest) default: return fmt.Errorf("unexpected file mode %s: %s", linkPath, mode.String()) } } + if is.realRuntime.IsWindows() { + logE.Info("create a hard link") + if err := is.linker.Hardlink(linkDest, linkPath); err != nil { + return fmt.Errorf("create a hard link: %w", err) + } + return nil + } logE.Info("create a symbolic link") if err := is.linker.Symlink(linkDest, linkPath); err != nil { return fmt.Errorf("create a symbolic link: %w", err)