fileutils 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d17d793f31847089ba65e37117e6a28f59a3b729487c587afe796d5d9e50d33d
4
- data.tar.gz: 528bbd0bd36e972f602aa5739cf44283c64a04bbe2b8f807645be78199908705
3
+ metadata.gz: e0aee7f293ec6d29fa463553496d041a986ddfb407fe3ea8788da72a5e5be089
4
+ data.tar.gz: 2e1a5e8678e34ef6cb8caf57c474035052da6985746212040eeae58d6b06f094
5
5
  SHA512:
6
- metadata.gz: 32259ad3ecb8b69a0b459e647d05f8bf5ede57cf6c5a7d26c9f9637d194cad54e14ed4904c4eb47532ecfb9e9b8fa72b8dd89fb8d134c723c877d8b3f6a07a4f
7
- data.tar.gz: d61c4a8f867d7fd3ebf61a1ec2a379bb2cac5e511df133330f062c05342dc008bc7e9b7f738a1b1577d35ea517d39151509b9cef3ad7f4a30cb0d01ec2e8464e
6
+ metadata.gz: 98dc33148493bef27a911a73f78f825de57929ad8eb3e3e9c47c40dbadb139c74b044011f78129b651155e8c2478266af5713f4e491765a351270e2cdecc8db4
7
+ data.tar.gz: 6209a27261211f2f724d51fd9abc0a6729023d0c7354f982c641d1b37670f7550b9a23b675cb8e49ada611cbdc794ceb5f7aa517bf4c9b71ed58ed3dc150d528
@@ -1,6 +1,13 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.2
4
+ - 2.3.7
5
+ - 2.4.4
6
+ - 2.5.1
5
7
  - ruby-head
6
8
  script: rake test
9
+ matrix:
10
+ include:
11
+ - rvm: jruby-9.1.17.0
12
+ env:
13
+ - "JRUBY_OPTS='-J-Xmx1024M -X+O'"
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
+ JRuby.objectspace = true if RUBY_PLATFORM == 'java'
5
+
4
6
  Rake::TestTask.new(:test) do |t|
5
7
  t.libs << "test" << "test/lib"
6
8
  t.libs << "lib"
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Gem::Specification.new do |s|
3
4
  s.name = "fileutils"
4
- s.version = '1.0.2'
5
- s.date = '2017-12-22'
5
+ s.version = '1.1.0'
6
6
  s.summary = "Several file utility methods for copying, moving, removing, etc."
7
7
  s.description = "Several file utility methods for copying, moving, removing, etc."
8
8
 
9
9
  s.require_path = %w{lib}
10
10
  s.files = [".gitignore", ".travis.yml", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin/console", "bin/setup", "fileutils.gemspec", "lib/fileutils.rb"]
11
- s.required_ruby_version = ">= 2.4.0"
11
+ s.required_ruby_version = ">= 2.3.0"
12
12
 
13
13
  s.authors = ["Minero Aoki"]
14
14
  s.email = [nil]
@@ -85,9 +85,11 @@
85
85
  # <tt>:verbose</tt> flags to methods in FileUtils.
86
86
  #
87
87
 
88
+ require 'rbconfig'
89
+
88
90
  module FileUtils
89
91
 
90
- VERSION = "1.0.2"
92
+ VERSION = "1.1.0"
91
93
 
92
94
  def self.private_module_function(name) #:nodoc:
93
95
  module_function name
@@ -119,8 +121,9 @@ module FileUtils
119
121
  #
120
122
  def cd(dir, verbose: nil, &block) # :yield: dir
121
123
  fu_output_message "cd #{dir}" if verbose
122
- Dir.chdir(dir, &block)
124
+ result = Dir.chdir(dir, &block)
123
125
  fu_output_message 'cd -' if verbose and block
126
+ result
124
127
  end
125
128
  module_function :cd
126
129
 
@@ -295,6 +298,39 @@ module FileUtils
295
298
  alias link ln
296
299
  module_function :link
297
300
 
301
+ #
302
+ # :call-seq:
303
+ # FileUtils.cp_lr(src, dest, noop: nil, verbose: nil, dereference_root: true, remove_destination: false)
304
+ #
305
+ # Hard link +src+ to +dest+. If +src+ is a directory, this method links
306
+ # all its contents recursively. If +dest+ is a directory, links
307
+ # +src+ to +dest/src+.
308
+ #
309
+ # +src+ can be a list of files.
310
+ #
311
+ # # Installing the library "mylib" under the site_ruby directory.
312
+ # FileUtils.rm_r site_ruby + '/mylib', :force => true
313
+ # FileUtils.cp_lr 'lib/', site_ruby + '/mylib'
314
+ #
315
+ # # Examples of linking several files to target directory.
316
+ # FileUtils.cp_lr %w(mail.rb field.rb debug/), site_ruby + '/tmail'
317
+ # FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', :noop => true, :verbose => true
318
+ #
319
+ # # If you want to link all contents of a directory instead of the
320
+ # # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
321
+ # # use the following code.
322
+ # FileUtils.cp_lr 'src/.', 'dest' # cp_lr('src', 'dest') makes dest/src, but this doesn't.
323
+ #
324
+ def cp_lr(src, dest, noop: nil, verbose: nil,
325
+ dereference_root: true, remove_destination: false)
326
+ fu_output_message "cp -lr#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose
327
+ return if noop
328
+ fu_each_src_dest(src, dest) do |s, d|
329
+ link_entry s, d, dereference_root, remove_destination
330
+ end
331
+ end
332
+ module_function :cp_lr
333
+
298
334
  #
299
335
  # :call-seq:
300
336
  # FileUtils.ln_s(target, link, force: nil, noop: nil, verbose: nil)
@@ -341,6 +377,26 @@ module FileUtils
341
377
  end
342
378
  module_function :ln_sf
343
379
 
380
+ #
381
+ # Hard links a file system entry +src+ to +dest+.
382
+ # If +src+ is a directory, this method links its contents recursively.
383
+ #
384
+ # Both of +src+ and +dest+ must be a path name.
385
+ # +src+ must exist, +dest+ must not exist.
386
+ #
387
+ # If +dereference_root+ is true, this method dereferences the tree root.
388
+ #
389
+ # If +remove_destination+ is true, this method removes each destination file before copy.
390
+ #
391
+ def link_entry(src, dest, dereference_root = false, remove_destination = false)
392
+ Entry_.new(src, nil, dereference_root).traverse do |ent|
393
+ destent = Entry_.new(dest, ent.rel, false)
394
+ File.unlink destent.path if remove_destination && File.file?(destent.path)
395
+ ent.link destent.path
396
+ end
397
+ end
398
+ module_function :link_entry
399
+
344
400
  #
345
401
  # Copies a file content +src+ to +dest+. If +dest+ is a directory,
346
402
  # copies +src+ to +dest/src+.
@@ -488,7 +544,7 @@ module FileUtils
488
544
  module_function :move
489
545
 
490
546
  def rename_cannot_overwrite_file? #:nodoc:
491
- /emx/ =~ RUBY_PLATFORM
547
+ /emx/ =~ RbConfig::CONFIG['host_os']
492
548
  end
493
549
  private_module_function :rename_cannot_overwrite_file?
494
550
 
@@ -603,8 +659,8 @@ module FileUtils
603
659
  #
604
660
  # For details of this security vulnerability, see Perl's case:
605
661
  #
606
- # * http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448
607
- # * http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452
662
+ # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448
663
+ # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452
608
664
  #
609
665
  # For fileutils.rb, this vulnerability is reported in [ruby-dev:26100].
610
666
  #
@@ -628,22 +684,38 @@ module FileUtils
628
684
  unless parent_st.sticky?
629
685
  raise ArgumentError, "parent directory is world writable, FileUtils#remove_entry_secure does not work; abort: #{path.inspect} (parent directory mode #{'%o' % parent_st.mode})"
630
686
  end
687
+
631
688
  # freeze tree root
632
689
  euid = Process.euid
633
- File.open(fullpath + '/.') {|f|
634
- unless fu_stat_identical_entry?(st, f.stat)
635
- # symlink (TOC-to-TOU attack?)
636
- File.unlink fullpath
637
- return
638
- end
639
- f.chown euid, -1
640
- f.chmod 0700
641
- unless fu_stat_identical_entry?(st, File.lstat(fullpath))
642
- # TOC-to-TOU attack?
643
- File.unlink fullpath
644
- return
645
- end
646
- }
690
+ dot_file = fullpath + "/."
691
+ begin
692
+ File.open(dot_file) {|f|
693
+ unless fu_stat_identical_entry?(st, f.stat)
694
+ # symlink (TOC-to-TOU attack?)
695
+ File.unlink fullpath
696
+ return
697
+ end
698
+ f.chown euid, -1
699
+ f.chmod 0700
700
+ }
701
+ rescue EISDIR # JRuby in non-native mode can't open files as dirs
702
+ File.lstat(dot_file).tap {|fstat|
703
+ unless fu_stat_identical_entry?(st, fstat)
704
+ # symlink (TOC-to-TOU attack?)
705
+ File.unlink fullpath
706
+ return
707
+ end
708
+ File.chown euid, -1, dot_file
709
+ File.chmod 0700, dot_file
710
+ }
711
+ end
712
+
713
+ unless fu_stat_identical_entry?(st, File.lstat(fullpath))
714
+ # TOC-to-TOU attack?
715
+ File.unlink fullpath
716
+ return
717
+ end
718
+
647
719
  # ---- tree root is frozen ----
648
720
  root = Entry_.new(path)
649
721
  root.preorder_traverse do |ent|
@@ -744,8 +816,15 @@ module FileUtils
744
816
  #
745
817
  def compare_stream(a, b)
746
818
  bsize = fu_stream_blksize(a, b)
747
- sa = String.new(capacity: bsize)
748
- sb = String.new(capacity: bsize)
819
+
820
+ if RUBY_VERSION > "2.4"
821
+ sa = String.new(capacity: bsize)
822
+ sb = String.new(capacity: bsize)
823
+ else
824
+ sa = String.new
825
+ sb = String.new
826
+ end
827
+
749
828
  begin
750
829
  a.read(bsize, sa)
751
830
  b.read(bsize, sb)
@@ -1070,7 +1149,7 @@ module FileUtils
1070
1149
  private
1071
1150
 
1072
1151
  def fu_windows?
1073
- /mswin|mingw|bccwin|emx/ =~ RUBY_PLATFORM
1152
+ /mswin|mingw|bccwin|emx/ =~ RbConfig::CONFIG['host_os']
1074
1153
  end
1075
1154
 
1076
1155
  def fu_copy_stream0(src, dest, blksize = nil) #:nodoc:
@@ -1252,6 +1331,22 @@ module FileUtils
1252
1331
  end
1253
1332
  end
1254
1333
 
1334
+ def link(dest)
1335
+ case
1336
+ when directory?
1337
+ if !File.exist?(dest) and descendant_directory?(dest, path)
1338
+ raise ArgumentError, "cannot link directory %s to itself %s" % [path, dest]
1339
+ end
1340
+ begin
1341
+ Dir.mkdir dest
1342
+ rescue
1343
+ raise unless File.directory?(dest)
1344
+ end
1345
+ else
1346
+ File.link path(), dest
1347
+ end
1348
+ end
1349
+
1255
1350
  def copy(dest)
1256
1351
  lstat
1257
1352
  case
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fileutils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minero Aoki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-22 00:00:00.000000000 Z
11
+ date: 2018-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -54,7 +54,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- version: 2.4.0
57
+ version: 2.3.0
58
58
  required_rubygems_version: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ">="
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
62
  version: '0'
63
63
  requirements: []
64
64
  rubyforge_project:
65
- rubygems_version: 2.7.3
65
+ rubygems_version: 2.7.6
66
66
  signing_key:
67
67
  specification_version: 4
68
68
  summary: Several file utility methods for copying, moving, removing, etc.