fileutils 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.