Fix runnable symlinks

Fix symlinks to executable as relative paths from `bin` directory.
This commit is contained in:
Nobuyoshi Nakada 2024-09-02 20:26:14 +09:00
parent c93d07ed74
commit a33416a333
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
Notes: git 2024-09-03 01:44:07 +00:00

View File

@ -40,7 +40,7 @@ module Path
# Extensions to FileUtils # Extensions to FileUtils
module Mswin module Mswin
def ln_safe(src, dest, *opt) def ln_safe(src, dest, real_src, *opt)
cmd = ["mklink", dest.tr("/", "\\"), src.tr("/", "\\")] cmd = ["mklink", dest.tr("/", "\\"), src.tr("/", "\\")]
cmd[1, 0] = opt cmd[1, 0] = opt
return if system("cmd", "/c", *cmd) return if system("cmd", "/c", *cmd)
@ -48,23 +48,23 @@ module Path
puts cmd.join(" ") puts cmd.join(" ")
end end
def ln_dir_safe(src, dest) def ln_dir_safe(src, dest, real_src)
ln_safe(src, dest, "/d") ln_safe(src, dest, "/d")
end end
end end
module HardlinkExcutable module HardlinkExcutable
def ln_exe(src, dest) def ln_exe(relative_src, dest, src)
ln(src, dest, force: true) ln(src, dest, force: true)
end end
end end
def ln_safe(src, dest) def ln_safe(src, dest, real_src)
ln_sf(src, dest) ln_sf(src, dest)
rescue Errno::ENOENT rescue Errno::ENOENT
# Windows disallows to create broken symboic links, probably because # Windows disallows to create broken symboic links, probably because
# it is a kind of reparse points. # it is a kind of reparse points.
raise if File.exist?(src) raise if File.exist?(real_src)
end end
alias ln_dir_safe ln_safe alias ln_dir_safe ln_safe
@ -75,16 +75,16 @@ module Path
parent = File.dirname(dest) parent = File.dirname(dest)
File.directory?(parent) or mkdir_p(parent) File.directory?(parent) or mkdir_p(parent)
if executable if executable
return (ln_exe(src, dest) if File.exist?(src)) return (ln_exe(relative(src, parent), dest, src) if File.exist?(src))
end end
clean_link(relative(src, parent), dest) {|s, d| ln_safe(s, d)} clean_link(relative(src, parent), dest) {|s, d| ln_safe(s, d, src)}
end end
def ln_dir_relative(src, dest) def ln_dir_relative(src, dest)
return if File.identical?(src, dest) return if File.identical?(src, dest)
parent = File.dirname(dest) parent = File.dirname(dest)
File.directory?(parent) or mkdir_p(parent) File.directory?(parent) or mkdir_p(parent)
clean_link(relative(src, parent), dest) {|s, d| ln_dir_safe(s, d)} clean_link(relative(src, parent), dest) {|s, d| ln_dir_safe(s, d, src)}
end end
case (CROSS_COMPILING || RUBY_PLATFORM) case (CROSS_COMPILING || RUBY_PLATFORM)