[前][次][番号順一覧][スレッド一覧]

ruby-changes:72571

From: Nobuyoshi <ko1@a...>
Date: Sat, 16 Jul 2022 16:40:00 +0900 (JST)
Subject: [ruby-changes:72571] c093e7d645 (master): Avoid to symlink under symlink

https://git.ruby-lang.org/ruby.git/commit/?id=c093e7d645

From c093e7d64545640c8f2e7bb3eb24e3f9e24fb1c5 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Sat, 16 Jul 2022 16:37:26 +0900
Subject: Avoid to symlink under symlink

---
 ext/extmk.rb  |  2 +-
 tool/ln_sr.rb | 21 ++++++++++++++-------
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/ext/extmk.rb b/ext/extmk.rb
index 6a9f9a7a70..f080f2676a 100755
--- a/ext/extmk.rb
+++ b/ext/extmk.rb
@@ -598,7 +598,7 @@ CP_R = #{config_string('CP')} -r https://github.com/ruby/ruby/blob/trunk/ext/extmk.rb#L598
 
 gemlib = $(TARGET_TOPDIR)/gems/$(gem)/lib
 gemlib:#{%{ $(gemlib)\n$(gemlib): $(gem_srcdir)/lib} if $nmake}
-	$(Q) $(RUBY) $(top_srcdir)/tool/ln_sr.rb -f $(gem_srcdir)/lib $(gemlib)
+	$(Q) #{@inplace ? '$(NULLCMD) ' : ''}$(RUBY) $(top_srcdir)/tool/ln_sr.rb -f -T $(gem_srcdir)/lib $(gemlib)
 
 clean-gemlib:
 	$(Q) $(#{@inplace ? 'NULLCMD' : 'RM_RF'}) $(gemlib)
diff --git a/tool/ln_sr.rb b/tool/ln_sr.rb
index 1199263e85..307daa3202 100755
--- a/tool/ln_sr.rb
+++ b/tool/ln_sr.rb
@@ -1,11 +1,17 @@ https://github.com/ruby/ruby/blob/trunk/tool/ln_sr.rb#L1
 #!/usr/bin/ruby
 
+target_directory = true
+noop = false
+force = false
+
 until ARGV.empty?
   case ARGV[0]
   when '-n'
     noop = true
   when '-f'
     force = true
+  when '-T'
+    target_directory = false
   else
     break
   end
@@ -21,10 +27,11 @@ require 'fileutils' https://github.com/ruby/ruby/blob/trunk/tool/ln_sr.rb#L27
 
 include FileUtils
 unless respond_to?(:ln_sr)
-  def ln_sr(src, dest, force: nil, noop: nil, verbose: nil)
+  def ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil)
+    options = "#{force ? 'f' : ''}#{target_directory ? '' : 'T'}"
     dest = File.path(dest)
     srcs = Array.try_convert(src) || [src]
-    link = proc do |s, target_directory = true|
+    link = proc do |s, target_dir_p = true|
       s = File.path(s)
       if fu_starting_path?(s)
         srcdirs = fu_split_path((File.realdirpath(s) rescue File.expand_path(s)))
@@ -32,15 +39,15 @@ unless respond_to?(:ln_sr) https://github.com/ruby/ruby/blob/trunk/tool/ln_sr.rb#L39
         srcdirs = fu_clean_components(*fu_split_path(s))
       end
       destdirs = fu_split_path(File.realdirpath(dest))
-      destdirs.pop unless target_directory
+      destdirs.pop unless target_dir_p
       base = fu_relative_components_from(fu_split_path(Dir.pwd), destdirs)
       while srcdirs.first&. == ".." and base.last and !fu_starting_path?(base.last)
         srcdirs.shift
         base.pop
       end
       s = File.join(*base, *srcdirs)
-      d = target_directory ? File.join(dest, File.basename(s)) : dest
-      fu_output_message "ln -s#{force ? 'f' : ''} #{s} #{d}" if verbose
+      d = target_dir_p ? File.join(dest, File.basename(s)) : dest
+      fu_output_message "ln -s#{options} #{s} #{d}" if verbose
       next if noop
       remove_file d, true if force
       File.symlink s, d
@@ -48,7 +55,7 @@ unless respond_to?(:ln_sr) https://github.com/ruby/ruby/blob/trunk/tool/ln_sr.rb#L55
     case srcs.size
     when 0
     when 1
-      link[srcs[0], File.directory?(dest)]
+      link[srcs[0], target_directory && File.directory?(dest)]
     else
       srcs.each(&link)
     end
@@ -103,7 +110,7 @@ end https://github.com/ruby/ruby/blob/trunk/tool/ln_sr.rb#L110
 
 if File.respond_to?(:symlink)
   begin
-    ln_sr(src, dest, verbose: true, force: force, noop: noop)
+    ln_sr(src, dest, verbose: true, target_directory: target_directory, force: force, noop: noop)
   rescue NotImplementedError, Errno::EPERM
   else
     exit
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]