fileutils 1.2.0 → 1.3.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: 822c63d8edeea0c85052a9c369998a574dee1f10a5a3324c8b65a99ae8b5ebfc
4
- data.tar.gz: 750967bab0db376f480e6b66cac9d1c8c251df2afb117b493266ffe9f8c4c968
3
+ metadata.gz: 34d7f0ea2d7241dc23eba2ec5d7be548d2dab3edb9082e94fc7766b70ce8dcd2
4
+ data.tar.gz: c0a41797554a3a763ff7d7ac7b6f1f149d50bcefe0ddef959b98a1384f40ba93
5
5
  SHA512:
6
- metadata.gz: 8bfae5ac5f001b4841794552a001f694acc7cb872c6ab7534ea02424431f3c7ece68957ccd757a63ff779916b2dc6c930fa77d359793647dcb3f7a2594258d4b
7
- data.tar.gz: 454a6c561b6df0d2480207533e4724d2e876e9843e9f8079dabd6e5b1b1d41a528a7c86f7a016c762129b34c3f9322dc114dde466f2142f88e77ff50d4178a40
6
+ metadata.gz: 78deb94048b06e1c7d3215f3bc796447caf909c047f14f137a367e907b4f4fb5655c5ceb211390d5ead7f9e8710b6daf33d262ff31a5b3f186bb2d40f2f4900f
7
+ data.tar.gz: f57997f8e332a07d3ab01db4e31ae2e196179a1fb35e6ebf1d123f156e96c5ab415f8f408690767216194a65d92b2d7f77adce83719ffe40d8eeada4cfbb8c4b
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
1
  # FileUtils
2
2
 
3
- [![Build Status](https://travis-ci.org/ruby/fileutils.svg?branch=master)](https://travis-ci.org/ruby/fileutils)
4
-
5
3
  Namespace for several file utility methods for copying, moving, removing, etc.
6
4
 
7
5
  ## Installation
data/fileutils.gemspec CHANGED
@@ -27,6 +27,4 @@ Gem::Specification.new do |s|
27
27
  "source_code_uri" => "https://github.com/ruby/fileutils"
28
28
  }
29
29
  end
30
-
31
- s.add_development_dependency 'rake'
32
30
  end
data/lib/fileutils.rb CHANGED
@@ -6,7 +6,7 @@ rescue LoadError
6
6
  # for make mjit-headers
7
7
  end
8
8
 
9
- require "fileutils/version"
9
+ require_relative "fileutils/version"
10
10
 
11
11
  #
12
12
  # = fileutils.rb
@@ -24,46 +24,56 @@ require "fileutils/version"
24
24
  #
25
25
  # require 'fileutils'
26
26
  #
27
- # FileUtils.cd(dir, options)
28
- # FileUtils.cd(dir, options) {|dir| block }
27
+ # FileUtils.cd(dir, **options)
28
+ # FileUtils.cd(dir, **options) {|dir| block }
29
29
  # FileUtils.pwd()
30
- # FileUtils.mkdir(dir, options)
31
- # FileUtils.mkdir(list, options)
32
- # FileUtils.mkdir_p(dir, options)
33
- # FileUtils.mkdir_p(list, options)
34
- # FileUtils.rmdir(dir, options)
35
- # FileUtils.rmdir(list, options)
36
- # FileUtils.ln(target, link, options)
37
- # FileUtils.ln(targets, dir, options)
38
- # FileUtils.ln_s(target, link, options)
39
- # FileUtils.ln_s(targets, dir, options)
40
- # FileUtils.ln_sf(target, link, options)
41
- # FileUtils.cp(src, dest, options)
42
- # FileUtils.cp(list, dir, options)
43
- # FileUtils.cp_r(src, dest, options)
44
- # FileUtils.cp_r(list, dir, options)
45
- # FileUtils.mv(src, dest, options)
46
- # FileUtils.mv(list, dir, options)
47
- # FileUtils.rm(list, options)
48
- # FileUtils.rm_r(list, options)
49
- # FileUtils.rm_rf(list, options)
50
- # FileUtils.install(src, dest, options)
51
- # FileUtils.chmod(mode, list, options)
52
- # FileUtils.chmod_R(mode, list, options)
53
- # FileUtils.chown(user, group, list, options)
54
- # FileUtils.chown_R(user, group, list, options)
55
- # FileUtils.touch(list, options)
30
+ # FileUtils.mkdir(dir, **options)
31
+ # FileUtils.mkdir(list, **options)
32
+ # FileUtils.mkdir_p(dir, **options)
33
+ # FileUtils.mkdir_p(list, **options)
34
+ # FileUtils.rmdir(dir, **options)
35
+ # FileUtils.rmdir(list, **options)
36
+ # FileUtils.ln(target, link, **options)
37
+ # FileUtils.ln(targets, dir, **options)
38
+ # FileUtils.ln_s(target, link, **options)
39
+ # FileUtils.ln_s(targets, dir, **options)
40
+ # FileUtils.ln_sf(target, link, **options)
41
+ # FileUtils.cp(src, dest, **options)
42
+ # FileUtils.cp(list, dir, **options)
43
+ # FileUtils.cp_r(src, dest, **options)
44
+ # FileUtils.cp_r(list, dir, **options)
45
+ # FileUtils.mv(src, dest, **options)
46
+ # FileUtils.mv(list, dir, **options)
47
+ # FileUtils.rm(list, **options)
48
+ # FileUtils.rm_r(list, **options)
49
+ # FileUtils.rm_rf(list, **options)
50
+ # FileUtils.install(src, dest, **options)
51
+ # FileUtils.chmod(mode, list, **options)
52
+ # FileUtils.chmod_R(mode, list, **options)
53
+ # FileUtils.chown(user, group, list, **options)
54
+ # FileUtils.chown_R(user, group, list, **options)
55
+ # FileUtils.touch(list, **options)
56
56
  #
57
- # The <tt>options</tt> parameter is a hash of options, taken from the list
58
- # <tt>:force</tt>, <tt>:noop</tt>, <tt>:preserve</tt>, and <tt>:verbose</tt>.
59
- # <tt>:noop</tt> means that no changes are made. The other three are obvious.
60
- # Each method documents the options that it honours.
57
+ # Possible <tt>options</tt> are:
58
+ #
59
+ # <tt>:force</tt> :: forced operation (rewrite files if exist, remove
60
+ # directories if not empty, etc.);
61
+ # <tt>:verbose</tt> :: print command to be run, in bash syntax, before
62
+ # performing it;
63
+ # <tt>:preserve</tt> :: preserve object's group, user and modification
64
+ # time on copying;
65
+ # <tt>:noop</tt> :: no changes are made (usable in combination with
66
+ # <tt>:verbose</tt> which will print the command to run)
67
+ #
68
+ # Each method documents the options that it honours. See also ::commands,
69
+ # ::options and ::options_of methods to introspect which command have which
70
+ # options.
61
71
  #
62
72
  # All methods that have the concept of a "source" file or directory can take
63
73
  # either one file or a list of files in that argument. See the method
64
74
  # documentation for examples.
65
75
  #
66
- # There are some `low level' methods, which do not accept any option:
76
+ # There are some `low level' methods, which do not accept keyword arguments:
67
77
  #
68
78
  # FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
69
79
  # FileUtils.copy_file(src, dest, preserve = false, dereference = true)
@@ -119,7 +129,7 @@ module FileUtils
119
129
  #
120
130
  # FileUtils.cd('/') # change directory
121
131
  #
122
- # FileUtils.cd('/', :verbose => true) # change directory and report it
132
+ # FileUtils.cd('/', verbose: true) # change directory and report it
123
133
  #
124
134
  # FileUtils.cd('/') do # change directory
125
135
  # # ... # do something
@@ -164,9 +174,9 @@ module FileUtils
164
174
  # Creates one or more directories.
165
175
  #
166
176
  # FileUtils.mkdir 'test'
167
- # FileUtils.mkdir %w( tmp data )
168
- # FileUtils.mkdir 'notexist', :noop => true # Does not really create.
169
- # FileUtils.mkdir 'tmp', :mode => 0700
177
+ # FileUtils.mkdir %w(tmp data)
178
+ # FileUtils.mkdir 'notexist', noop: true # Does not really create.
179
+ # FileUtils.mkdir 'tmp', mode: 0700
170
180
  #
171
181
  def mkdir(list, mode: nil, noop: nil, verbose: nil)
172
182
  list = fu_list(list)
@@ -185,7 +195,7 @@ module FileUtils
185
195
  #
186
196
  # FileUtils.mkdir_p '/usr/local/lib/ruby'
187
197
  #
188
- # causes to make following directories, if it does not exist.
198
+ # causes to make following directories, if they do not exist.
189
199
  #
190
200
  # * /usr
191
201
  # * /usr/local
@@ -249,7 +259,7 @@ module FileUtils
249
259
  # FileUtils.rmdir 'somedir'
250
260
  # FileUtils.rmdir %w(somedir anydir otherdir)
251
261
  # # Does not really remove directory; outputs message.
252
- # FileUtils.rmdir 'somedir', :verbose => true, :noop => true
262
+ # FileUtils.rmdir 'somedir', verbose: true, noop: true
253
263
  #
254
264
  def rmdir(list, parents: nil, noop: nil, verbose: nil)
255
265
  list = fu_list(list)
@@ -278,7 +288,7 @@ module FileUtils
278
288
  #
279
289
  # In the first form, creates a hard link +link+ which points to +target+.
280
290
  # If +link+ already exists, raises Errno::EEXIST.
281
- # But if the :force option is set, overwrites +link+.
291
+ # But if the +force+ option is set, overwrites +link+.
282
292
  #
283
293
  # FileUtils.ln 'gcc', 'cc', verbose: true
284
294
  # FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'
@@ -304,9 +314,6 @@ module FileUtils
304
314
  alias link ln
305
315
  module_function :link
306
316
 
307
- #
308
- # :call-seq:
309
- # FileUtils.cp_lr(src, dest, noop: nil, verbose: nil, dereference_root: true, remove_destination: false)
310
317
  #
311
318
  # Hard link +src+ to +dest+. If +src+ is a directory, this method links
312
319
  # all its contents recursively. If +dest+ is a directory, links
@@ -314,13 +321,16 @@ module FileUtils
314
321
  #
315
322
  # +src+ can be a list of files.
316
323
  #
317
- # # Installing the library "mylib" under the site_ruby directory.
318
- # FileUtils.rm_r site_ruby + '/mylib', :force => true
324
+ # If +dereference_root+ is true, this method dereference tree root.
325
+ #
326
+ # If +remove_destination+ is true, this method removes each destination file before copy.
327
+ #
328
+ # FileUtils.rm_r site_ruby + '/mylib', force: true
319
329
  # FileUtils.cp_lr 'lib/', site_ruby + '/mylib'
320
330
  #
321
331
  # # Examples of linking several files to target directory.
322
332
  # FileUtils.cp_lr %w(mail.rb field.rb debug/), site_ruby + '/tmail'
323
- # FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', :noop => true, :verbose => true
333
+ # FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', noop: true, verbose: true
324
334
  #
325
335
  # # If you want to link all contents of a directory instead of the
326
336
  # # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
@@ -345,7 +355,7 @@ module FileUtils
345
355
  #
346
356
  # In the first form, creates a symbolic link +link+ which points to +target+.
347
357
  # If +link+ already exists, raises Errno::EEXIST.
348
- # But if the :force option is set, overwrites +link+.
358
+ # But if the <tt>force</tt> option is set, overwrites +link+.
349
359
  #
350
360
  # FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'
351
361
  # FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true
@@ -411,7 +421,7 @@ module FileUtils
411
421
  #
412
422
  # FileUtils.cp 'eval.c', 'eval.c.org'
413
423
  # FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
414
- # FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', :verbose => true
424
+ # FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', verbose: true
415
425
  # FileUtils.cp 'symlink', 'dest' # copy content, "dest" is not a symlink
416
426
  #
417
427
  def cp(src, dest, preserve: nil, noop: nil, verbose: nil)
@@ -433,13 +443,17 @@ module FileUtils
433
443
  #
434
444
  # +src+ can be a list of files.
435
445
  #
446
+ # If +dereference_root+ is true, this method dereference tree root.
447
+ #
448
+ # If +remove_destination+ is true, this method removes each destination file before copy.
449
+ #
436
450
  # # Installing Ruby library "mylib" under the site_ruby
437
- # FileUtils.rm_r site_ruby + '/mylib', :force
451
+ # FileUtils.rm_r site_ruby + '/mylib', force: true
438
452
  # FileUtils.cp_r 'lib/', site_ruby + '/mylib'
439
453
  #
440
454
  # # Examples of copying several files to target directory.
441
455
  # FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
442
- # FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', :noop => true, :verbose => true
456
+ # FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', noop: true, verbose: true
443
457
  #
444
458
  # # If you want to copy all contents of a directory instead of the
445
459
  # # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
@@ -474,7 +488,11 @@ module FileUtils
474
488
  # If +remove_destination+ is true, this method removes each destination file before copy.
475
489
  #
476
490
  def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
477
- Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent|
491
+ if dereference_root
492
+ src = File.realpath(src)
493
+ end
494
+
495
+ Entry_.new(src, nil, false).wrap_traverse(proc do |ent|
478
496
  destent = Entry_.new(dest, ent.rel, false)
479
497
  File.unlink destent.path if remove_destination && (File.file?(destent.path) || File.symlink?(destent.path))
480
498
  ent.copy destent.path
@@ -511,10 +529,10 @@ module FileUtils
511
529
  # disk partition, the file is copied then the original file is removed.
512
530
  #
513
531
  # FileUtils.mv 'badname.rb', 'goodname.rb'
514
- # FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', :force => true # no error
532
+ # FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', force: true # no error
515
533
  #
516
534
  # FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/'
517
- # FileUtils.mv Dir.glob('test*.rb'), 'test', :noop => true, :verbose => true
535
+ # FileUtils.mv Dir.glob('test*.rb'), 'test', noop: true, verbose: true
518
536
  #
519
537
  def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
520
538
  fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
@@ -554,7 +572,7 @@ module FileUtils
554
572
  #
555
573
  # FileUtils.rm %w( junk.txt dust.txt )
556
574
  # FileUtils.rm Dir.glob('*.so')
557
- # FileUtils.rm 'NotExistFile', :force => true # never raises exception
575
+ # FileUtils.rm 'NotExistFile', force: true # never raises exception
558
576
  #
559
577
  def rm(list, force: nil, noop: nil, verbose: nil)
560
578
  list = fu_list(list)
@@ -573,7 +591,7 @@ module FileUtils
573
591
  #
574
592
  # Equivalent to
575
593
  #
576
- # FileUtils.rm(list, :force => true)
594
+ # FileUtils.rm(list, force: true)
577
595
  #
578
596
  def rm_f(list, noop: nil, verbose: nil)
579
597
  rm list, force: true, noop: noop, verbose: verbose
@@ -589,18 +607,18 @@ module FileUtils
589
607
  # StandardError when :force option is set.
590
608
  #
591
609
  # FileUtils.rm_r Dir.glob('/tmp/*')
592
- # FileUtils.rm_r 'some_dir', :force => true
610
+ # FileUtils.rm_r 'some_dir', force: true
593
611
  #
594
612
  # WARNING: This method causes local vulnerability
595
613
  # if one of parent directories or removing directory tree are world
596
614
  # writable (including /tmp, whose permission is 1777), and the current
597
615
  # process has strong privilege such as Unix super user (root), and the
598
616
  # system has symbolic link. For secure removing, read the documentation
599
- # of #remove_entry_secure carefully, and set :secure option to true.
600
- # Default is :secure=>false.
617
+ # of remove_entry_secure carefully, and set :secure option to true.
618
+ # Default is <tt>secure: false</tt>.
601
619
  #
602
- # NOTE: This method calls #remove_entry_secure if :secure option is set.
603
- # See also #remove_entry_secure.
620
+ # NOTE: This method calls remove_entry_secure if :secure option is set.
621
+ # See also remove_entry_secure.
604
622
  #
605
623
  def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
606
624
  list = fu_list(list)
@@ -619,10 +637,10 @@ module FileUtils
619
637
  #
620
638
  # Equivalent to
621
639
  #
622
- # FileUtils.rm_r(list, :force => true)
640
+ # FileUtils.rm_r(list, force: true)
623
641
  #
624
642
  # WARNING: This method causes local vulnerability.
625
- # Read the documentation of #rm_r first.
643
+ # Read the documentation of rm_r first.
626
644
  #
627
645
  def rm_rf(list, noop: nil, verbose: nil, secure: nil)
628
646
  rm_r list, force: true, noop: noop, verbose: verbose, secure: secure
@@ -636,7 +654,7 @@ module FileUtils
636
654
  # This method removes a file system entry +path+. +path+ shall be a
637
655
  # regular file, a directory, or something. If +path+ is a directory,
638
656
  # remove it recursively. This method is required to avoid TOCTTOU
639
- # (time-of-check-to-time-of-use) local security vulnerability of #rm_r.
657
+ # (time-of-check-to-time-of-use) local security vulnerability of rm_r.
640
658
  # #rm_r causes security hole when:
641
659
  #
642
660
  # * Parent directory is world writable (including /tmp).
@@ -755,7 +773,7 @@ module FileUtils
755
773
  # +path+ might be a regular file, a directory, or something.
756
774
  # If +path+ is a directory, remove it recursively.
757
775
  #
758
- # See also #remove_entry_secure.
776
+ # See also remove_entry_secure.
759
777
  #
760
778
  def remove_entry(path, force = false)
761
779
  Entry_.new(path).postorder_traverse do |ent|
@@ -839,8 +857,8 @@ module FileUtils
839
857
  # mode to +mode+. If +dest+ is a directory, destination is +dest+/+src+.
840
858
  # This method removes destination before copy.
841
859
  #
842
- # FileUtils.install 'ruby', '/usr/local/bin/ruby', :mode => 0755, :verbose => true
843
- # FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', :verbose => true
860
+ # FileUtils.install 'ruby', '/usr/local/bin/ruby', mode: 0755, verbose: true
861
+ # FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', verbose: true
844
862
  #
845
863
  def install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil,
846
864
  noop: nil, verbose: nil)
@@ -970,12 +988,12 @@ module FileUtils
970
988
  # Absolute mode is
971
989
  # FileUtils.chmod 0755, 'somecommand'
972
990
  # FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
973
- # FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true
991
+ # FileUtils.chmod 0755, '/usr/bin/ruby', verbose: true
974
992
  #
975
993
  # Symbolic mode is
976
994
  # FileUtils.chmod "u=wrx,go=rx", 'somecommand'
977
995
  # FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
978
- # FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true
996
+ # FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', verbose: true
979
997
  #
980
998
  # "a" :: is user, group, other mask.
981
999
  # "u" :: is user's mask.
@@ -1035,7 +1053,7 @@ module FileUtils
1035
1053
  # the attribute.
1036
1054
  #
1037
1055
  # FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'
1038
- # FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), :verbose => true
1056
+ # FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), verbose: true
1039
1057
  #
1040
1058
  def chown(user, group, list, noop: nil, verbose: nil)
1041
1059
  list = fu_list(list)
@@ -1059,7 +1077,7 @@ module FileUtils
1059
1077
  # method does not change the attribute.
1060
1078
  #
1061
1079
  # FileUtils.chown_R 'www', 'www', '/var/www/htdocs'
1062
- # FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', :verbose => true
1080
+ # FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', verbose: true
1063
1081
  #
1064
1082
  def chown_R(user, group, list, noop: nil, verbose: nil, force: nil)
1065
1083
  list = fu_list(list)
@@ -1276,9 +1294,9 @@ module FileUtils
1276
1294
  opts[:encoding] = ::Encoding::UTF_8 if fu_windows?
1277
1295
 
1278
1296
  files = if Dir.respond_to?(:children)
1279
- Dir.children(path, opts)
1297
+ Dir.children(path, **opts)
1280
1298
  else
1281
- Dir.entries(path(), opts)
1299
+ Dir.entries(path(), **opts)
1282
1300
  .reject {|n| n == '.' or n == '..' }
1283
1301
  end
1284
1302
 
@@ -1369,18 +1387,21 @@ module FileUtils
1369
1387
  end
1370
1388
  when symlink?
1371
1389
  File.symlink File.readlink(path()), dest
1372
- when chardev?
1373
- raise "cannot handle device file" unless File.respond_to?(:mknod)
1374
- mknod dest, ?c, 0666, lstat().rdev
1375
- when blockdev?
1376
- raise "cannot handle device file" unless File.respond_to?(:mknod)
1377
- mknod dest, ?b, 0666, lstat().rdev
1390
+ when chardev?, blockdev?
1391
+ raise "cannot handle device file"
1378
1392
  when socket?
1379
- raise "cannot handle socket" unless File.respond_to?(:mknod)
1380
- mknod dest, nil, lstat().mode, 0
1393
+ begin
1394
+ require 'socket'
1395
+ rescue LoadError
1396
+ raise "cannot handle socket"
1397
+ else
1398
+ raise "cannot handle socket" unless defined?(UNIXServer)
1399
+ end
1400
+ UNIXServer.new(dest).close
1401
+ File.chmod lstat().mode, dest
1381
1402
  when pipe?
1382
1403
  raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
1383
- mkfifo dest, 0666
1404
+ File.mkfifo dest, lstat().mode
1384
1405
  when door?
1385
1406
  raise "cannot handle door: #{path()}"
1386
1407
  else
@@ -1499,14 +1520,14 @@ module FileUtils
1499
1520
 
1500
1521
  private
1501
1522
 
1502
- $fileutils_rb_have_lchmod = nil
1523
+ @@fileutils_rb_have_lchmod = nil
1503
1524
 
1504
1525
  def have_lchmod?
1505
1526
  # This is not MT-safe, but it does not matter.
1506
- if $fileutils_rb_have_lchmod == nil
1507
- $fileutils_rb_have_lchmod = check_have_lchmod?
1527
+ if @@fileutils_rb_have_lchmod == nil
1528
+ @@fileutils_rb_have_lchmod = check_have_lchmod?
1508
1529
  end
1509
- $fileutils_rb_have_lchmod
1530
+ @@fileutils_rb_have_lchmod
1510
1531
  end
1511
1532
 
1512
1533
  def check_have_lchmod?
@@ -1517,14 +1538,14 @@ module FileUtils
1517
1538
  return false
1518
1539
  end
1519
1540
 
1520
- $fileutils_rb_have_lchown = nil
1541
+ @@fileutils_rb_have_lchown = nil
1521
1542
 
1522
1543
  def have_lchown?
1523
1544
  # This is not MT-safe, but it does not matter.
1524
- if $fileutils_rb_have_lchown == nil
1525
- $fileutils_rb_have_lchown = check_have_lchown?
1545
+ if @@fileutils_rb_have_lchown == nil
1546
+ @@fileutils_rb_have_lchown = check_have_lchown?
1526
1547
  end
1527
- $fileutils_rb_have_lchown
1548
+ @@fileutils_rb_have_lchown
1528
1549
  end
1529
1550
 
1530
1551
  def check_have_lchown?
@@ -1546,10 +1567,13 @@ module FileUtils
1546
1567
  else
1547
1568
  DIRECTORY_TERM = "(?=/|\\z)"
1548
1569
  end
1549
- SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : ""
1550
1570
 
1551
1571
  def descendant_directory?(descendant, ascendant)
1552
- /\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant)
1572
+ if File::FNM_SYSCASE.nonzero?
1573
+ File.expand_path(File.dirname(descendant)).casecmp(File.expand_path(ascendant)) == 0
1574
+ else
1575
+ File.expand_path(File.dirname(descendant)) == File.expand_path(ascendant)
1576
+ end
1553
1577
  end
1554
1578
  end # class Entry_
1555
1579
 
@@ -1588,13 +1612,13 @@ module FileUtils
1588
1612
  end
1589
1613
  private_module_function :fu_same?
1590
1614
 
1591
- @fileutils_output = $stderr
1592
- @fileutils_label = ''
1593
-
1594
1615
  def fu_output_message(msg) #:nodoc:
1595
- @fileutils_output ||= $stderr
1596
- @fileutils_label ||= ''
1597
- @fileutils_output.puts @fileutils_label + msg
1616
+ output = @fileutils_output if defined?(@fileutils_output)
1617
+ output ||= $stderr
1618
+ if defined?(@fileutils_label)
1619
+ msg = @fileutils_label + msg
1620
+ end
1621
+ output.puts msg
1598
1622
  end
1599
1623
  private_module_function :fu_output_message
1600
1624
 
@@ -1605,8 +1629,11 @@ module FileUtils
1605
1629
  tbl
1606
1630
  }
1607
1631
 
1632
+ public
1633
+
1608
1634
  #
1609
- # Returns an Array of method names which have any options.
1635
+ # Returns an Array of names of high-level methods that accept any keyword
1636
+ # arguments.
1610
1637
  #
1611
1638
  # p FileUtils.commands #=> ["chmod", "cp", "cp_r", "install", ...]
1612
1639
  #
@@ -1645,7 +1672,7 @@ module FileUtils
1645
1672
  end
1646
1673
 
1647
1674
  #
1648
- # Returns an Array of method names which have the option +opt+.
1675
+ # Returns an Array of methods names which have the option +opt+.
1649
1676
  #
1650
1677
  # p FileUtils.collect_method(:preserve) #=> ["cp", "cp_r", "copy", "install"]
1651
1678
  #
@@ -1653,14 +1680,16 @@ module FileUtils
1653
1680
  OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
1654
1681
  end
1655
1682
 
1656
- LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern)
1657
- module LowMethods
1683
+ private
1684
+
1685
+ LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) # :nodoc:
1686
+ module LowMethods # :nodoc: internal use only
1658
1687
  private
1659
1688
  def _do_nothing(*)end
1660
1689
  ::FileUtils::LOW_METHODS.map {|name| alias_method name, :_do_nothing}
1661
1690
  end
1662
1691
 
1663
- METHODS = singleton_methods() - [:private_module_function,
1692
+ METHODS = singleton_methods() - [:private_module_function, # :nodoc:
1664
1693
  :commands, :options, :have_option?, :options_of, :collect_method]
1665
1694
 
1666
1695
  #
@@ -1670,8 +1699,6 @@ module FileUtils
1670
1699
  #
1671
1700
  module Verbose
1672
1701
  include FileUtils
1673
- @fileutils_output = $stderr
1674
- @fileutils_label = ''
1675
1702
  names = ::FileUtils.collect_method(:verbose)
1676
1703
  names.each do |name|
1677
1704
  module_eval(<<-EOS, __FILE__, __LINE__ + 1)
@@ -1695,8 +1722,6 @@ module FileUtils
1695
1722
  module NoWrite
1696
1723
  include FileUtils
1697
1724
  include LowMethods
1698
- @fileutils_output = $stderr
1699
- @fileutils_label = ''
1700
1725
  names = ::FileUtils.collect_method(:noop)
1701
1726
  names.each do |name|
1702
1727
  module_eval(<<-EOS, __FILE__, __LINE__ + 1)
@@ -1721,8 +1746,6 @@ module FileUtils
1721
1746
  module DryRun
1722
1747
  include FileUtils
1723
1748
  include LowMethods
1724
- @fileutils_output = $stderr
1725
- @fileutils_label = ''
1726
1749
  names = ::FileUtils.collect_method(:noop)
1727
1750
  names.each do |name|
1728
1751
  module_eval(<<-EOS, __FILE__, __LINE__ + 1)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FileUtils
4
- VERSION = "1.2.0"
4
+ VERSION = "1.3.0"
5
5
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fileutils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.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: 2019-03-27 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
11
+ date: 2019-09-26 00:00:00.000000000 Z
12
+ dependencies: []
27
13
  description: Several file utility methods for copying, moving, removing, etc.
28
14
  email:
29
15
  -