mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* lib/find.rb (Find.find): respect the encodings of arguments.
[ruby-dev:47530] [Feature #8657] * test/test_find.rb: add tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42866 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									dd946739dd
								
							
						
					
					
						commit
						0a4801e768
					
				
					 3 changed files with 64 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
Sat Sep  7 13:29:22 2013  Kazuki Tsujimoto  <kazuki@callcc.net>
 | 
			
		||||
 | 
			
		||||
	* lib/find.rb (Find.find): respect the encodings of arguments.
 | 
			
		||||
	  [ruby-dev:47530] [Feature #8657]
 | 
			
		||||
 | 
			
		||||
	* test/test_find.rb: add tests.
 | 
			
		||||
 | 
			
		||||
Sat Sep  7 10:40:32 2013  Tanaka Akira  <akr@fsij.org>
 | 
			
		||||
 | 
			
		||||
	* ext/socket/mkconstants.rb (TCP_FASTOPEN): Defined for TCP fast open.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										40
									
								
								lib/find.rb
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								lib/find.rb
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -37,30 +37,36 @@ module Find
 | 
			
		|||
  def find(*paths) # :yield: path
 | 
			
		||||
    block_given? or return enum_for(__method__, *paths)
 | 
			
		||||
 | 
			
		||||
    paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup}
 | 
			
		||||
    while file = paths.shift
 | 
			
		||||
      catch(:prune) do
 | 
			
		||||
        yield file.dup.taint
 | 
			
		||||
        begin
 | 
			
		||||
          s = File.lstat(file)
 | 
			
		||||
        rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        if s.directory? then
 | 
			
		||||
    fs_encoding = Encoding.find("filesystem")
 | 
			
		||||
 | 
			
		||||
    paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup}.each do |path|
 | 
			
		||||
      enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding
 | 
			
		||||
      ps = [path]
 | 
			
		||||
      while file = ps.shift
 | 
			
		||||
        catch(:prune) do
 | 
			
		||||
          yield file.dup.taint
 | 
			
		||||
          begin
 | 
			
		||||
            fs = Dir.entries(file)
 | 
			
		||||
            s = File.lstat(file)
 | 
			
		||||
          rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
          fs.sort!
 | 
			
		||||
          fs.reverse_each {|f|
 | 
			
		||||
            next if f == "." or f == ".."
 | 
			
		||||
            f = File.join(file, f)
 | 
			
		||||
            paths.unshift f.untaint
 | 
			
		||||
          }
 | 
			
		||||
          if s.directory? then
 | 
			
		||||
            begin
 | 
			
		||||
              fs = Dir.entries(file, encoding: enc)
 | 
			
		||||
            rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
 | 
			
		||||
              next
 | 
			
		||||
            end
 | 
			
		||||
            fs.sort!
 | 
			
		||||
            fs.reverse_each {|f|
 | 
			
		||||
              next if f == "." or f == ".."
 | 
			
		||||
              f = File.join(file, f)
 | 
			
		||||
              ps.unshift f.untaint
 | 
			
		||||
            }
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,6 +210,40 @@ class TestFind < Test::Unit::TestCase
 | 
			
		|||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_encoding_ascii
 | 
			
		||||
    Dir.mktmpdir {|d|
 | 
			
		||||
      File.open("#{d}/a", "w"){}
 | 
			
		||||
      Dir.mkdir("#{d}/b")
 | 
			
		||||
      a = []
 | 
			
		||||
      Find.find(d.encode(Encoding::US_ASCII)) {|f| a << f }
 | 
			
		||||
      a.each do |i|
 | 
			
		||||
        assert(Encoding.compatible?(d.encode(Encoding.find('filesystem')), i))
 | 
			
		||||
      end
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_encoding_non_ascii
 | 
			
		||||
    Dir.mktmpdir {|d|
 | 
			
		||||
      File.open("#{d}/a", "w"){}
 | 
			
		||||
      Dir.mkdir("#{d}/b")
 | 
			
		||||
      euc_jp = Encoding::EUC_JP
 | 
			
		||||
      win_31j = Encoding::Windows_31J
 | 
			
		||||
      utf_8 = Encoding::UTF_8
 | 
			
		||||
      a = []
 | 
			
		||||
      Find.find(d.encode(euc_jp), d.encode(win_31j), d.encode(utf_8)) {|f| a << [f, f.encoding] }
 | 
			
		||||
      assert_equal([[d, euc_jp], ["#{d}/a", euc_jp], ["#{d}/b", euc_jp],
 | 
			
		||||
                    [d, win_31j], ["#{d}/a", win_31j], ["#{d}/b", win_31j],
 | 
			
		||||
                    [d, utf_8], ["#{d}/a", utf_8], ["#{d}/b", utf_8]],
 | 
			
		||||
                   a)
 | 
			
		||||
      if /mswin|mingw/ =~ RUBY_PLATFORM
 | 
			
		||||
        a = []
 | 
			
		||||
        Dir.mkdir("#{d}/\u{2660}")
 | 
			
		||||
        Find.find("#{d}".encode(utf_8)) {|f| a << [f, f.encoding] }
 | 
			
		||||
        assert_equal([[d, utf_8], ["#{d}/a", utf_8], ["#{d}/b", utf_8], ["#{d}/\u{2660}", utf_8]], a)
 | 
			
		||||
      end
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class TestInclude < Test::Unit::TestCase
 | 
			
		||||
    include Find
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue