rbs 3.0.0.dev.2 → 3.0.0.dev.3

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.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -1
  3. data/.github/workflows/ruby.yml +4 -0
  4. data/Gemfile.lock +11 -11
  5. data/Rakefile +2 -2
  6. data/Steepfile +1 -1
  7. data/core/array.rbs +573 -423
  8. data/core/basic_object.rbs +11 -39
  9. data/core/binding.rbs +1 -1
  10. data/core/builtin.rbs +8 -0
  11. data/core/class.rbs +37 -0
  12. data/core/comparable.rbs +7 -18
  13. data/core/complex.rbs +2 -2
  14. data/core/data.rbs +419 -0
  15. data/core/dir.rbs +52 -104
  16. data/core/encoding.rbs +22 -181
  17. data/core/enumerable.rbs +212 -175
  18. data/core/enumerator/product.rbs +96 -0
  19. data/core/enumerator.rbs +57 -8
  20. data/core/errors.rbs +8 -2
  21. data/core/exception.rbs +41 -0
  22. data/core/fiber.rbs +95 -12
  23. data/core/file.rbs +840 -275
  24. data/core/file_test.rbs +34 -19
  25. data/core/float.rbs +40 -96
  26. data/core/gc.rbs +15 -3
  27. data/core/hash.rbs +113 -175
  28. data/core/integer.rbs +85 -145
  29. data/core/io/buffer.rbs +187 -60
  30. data/core/io/wait.rbs +28 -16
  31. data/core/io.rbs +1859 -1389
  32. data/core/kernel.rbs +525 -961
  33. data/core/match_data.rbs +306 -142
  34. data/core/math.rbs +506 -234
  35. data/core/method.rbs +0 -24
  36. data/core/module.rbs +110 -17
  37. data/core/nil_class.rbs +2 -0
  38. data/core/numeric.rbs +76 -144
  39. data/core/object.rbs +88 -212
  40. data/core/proc.rbs +17 -5
  41. data/core/process.rbs +22 -5
  42. data/core/ractor.rbs +1 -1
  43. data/core/random.rbs +20 -3
  44. data/core/range.rbs +91 -89
  45. data/core/rational.rbs +2 -3
  46. data/core/rbs/unnamed/argf.rbs +177 -120
  47. data/core/rbs/unnamed/env_class.rbs +89 -163
  48. data/core/rbs/unnamed/random.rbs +36 -12
  49. data/core/refinement.rbs +8 -0
  50. data/core/regexp.rbs +462 -272
  51. data/core/ruby_vm.rbs +210 -0
  52. data/{stdlib/set/0 → core}/set.rbs +43 -47
  53. data/core/string.rbs +1403 -1332
  54. data/core/string_io.rbs +191 -107
  55. data/core/struct.rbs +67 -63
  56. data/core/symbol.rbs +187 -201
  57. data/core/thread.rbs +40 -35
  58. data/core/time.rbs +902 -826
  59. data/core/trace_point.rbs +55 -6
  60. data/core/unbound_method.rbs +48 -24
  61. data/docs/collection.md +4 -0
  62. data/docs/syntax.md +55 -0
  63. data/ext/rbs_extension/parser.c +5 -6
  64. data/lib/rbs/cli.rb +6 -1
  65. data/lib/rbs/collection/cleaner.rb +8 -1
  66. data/lib/rbs/collection/config/lockfile.rb +3 -1
  67. data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
  68. data/lib/rbs/collection/config.rb +1 -1
  69. data/lib/rbs/collection/sources/git.rb +9 -2
  70. data/lib/rbs/collection/sources/local.rb +79 -0
  71. data/lib/rbs/collection/sources.rb +8 -1
  72. data/lib/rbs/environment.rb +6 -5
  73. data/lib/rbs/environment_loader.rb +3 -2
  74. data/lib/rbs/errors.rb +18 -0
  75. data/lib/rbs/locator.rb +26 -7
  76. data/lib/rbs/sorter.rb +2 -2
  77. data/lib/rbs/version.rb +1 -1
  78. data/sig/collection/sources.rbs +32 -3
  79. data/sig/environment.rbs +2 -3
  80. data/sig/locator.rbs +14 -2
  81. data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
  82. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
  83. data/stdlib/cgi/0/core.rbs +16 -0
  84. data/stdlib/coverage/0/coverage.rbs +50 -8
  85. data/stdlib/csv/0/csv.rbs +1 -1
  86. data/stdlib/date/0/date.rbs +856 -726
  87. data/stdlib/date/0/date_time.rbs +83 -210
  88. data/stdlib/erb/0/erb.rbs +13 -36
  89. data/stdlib/etc/0/etc.rbs +127 -20
  90. data/stdlib/fileutils/0/fileutils.rbs +1290 -381
  91. data/stdlib/logger/0/logger.rbs +466 -316
  92. data/stdlib/net-http/0/net-http.rbs +2211 -534
  93. data/stdlib/nkf/0/nkf.rbs +5 -5
  94. data/stdlib/objspace/0/objspace.rbs +31 -14
  95. data/stdlib/openssl/0/openssl.rbs +11 -7
  96. data/stdlib/optparse/0/optparse.rbs +20 -17
  97. data/stdlib/pathname/0/pathname.rbs +21 -4
  98. data/stdlib/pstore/0/pstore.rbs +378 -154
  99. data/stdlib/pty/0/pty.rbs +24 -8
  100. data/stdlib/ripper/0/ripper.rbs +1650 -0
  101. data/stdlib/socket/0/addrinfo.rbs +9 -15
  102. data/stdlib/socket/0/socket.rbs +36 -3
  103. data/stdlib/strscan/0/string_scanner.rbs +7 -5
  104. data/stdlib/tempfile/0/tempfile.rbs +104 -44
  105. data/stdlib/time/0/time.rbs +2 -2
  106. data/stdlib/uri/0/file.rbs +5 -0
  107. data/stdlib/uri/0/generic.rbs +2 -2
  108. data/stdlib/yaml/0/yaml.rbs +2 -2
  109. data/stdlib/zlib/0/zlib.rbs +1 -1
  110. metadata +8 -6
  111. data/core/deprecated.rbs +0 -9
  112. data/sig/shims/ripper.rbs +0 -8
@@ -1,100 +1,197 @@
1
1
  # <!-- rdoc-file=lib/fileutils.rb -->
2
- # # fileutils.rb
3
- #
4
- # Copyright (c) 2000-2007 Minero Aoki
5
- #
6
- # This program is free software. You can distribute/modify this program under
7
- # the same terms of ruby.
8
- #
9
- # ## module FileUtils
10
- #
11
- # Namespace for several file utility methods for copying, moving, removing, etc.
12
- #
13
- # ### Module Functions
14
- #
15
- # require 'fileutils'
16
- #
17
- # FileUtils.cd(dir, **options)
18
- # FileUtils.cd(dir, **options) {|dir| block }
19
- # FileUtils.pwd()
20
- # FileUtils.mkdir(dir, **options)
21
- # FileUtils.mkdir(list, **options)
22
- # FileUtils.mkdir_p(dir, **options)
23
- # FileUtils.mkdir_p(list, **options)
24
- # FileUtils.rmdir(dir, **options)
25
- # FileUtils.rmdir(list, **options)
26
- # FileUtils.ln(target, link, **options)
27
- # FileUtils.ln(targets, dir, **options)
28
- # FileUtils.ln_s(target, link, **options)
29
- # FileUtils.ln_s(targets, dir, **options)
30
- # FileUtils.ln_sf(target, link, **options)
31
- # FileUtils.cp(src, dest, **options)
32
- # FileUtils.cp(list, dir, **options)
33
- # FileUtils.cp_r(src, dest, **options)
34
- # FileUtils.cp_r(list, dir, **options)
35
- # FileUtils.mv(src, dest, **options)
36
- # FileUtils.mv(list, dir, **options)
37
- # FileUtils.rm(list, **options)
38
- # FileUtils.rm_r(list, **options)
39
- # FileUtils.rm_rf(list, **options)
40
- # FileUtils.install(src, dest, **options)
41
- # FileUtils.chmod(mode, list, **options)
42
- # FileUtils.chmod_R(mode, list, **options)
43
- # FileUtils.chown(user, group, list, **options)
44
- # FileUtils.chown_R(user, group, list, **options)
45
- # FileUtils.touch(list, **options)
46
- #
47
- # Possible `options` are:
48
- #
49
- # `:force`
50
- # : forced operation (rewrite files if exist, remove directories if not empty,
51
- # etc.);
52
- # `:verbose`
53
- # : print command to be run, in bash syntax, before performing it;
54
- # `:preserve`
55
- # : preserve object's group, user and modification time on copying;
56
- # `:noop`
57
- # : no changes are made (usable in combination with `:verbose` which will
58
- # print the command to run)
59
- #
60
- #
61
- # Each method documents the options that it honours. See also ::commands,
62
- # ::options and ::options_of methods to introspect which command have which
63
- # options.
64
- #
65
- # All methods that have the concept of a "source" file or directory can take
66
- # either one file or a list of files in that argument. See the method
67
- # documentation for examples.
68
- #
69
- # There are some `low level' methods, which do not accept keyword arguments:
70
- #
71
- # FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
72
- # FileUtils.copy_file(src, dest, preserve = false, dereference = true)
73
- # FileUtils.copy_stream(srcstream, deststream)
74
- # FileUtils.remove_entry(path, force = false)
75
- # FileUtils.remove_entry_secure(path, force = false)
76
- # FileUtils.remove_file(path, force = false)
77
- # FileUtils.compare_file(path_a, path_b)
78
- # FileUtils.compare_stream(stream_a, stream_b)
79
- # FileUtils.uptodate?(file, cmp_list)
80
- #
81
- # ## module FileUtils::Verbose
82
- #
83
- # This module has all methods of FileUtils module, but it outputs messages
84
- # before acting. This equates to passing the `:verbose` flag to methods in
85
- # FileUtils.
86
- #
87
- # ## module FileUtils::NoWrite
88
- #
89
- # This module has all methods of FileUtils module, but never changes
90
- # files/directories. This equates to passing the `:noop` flag to methods in
91
- # FileUtils.
92
- #
93
- # ## module FileUtils::DryRun
94
- #
95
- # This module has all methods of FileUtils module, but never changes
96
- # files/directories. This equates to passing the `:noop` and `:verbose` flags
97
- # to methods in FileUtils.
2
+ # Namespace for file utility methods for copying, moving, removing, etc.
3
+ #
4
+ # ## What's Here
5
+ #
6
+ # First, what’s elsewhere. Module FileUtils:
7
+ #
8
+ # * Inherits from [class Object](rdoc-ref:Object).
9
+ # * Supplements [class File](rdoc-ref:File) (but is not included or extended
10
+ # there).
11
+ #
12
+ #
13
+ # Here, module FileUtils provides methods that are useful for:
14
+ #
15
+ # * [Creating](rdoc-ref:FileUtils@Creating).
16
+ # * [Deleting](rdoc-ref:FileUtils@Deleting).
17
+ # * [Querying](rdoc-ref:FileUtils@Querying).
18
+ # * [Setting](rdoc-ref:FileUtils@Setting).
19
+ # * [Comparing](rdoc-ref:FileUtils@Comparing).
20
+ # * [Copying](rdoc-ref:FileUtils@Copying).
21
+ # * [Moving](rdoc-ref:FileUtils@Moving).
22
+ # * [Options](rdoc-ref:FileUtils@Options).
23
+ #
24
+ #
25
+ # ### Creating
26
+ #
27
+ # * ::mkdir: Creates directories.
28
+ # * ::mkdir_p, ::makedirs, ::mkpath: Creates directories, also creating
29
+ # ancestor directories as needed.
30
+ # * ::link_entry: Creates a hard link.
31
+ # * ::ln, ::link: Creates hard links.
32
+ # * ::ln_s, ::symlink: Creates symbolic links.
33
+ # * ::ln_sf: Creates symbolic links, overwriting if necessary.
34
+ # * ::ln_sr: Creates symbolic links relative to targets
35
+ #
36
+ #
37
+ # ### Deleting
38
+ #
39
+ # * ::remove_dir: Removes a directory and its descendants.
40
+ # * ::remove_entry: Removes an entry, including its descendants if it is a
41
+ # directory.
42
+ # * ::remove_entry_secure: Like ::remove_entry, but removes securely.
43
+ # * ::remove_file: Removes a file entry.
44
+ # * ::rm, ::remove: Removes entries.
45
+ # * ::rm_f, ::safe_unlink: Like ::rm, but removes forcibly.
46
+ # * ::rm_r: Removes entries and their descendants.
47
+ # * ::rm_rf, ::rmtree: Like ::rm_r, but removes forcibly.
48
+ # * ::rmdir: Removes directories.
49
+ #
50
+ #
51
+ # ### Querying
52
+ #
53
+ # * ::pwd, ::getwd: Returns the path to the working directory.
54
+ # * ::uptodate?: Returns whether a given entry is newer than given other
55
+ # entries.
56
+ #
57
+ #
58
+ # ### Setting
59
+ #
60
+ # * ::cd, ::chdir: Sets the working directory.
61
+ # * ::chmod: Sets permissions for an entry.
62
+ # * ::chmod_R: Sets permissions for an entry and its descendants.
63
+ # * ::chown: Sets the owner and group for entries.
64
+ # * ::chown_R: Sets the owner and group for entries and their descendants.
65
+ # * ::touch: Sets modification and access times for entries, creating if
66
+ # necessary.
67
+ #
68
+ #
69
+ # ### Comparing
70
+ #
71
+ # * ::compare_file, ::cmp, ::identical?: Returns whether two entries are
72
+ # identical.
73
+ # * ::compare_stream: Returns whether two streams are identical.
74
+ #
75
+ #
76
+ # ### Copying
77
+ #
78
+ # * ::copy_entry: Recursively copies an entry.
79
+ # * ::copy_file: Copies an entry.
80
+ # * ::copy_stream: Copies a stream.
81
+ # * ::cp, ::copy: Copies files.
82
+ # * ::cp_lr: Recursively creates hard links.
83
+ # * ::cp_r: Recursively copies files, retaining mode, owner, and group.
84
+ # * ::install: Recursively copies files, optionally setting mode, owner, and
85
+ # group.
86
+ #
87
+ #
88
+ # ### Moving
89
+ #
90
+ # * ::mv, ::move: Moves entries.
91
+ #
92
+ #
93
+ # ### Options
94
+ #
95
+ # * ::collect_method: Returns the names of methods that accept a given option.
96
+ # * ::commands: Returns the names of methods that accept options.
97
+ # * ::have_option?: Returns whether a given method accepts a given option.
98
+ # * ::options: Returns all option names.
99
+ # * ::options_of: Returns the names of the options for a given method.
100
+ #
101
+ #
102
+ # ## Path Arguments
103
+ #
104
+ # Some methods in FileUtils accept *path* arguments, which are interpreted as
105
+ # paths to filesystem entries:
106
+ #
107
+ # * If the argument is a string, that value is the path.
108
+ # * If the argument has method `:to_path`, it is converted via that method.
109
+ # * If the argument has method `:to_str`, it is converted via that method.
110
+ #
111
+ #
112
+ # ## About the Examples
113
+ #
114
+ # Some examples here involve trees of file entries. For these, we sometimes
115
+ # display trees using the [tree command-line
116
+ # utility](https://en.wikipedia.org/wiki/Tree_(command)), which is a recursive
117
+ # directory-listing utility that produces a depth-indented listing of files and
118
+ # directories.
119
+ #
120
+ # We use a helper method to launch the command and control the format:
121
+ #
122
+ # def tree(dirpath = '.')
123
+ # command = "tree --noreport --charset=ascii #{dirpath}"
124
+ # system(command)
125
+ # end
126
+ #
127
+ # To illustrate:
128
+ #
129
+ # tree('src0')
130
+ # # => src0
131
+ # # |-- sub0
132
+ # # | |-- src0.txt
133
+ # # | `-- src1.txt
134
+ # # `-- sub1
135
+ # # |-- src2.txt
136
+ # # `-- src3.txt
137
+ #
138
+ # ## Avoiding the TOCTTOU Vulnerability
139
+ #
140
+ # For certain methods that recursively remove entries, there is a potential
141
+ # vulnerability called the [Time-of-check to
142
+ # time-of-use](https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use), or
143
+ # TOCTTOU, vulnerability that can exist when:
144
+ #
145
+ # * An ancestor directory of the entry at the target path is world writable;
146
+ # such directories include `/tmp`.
147
+ # * The directory tree at the target path includes:
148
+ #
149
+ # * A world-writable descendant directory.
150
+ # * A symbolic link.
151
+ #
152
+ #
153
+ #
154
+ # To avoid that vulnerability, you can use this method to remove entries:
155
+ #
156
+ # * FileUtils.remove_entry_secure: removes recursively if the target path
157
+ # points to a directory.
158
+ #
159
+ #
160
+ # Also available are these methods, each of which calls
161
+ # FileUtils.remove_entry_secure:
162
+ #
163
+ # * FileUtils.rm_r with keyword argument `secure: true`.
164
+ # * FileUtils.rm_rf with keyword argument `secure: true`.
165
+ #
166
+ #
167
+ # Finally, this method for moving entries calls FileUtils.remove_entry_secure if
168
+ # the source and destination are on different file systems (which means that the
169
+ # "move" is really a copy and remove):
170
+ #
171
+ # * FileUtils.mv with keyword argument `secure: true`.
172
+ #
173
+ #
174
+ # Method FileUtils.remove_entry_secure removes securely by applying a special
175
+ # pre-process:
176
+ #
177
+ # * If the target path points to a directory, this method uses methods
178
+ # [File#chown](rdoc-ref:File#chown) and [File#chmod](rdoc-ref:File#chmod) in
179
+ # removing directories.
180
+ # * The owner of the target directory should be either the current process or
181
+ # the super user (root).
182
+ #
183
+ #
184
+ # WARNING: You must ensure that **ALL** parent directories cannot be moved by
185
+ # other untrusted users. For example, parent directories should not be owned by
186
+ # untrusted users, and should not be world writable except when the sticky bit
187
+ # is set.
188
+ #
189
+ # For details of this security vulnerability, see Perl cases:
190
+ #
191
+ # * [CVE-2005-0448](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-04
192
+ # 48).
193
+ # * [CVE-2004-0452](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-04
194
+ # 52).
98
195
  #
99
196
  module FileUtils
100
197
  VERSION: String
@@ -109,18 +206,41 @@ module FileUtils
109
206
  # rdoc-file=lib/fileutils.rb
110
207
  # - cd(dir, verbose: nil) { |dir| ... }
111
208
  # -->
112
- # Changes the current directory to the directory `dir`.
209
+ # Changes the working directory to the given `dir`, which should be
210
+ # [interpretable as a path](rdoc-ref:FileUtils@Path+Arguments):
211
+ #
212
+ # With no block given, changes the current directory to the directory at `dir`;
213
+ # returns zero:
214
+ #
215
+ # FileUtils.pwd # => "/rdoc/fileutils"
216
+ # FileUtils.cd('..')
217
+ # FileUtils.pwd # => "/rdoc"
218
+ # FileUtils.cd('fileutils')
219
+ #
220
+ # With a block given, changes the current directory to the directory at `dir`,
221
+ # calls the block with argument `dir`, and restores the original current
222
+ # directory; returns the block's value:
223
+ #
224
+ # FileUtils.pwd # => "/rdoc/fileutils"
225
+ # FileUtils.cd('..') { |arg| [arg, FileUtils.pwd] } # => ["..", "/rdoc"]
226
+ # FileUtils.pwd # => "/rdoc/fileutils"
227
+ #
228
+ # Keyword arguments:
229
+ #
230
+ # * `verbose: true` - prints an equivalent command:
231
+ #
232
+ # FileUtils.cd('..')
233
+ # FileUtils.cd('fileutils')
234
+ #
235
+ # Output:
113
236
  #
114
- # If this method is called with block, resumes to the previous working directory
115
- # after the block execution has finished.
237
+ # cd ..
238
+ # cd fileutils
116
239
  #
117
- # FileUtils.cd('/') # change directory
118
240
  #
119
- # FileUtils.cd('/', verbose: true) # change directory and report it
241
+ # FileUtils.chdir is an alias for FileUtils.cd.
120
242
  #
121
- # FileUtils.cd('/') do # change directory
122
- # # ... # do something
123
- # end # return to original directory
243
+ # Related: FileUtils.pwd.
124
244
  #
125
245
  def self?.cd: (path dir, ?verbose: boolish) -> void
126
246
  | [X] (path dir, ?verbose: boolish) { (String) -> X } -> X
@@ -143,48 +263,82 @@ module FileUtils
143
263
  # rdoc-file=lib/fileutils.rb
144
264
  # - chmod(mode, list, noop: nil, verbose: nil)
145
265
  # -->
146
- # Changes permission bits on the named files (in `list`) to the bit pattern
147
- # represented by `mode`.
148
- #
149
- # `mode` is the symbolic and absolute mode can be used.
150
- #
151
- # Absolute mode is
152
- # FileUtils.chmod 0755, 'somecommand'
153
- # FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
154
- # FileUtils.chmod 0755, '/usr/bin/ruby', verbose: true
155
- #
156
- # Symbolic mode is
157
- # FileUtils.chmod "u=wrx,go=rx", 'somecommand'
158
- # FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
159
- # FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', verbose: true
160
- #
161
- # "a"
162
- # : is user, group, other mask.
163
- # "u"
164
- # : is user's mask.
165
- # "g"
166
- # : is group's mask.
167
- # "o"
168
- # : is other's mask.
169
- # "w"
170
- # : is write permission.
171
- # "r"
172
- # : is read permission.
173
- # "x"
174
- # : is execute permission.
175
- # "X"
176
- # : is execute permission for directories only, must be used in conjunction
177
- # with "+"
178
- # "s"
179
- # : is uid, gid.
180
- # "t"
181
- # : is sticky bit.
182
- # "+"
183
- # : is added to a class given the specified mode.
184
- # "-"
185
- # : Is removed from a given class given mode.
186
- # "="
187
- # : Is the exact nature of the class will be given a specified mode.
266
+ # Changes permissions on the entries at the paths given in `list` (a single path
267
+ # or an array of paths) to the permissions given by `mode`; returns `list` if it
268
+ # is an array, `[list]` otherwise:
269
+ #
270
+ # * Modifies each entry that is a regular file using
271
+ # [File.chmod](rdoc-ref:File.chmod).
272
+ # * Modifies each entry that is a symbolic link using
273
+ # [File.lchmod](rdoc-ref:File.lchmod).
274
+ #
275
+ #
276
+ # Argument `list` or its elements should be [interpretable as
277
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
278
+ #
279
+ # Argument `mode` may be either an integer or a string:
280
+ #
281
+ # * Integer `mode`: represents the permission bits to be set:
282
+ #
283
+ # FileUtils.chmod(0755, 'src0.txt')
284
+ # FileUtils.chmod(0644, ['src0.txt', 'src0.dat'])
285
+ #
286
+ # * String `mode`: represents the permissions to be set:
287
+ #
288
+ # The string is of the form `[targets][[operator][perms[,perms]]`, where:
289
+ #
290
+ # * `targets` may be any combination of these letters:
291
+ #
292
+ # * `'u'`: permissions apply to the file's owner.
293
+ # * `'g'`: permissions apply to users in the file's group.
294
+ # * `'o'`: permissions apply to other users not in the file's group.
295
+ # * `'a'` (the default): permissions apply to all users.
296
+ #
297
+ #
298
+ # * `operator` may be one of these letters:
299
+ #
300
+ # * `'+'`: adds permissions.
301
+ # * `'-'`: removes permissions.
302
+ # * `'='`: sets (replaces) permissions.
303
+ #
304
+ #
305
+ # * `perms` (may be repeated, with separating commas) may be any
306
+ # combination of these letters:
307
+ #
308
+ # * `'r'`: Read.
309
+ # * `'w'`: Write.
310
+ # * `'x'`: Execute (search, for a directory).
311
+ # * `'X'`: Search (for a directories only; must be used with `'+'`)
312
+ # * `'s'`: Uid or gid.
313
+ # * `'t'`: Sticky bit.
314
+ #
315
+ #
316
+ #
317
+ # Examples:
318
+ #
319
+ # FileUtils.chmod('u=wrx,go=rx', 'src1.txt')
320
+ # FileUtils.chmod('u=wrx,go=rx', '/usr/bin/ruby')
321
+ #
322
+ #
323
+ # Keyword arguments:
324
+ #
325
+ # * `noop: true` - does not change permissions; returns `nil`.
326
+ # * `verbose: true` - prints an equivalent command:
327
+ #
328
+ # FileUtils.chmod(0755, 'src0.txt', noop: true, verbose: true)
329
+ # FileUtils.chmod(0644, ['src0.txt', 'src0.dat'], noop: true, verbose: true)
330
+ # FileUtils.chmod('u=wrx,go=rx', 'src1.txt', noop: true, verbose: true)
331
+ # FileUtils.chmod('u=wrx,go=rx', '/usr/bin/ruby', noop: true, verbose: true)
332
+ #
333
+ # Output:
334
+ #
335
+ # chmod 755 src0.txt
336
+ # chmod 644 src0.txt src0.dat
337
+ # chmod u=wrx,go=rx src1.txt
338
+ # chmod u=wrx,go=rx /usr/bin/ruby
339
+ #
340
+ #
341
+ # Related: FileUtils.chmod_R.
188
342
  #
189
343
  def self?.chmod: (mode mode, pathlist list, ?noop: boolish, ?verbose: boolish) -> void
190
344
 
@@ -192,11 +346,7 @@ module FileUtils
192
346
  # rdoc-file=lib/fileutils.rb
193
347
  # - chmod_R(mode, list, noop: nil, verbose: nil, force: nil)
194
348
  # -->
195
- # Changes permission bits on the named files (in `list`) to the bit pattern
196
- # represented by `mode`.
197
- #
198
- # FileUtils.chmod_R 0700, "/tmp/app.#{$$}"
199
- # FileUtils.chmod_R "u=wrx", "/tmp/app.#{$$}"
349
+ # Like FileUtils.chmod, but changes permissions recursively.
200
350
  #
201
351
  def self?.chmod_R: (mode mode, pathlist list, ?noop: boolish, ?verbose: boolish, ?force: boolish) -> void
202
352
 
@@ -204,13 +354,70 @@ module FileUtils
204
354
  # rdoc-file=lib/fileutils.rb
205
355
  # - chown(user, group, list, noop: nil, verbose: nil)
206
356
  # -->
207
- # Changes owner and group on the named files (in `list`) to the user `user` and
208
- # the group `group`. `user` and `group` may be an ID (Integer/String) or a name
209
- # (String). If `user` or `group` is nil, this method does not change the
210
- # attribute.
357
+ # Changes the owner and group on the entries at the paths given in `list` (a
358
+ # single path or an array of paths) to the given `user` and `group`; returns
359
+ # `list` if it is an array, `[list]` otherwise:
211
360
  #
212
- # FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'
213
- # FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), verbose: true
361
+ # * Modifies each entry that is a regular file using
362
+ # [File.chown](rdoc-ref:File.chown).
363
+ # * Modifies each entry that is a symbolic link using
364
+ # [File.lchown](rdoc-ref:File.lchown).
365
+ #
366
+ #
367
+ # Argument `list` or its elements should be [interpretable as
368
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
369
+ #
370
+ # User and group:
371
+ #
372
+ # * Argument `user` may be a user name or a user id; if `nil` or `-1`, the
373
+ # user is not changed.
374
+ # * Argument `group` may be a group name or a group id; if `nil` or `-1`, the
375
+ # group is not changed.
376
+ # * The user must be a member of the group.
377
+ #
378
+ #
379
+ # Examples:
380
+ #
381
+ # # One path.
382
+ # # User and group as string names.
383
+ # File.stat('src0.txt').uid # => 1004
384
+ # File.stat('src0.txt').gid # => 1004
385
+ # FileUtils.chown('user2', 'group1', 'src0.txt')
386
+ # File.stat('src0.txt').uid # => 1006
387
+ # File.stat('src0.txt').gid # => 1005
388
+ #
389
+ # # User and group as uid and gid.
390
+ # FileUtils.chown(1004, 1004, 'src0.txt')
391
+ # File.stat('src0.txt').uid # => 1004
392
+ # File.stat('src0.txt').gid # => 1004
393
+ #
394
+ # # Array of paths.
395
+ # FileUtils.chown(1006, 1005, ['src0.txt', 'src0.dat'])
396
+ #
397
+ # # Directory (not recursive).
398
+ # FileUtils.chown('user2', 'group1', '.')
399
+ #
400
+ # Keyword arguments:
401
+ #
402
+ # * `noop: true` - does not change permissions; returns `nil`.
403
+ # * `verbose: true` - prints an equivalent command:
404
+ #
405
+ # FileUtils.chown('user2', 'group1', 'src0.txt', noop: true, verbose: true)
406
+ # FileUtils.chown(1004, 1004, 'src0.txt', noop: true, verbose: true)
407
+ # FileUtils.chown(1006, 1005, ['src0.txt', 'src0.dat'], noop: true, verbose: true)
408
+ # FileUtils.chown('user2', 'group1', path, noop: true, verbose: true)
409
+ # FileUtils.chown('user2', 'group1', '.', noop: true, verbose: true)
410
+ #
411
+ # Output:
412
+ #
413
+ # chown user2:group1 src0.txt
414
+ # chown 1004:1004 src0.txt
415
+ # chown 1006:1005 src0.txt src0.dat
416
+ # chown user2:group1 src0.txt
417
+ # chown user2:group1 .
418
+ #
419
+ #
420
+ # Related: FileUtils.chown_R.
214
421
  #
215
422
  def self?.chown: (String? user, String? group, pathlist list, ?noop: boolish, ?verbose: boolish) -> void
216
423
 
@@ -218,13 +425,7 @@ module FileUtils
218
425
  # rdoc-file=lib/fileutils.rb
219
426
  # - chown_R(user, group, list, noop: nil, verbose: nil, force: nil)
220
427
  # -->
221
- # Changes owner and group on the named files (in `list`) to the user `user` and
222
- # the group `group` recursively. `user` and `group` may be an ID
223
- # (Integer/String) or a name (String). If `user` or `group` is nil, this method
224
- # does not change the attribute.
225
- #
226
- # FileUtils.chown_R 'www', 'www', '/var/www/htdocs'
227
- # FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', verbose: true
428
+ # Like FileUtils.chown, but changes owner and group recursively.
228
429
  #
229
430
  def self?.chown_R: (String? user, String? group, pathlist list, ?noop: boolish, ?verbose: boolish, ?force: boolish) -> void
230
431
 
@@ -232,9 +433,10 @@ module FileUtils
232
433
  # rdoc-file=lib/fileutils.rb
233
434
  # - collect_method(opt)
234
435
  # -->
235
- # Returns an Array of methods names which have the option `opt`.
436
+ # Returns an array of the string method names of the methods that accept the
437
+ # given keyword option `opt`; the argument must be a symbol:
236
438
  #
237
- # p FileUtils.collect_method(:preserve) #=> ["cp", "cp_r", "copy", "install"]
439
+ # FileUtils.collect_method(:preserve) # => ["cp", "copy", "cp_r", "install"]
238
440
  #
239
441
  def self.collect_method: (Symbol opt) -> Array[String]
240
442
 
@@ -242,10 +444,10 @@ module FileUtils
242
444
  # rdoc-file=lib/fileutils.rb
243
445
  # - commands()
244
446
  # -->
245
- # Returns an Array of names of high-level methods that accept any keyword
246
- # arguments.
447
+ # Returns an array of the string names of FileUtils methods that accept one or
448
+ # more keyword arguments:
247
449
  #
248
- # p FileUtils.commands #=> ["chmod", "cp", "cp_r", "install", ...]
450
+ # FileUtils.commands.sort.take(3) # => ["cd", "chdir", "chmod"]
249
451
  #
250
452
  def self.commands: () -> Array[String]
251
453
 
@@ -253,10 +455,15 @@ module FileUtils
253
455
  # rdoc-file=lib/fileutils.rb
254
456
  # - compare_file(a, b)
255
457
  # -->
256
- # Returns true if the contents of a file `a` and a file `b` are identical.
458
+ # Returns `true` if the contents of files `a` and `b` are identical, `false`
459
+ # otherwise.
460
+ #
461
+ # Arguments `a` and `b` should be [interpretable as a
462
+ # path](rdoc-ref:FileUtils@Path+Arguments).
463
+ #
464
+ # FileUtils.identical? and FileUtils.cmp are aliases for FileUtils.compare_file.
257
465
  #
258
- # FileUtils.compare_file('somefile', 'somefile') #=> true
259
- # FileUtils.compare_file('/dev/null', '/dev/urandom') #=> false
466
+ # Related: FileUtils.compare_stream.
260
467
  #
261
468
  def self?.compare_file: (path a, path b) -> bool
262
469
 
@@ -292,7 +499,13 @@ module FileUtils
292
499
  # rdoc-file=lib/fileutils.rb
293
500
  # - compare_stream(a, b)
294
501
  # -->
295
- # Returns true if the contents of a stream `a` and `b` are identical.
502
+ # Returns `true` if the contents of streams `a` and `b` are identical, `false`
503
+ # otherwise.
504
+ #
505
+ # Arguments `a` and `b` should be [interpretable as a
506
+ # path](rdoc-ref:FileUtils@Path+Arguments).
507
+ #
508
+ # Related: FileUtils.compare_file.
296
509
  #
297
510
  def self?.compare_stream: (IO a, IO b) -> bool
298
511
 
@@ -300,20 +513,50 @@ module FileUtils
300
513
  # rdoc-file=lib/fileutils.rb
301
514
  # - copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
302
515
  # -->
303
- # Copies a file system entry `src` to `dest`. If `src` is a directory, this
304
- # method copies its contents recursively. This method preserves file types, c.f.
305
- # symlink, directory... (FIFO, device files and etc. are not supported yet)
516
+ # Recursively copies files from `src` to `dest`.
517
+ #
518
+ # Arguments `src` and `dest` should be [interpretable as
519
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
520
+ #
521
+ # If `src` is the path to a file, copies `src` to `dest`:
522
+ #
523
+ # FileUtils.touch('src0.txt')
524
+ # File.exist?('dest0.txt') # => false
525
+ # FileUtils.copy_entry('src0.txt', 'dest0.txt')
526
+ # File.file?('dest0.txt') # => true
306
527
  #
307
- # Both of `src` and `dest` must be a path name. `src` must exist, `dest` must
308
- # not exist.
528
+ # If `src` is a directory, recursively copies `src` to `dest`:
309
529
  #
310
- # If `preserve` is true, this method preserves owner, group, and modified time.
311
- # Permissions are copied regardless `preserve`.
530
+ # tree('src1')
531
+ # # => src1
532
+ # # |-- dir0
533
+ # # | |-- src0.txt
534
+ # # | `-- src1.txt
535
+ # # `-- dir1
536
+ # # |-- src2.txt
537
+ # # `-- src3.txt
538
+ # FileUtils.copy_entry('src1', 'dest1')
539
+ # tree('dest1')
540
+ # # => dest1
541
+ # # |-- dir0
542
+ # # | |-- src0.txt
543
+ # # | `-- src1.txt
544
+ # # `-- dir1
545
+ # # |-- src2.txt
546
+ # # `-- src3.txt
312
547
  #
313
- # If `dereference_root` is true, this method dereference tree root.
548
+ # The recursive copying preserves file types for regular files, directories, and
549
+ # symbolic links; other file types (FIFO streams, device files, etc.) are not
550
+ # supported.
314
551
  #
315
- # If `remove_destination` is true, this method removes each destination file
316
- # before copy.
552
+ # Keyword arguments:
553
+ #
554
+ # * `dereference_root: true` - if `src` is a symbolic link, follows the link.
555
+ # * `preserve: true` - preserves file times.
556
+ # * `remove_destination: true` - removes `dest` before copying files.
557
+ #
558
+ #
559
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
317
560
  #
318
561
  def self?.copy_entry: (path src, path dest, ?boolish preserve, ?boolish dereference_root, ?boolish remove_destination) -> void
319
562
 
@@ -321,8 +564,26 @@ module FileUtils
321
564
  # rdoc-file=lib/fileutils.rb
322
565
  # - copy_file(src, dest, preserve = false, dereference = true)
323
566
  # -->
324
- # Copies file contents of `src` to `dest`. Both of `src` and `dest` must be a
325
- # path name.
567
+ # Copies file from `src` to `dest`, which should not be directories.
568
+ #
569
+ # Arguments `src` and `dest` should be [interpretable as
570
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
571
+ #
572
+ # Examples:
573
+ #
574
+ # FileUtils.touch('src0.txt')
575
+ # FileUtils.copy_file('src0.txt', 'dest0.txt')
576
+ # File.file?('dest0.txt') # => true
577
+ #
578
+ # Keyword arguments:
579
+ #
580
+ # * `dereference: false` - if `src` is a symbolic link, does not follow the
581
+ # link.
582
+ # * `preserve: true` - preserves file times.
583
+ # * `remove_destination: true` - removes `dest` before copying files.
584
+ #
585
+ #
586
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
326
587
  #
327
588
  def self?.copy_file: (path src, path dest, ?boolish preserve, ?boolish dereference) -> void
328
589
 
@@ -330,8 +591,10 @@ module FileUtils
330
591
  # rdoc-file=lib/fileutils.rb
331
592
  # - copy_stream(src, dest)
332
593
  # -->
333
- # Copies stream `src` to `dest`. `src` must respond to #read(n) and `dest` must
334
- # respond to #write(str).
594
+ # Copies IO stream `src` to IO stream `dest` via
595
+ # [IO.copy_stream](rdoc-ref:IO.copy_stream).
596
+ #
597
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
335
598
  #
336
599
  def self?.copy_stream: (_Reader src, _Writer dest) -> void
337
600
 
@@ -339,15 +602,59 @@ module FileUtils
339
602
  # rdoc-file=lib/fileutils.rb
340
603
  # - cp(src, dest, preserve: nil, noop: nil, verbose: nil)
341
604
  # -->
342
- # Copies a file content `src` to `dest`. If `dest` is a directory, copies `src`
343
- # to `dest/src`.
605
+ # Copies files.
606
+ #
607
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
608
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments).
609
+ #
610
+ # If `src` is the path to a file and `dest` is not the path to a directory,
611
+ # copies `src` to `dest`:
612
+ #
613
+ # FileUtils.touch('src0.txt')
614
+ # File.exist?('dest0.txt') # => false
615
+ # FileUtils.cp('src0.txt', 'dest0.txt')
616
+ # File.file?('dest0.txt') # => true
617
+ #
618
+ # If `src` is the path to a file and `dest` is the path to a directory, copies
619
+ # `src` to `dest/src`:
344
620
  #
345
- # If `src` is a list of files, then `dest` must be a directory.
621
+ # FileUtils.touch('src1.txt')
622
+ # FileUtils.mkdir('dest1')
623
+ # FileUtils.cp('src1.txt', 'dest1')
624
+ # File.file?('dest1/src1.txt') # => true
346
625
  #
347
- # FileUtils.cp 'eval.c', 'eval.c.org'
348
- # FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
349
- # FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', verbose: true
350
- # FileUtils.cp 'symlink', 'dest' # copy content, "dest" is not a symlink
626
+ # If `src` is an array of paths to files and `dest` is the path to a directory,
627
+ # copies from each `src` to `dest`:
628
+ #
629
+ # src_file_paths = ['src2.txt', 'src2.dat']
630
+ # FileUtils.touch(src_file_paths)
631
+ # FileUtils.mkdir('dest2')
632
+ # FileUtils.cp(src_file_paths, 'dest2')
633
+ # File.file?('dest2/src2.txt') # => true
634
+ # File.file?('dest2/src2.dat') # => true
635
+ #
636
+ # Keyword arguments:
637
+ #
638
+ # * `preserve: true` - preserves file times.
639
+ # * `noop: true` - does not copy files.
640
+ # * `verbose: true` - prints an equivalent command:
641
+ #
642
+ # FileUtils.cp('src0.txt', 'dest0.txt', noop: true, verbose: true)
643
+ # FileUtils.cp('src1.txt', 'dest1', noop: true, verbose: true)
644
+ # FileUtils.cp(src_file_paths, 'dest2', noop: true, verbose: true)
645
+ #
646
+ # Output:
647
+ #
648
+ # cp src0.txt dest0.txt
649
+ # cp src1.txt dest1
650
+ # cp src2.txt src2.dat dest2
651
+ #
652
+ #
653
+ # Raises an exception if `src` is a directory.
654
+ #
655
+ # FileUtils.copy is an alias for FileUtils.cp.
656
+ #
657
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
351
658
  #
352
659
  def self?.cp: (pathlist src, path dest, ?preserve: boolish, ?noop: boolish, ?verbose: boolish) -> void
353
660
 
@@ -369,27 +676,102 @@ module FileUtils
369
676
  # rdoc-file=lib/fileutils.rb
370
677
  # - cp_lr(src, dest, noop: nil, verbose: nil, dereference_root: true, remove_destination: false)
371
678
  # -->
372
- # Hard link `src` to `dest`. If `src` is a directory, this method links all its
373
- # contents recursively. If `dest` is a directory, links `src` to `dest/src`.
374
- #
375
- # `src` can be a list of files.
376
- #
377
- # If `dereference_root` is true, this method dereference tree root.
378
- #
379
- # If `remove_destination` is true, this method removes each destination file
380
- # before copy.
381
- #
382
- # FileUtils.rm_r site_ruby + '/mylib', force: true
383
- # FileUtils.cp_lr 'lib/', site_ruby + '/mylib'
384
- #
385
- # # Examples of linking several files to target directory.
386
- # FileUtils.cp_lr %w(mail.rb field.rb debug/), site_ruby + '/tmail'
387
- # FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', noop: true, verbose: true
388
- #
389
- # # If you want to link all contents of a directory instead of the
390
- # # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
391
- # # use the following code.
392
- # FileUtils.cp_lr 'src/.', 'dest' # cp_lr('src', 'dest') makes dest/src, but this doesn't.
679
+ # Creates [hard links](https://en.wikipedia.org/wiki/Hard_link).
680
+ #
681
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
682
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments).
683
+ #
684
+ # If `src` is the path to a directory and `dest` does not exist, creates links
685
+ # `dest` and descendents pointing to `src` and its descendents:
686
+ #
687
+ # tree('src0')
688
+ # # => src0
689
+ # # |-- sub0
690
+ # # | |-- src0.txt
691
+ # # | `-- src1.txt
692
+ # # `-- sub1
693
+ # # |-- src2.txt
694
+ # # `-- src3.txt
695
+ # File.exist?('dest0') # => false
696
+ # FileUtils.cp_lr('src0', 'dest0')
697
+ # tree('dest0')
698
+ # # => dest0
699
+ # # |-- sub0
700
+ # # | |-- src0.txt
701
+ # # | `-- src1.txt
702
+ # # `-- sub1
703
+ # # |-- src2.txt
704
+ # # `-- src3.txt
705
+ #
706
+ # If `src` and `dest` are both paths to directories, creates links `dest/src`
707
+ # and descendents pointing to `src` and its descendents:
708
+ #
709
+ # tree('src1')
710
+ # # => src1
711
+ # # |-- sub0
712
+ # # | |-- src0.txt
713
+ # # | `-- src1.txt
714
+ # # `-- sub1
715
+ # # |-- src2.txt
716
+ # # `-- src3.txt
717
+ # FileUtils.mkdir('dest1')
718
+ # FileUtils.cp_lr('src1', 'dest1')
719
+ # tree('dest1')
720
+ # # => dest1
721
+ # # `-- src1
722
+ # # |-- sub0
723
+ # # | |-- src0.txt
724
+ # # | `-- src1.txt
725
+ # # `-- sub1
726
+ # # |-- src2.txt
727
+ # # `-- src3.txt
728
+ #
729
+ # If `src` is an array of paths to entries and `dest` is the path to a
730
+ # directory, for each path `filepath` in `src`, creates a link at
731
+ # `dest/filepath` pointing to that path:
732
+ #
733
+ # tree('src2')
734
+ # # => src2
735
+ # # |-- sub0
736
+ # # | |-- src0.txt
737
+ # # | `-- src1.txt
738
+ # # `-- sub1
739
+ # # |-- src2.txt
740
+ # # `-- src3.txt
741
+ # FileUtils.mkdir('dest2')
742
+ # FileUtils.cp_lr(['src2/sub0', 'src2/sub1'], 'dest2')
743
+ # tree('dest2')
744
+ # # => dest2
745
+ # # |-- sub0
746
+ # # | |-- src0.txt
747
+ # # | `-- src1.txt
748
+ # # `-- sub1
749
+ # # |-- src2.txt
750
+ # # `-- src3.txt
751
+ #
752
+ # Keyword arguments:
753
+ #
754
+ # * `dereference_root: false` - if `src` is a symbolic link, does not
755
+ # dereference it.
756
+ # * `noop: true` - does not create links.
757
+ # * `remove_destination: true` - removes `dest` before creating links.
758
+ # * `verbose: true` - prints an equivalent command:
759
+ #
760
+ # FileUtils.cp_lr('src0', 'dest0', noop: true, verbose: true)
761
+ # FileUtils.cp_lr('src1', 'dest1', noop: true, verbose: true)
762
+ # FileUtils.cp_lr(['src2/sub0', 'src2/sub1'], 'dest2', noop: true, verbose: true)
763
+ #
764
+ # Output:
765
+ #
766
+ # cp -lr src0 dest0
767
+ # cp -lr src1 dest1
768
+ # cp -lr src2/sub0 src2/sub1 dest2
769
+ #
770
+ #
771
+ # Raises an exception if `dest` is the path to an existing file or directory and
772
+ # keyword argument `remove_destination: true` is not given.
773
+ #
774
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
393
775
  #
394
776
  def self?.cp_lr: (pathlist src, path dest, ?noop: boolish, ?verbose: boolish, ?dereference_root: boolish, ?remove_destination: boolish) -> void
395
777
 
@@ -397,29 +779,105 @@ module FileUtils
397
779
  # rdoc-file=lib/fileutils.rb
398
780
  # - cp_r(src, dest, preserve: nil, noop: nil, verbose: nil, dereference_root: true, remove_destination: nil)
399
781
  # -->
400
- # Copies `src` to `dest`. If `src` is a directory, this method copies all its
401
- # contents recursively. If `dest` is a directory, copies `src` to `dest/src`.
402
- #
403
- # `src` can be a list of files.
404
- #
405
- # If `dereference_root` is true, this method dereference tree root.
406
- #
407
- # If `remove_destination` is true, this method removes each destination file
408
- # before copy.
409
- #
410
- # # Installing Ruby library "mylib" under the site_ruby
411
- # FileUtils.rm_r site_ruby + '/mylib', force: true
412
- # FileUtils.cp_r 'lib/', site_ruby + '/mylib'
413
- #
414
- # # Examples of copying several files to target directory.
415
- # FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
416
- # FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', noop: true, verbose: true
417
- #
418
- # # If you want to copy all contents of a directory instead of the
419
- # # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
420
- # # use following code.
421
- # FileUtils.cp_r 'src/.', 'dest' # cp_r('src', 'dest') makes dest/src,
422
- # # but this doesn't.
782
+ # Recursively copies files.
783
+ #
784
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
785
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments).
786
+ #
787
+ # The mode, owner, and group are retained in the copy; to change those, use
788
+ # FileUtils.install instead.
789
+ #
790
+ # If `src` is the path to a file and `dest` is not the path to a directory,
791
+ # copies `src` to `dest`:
792
+ #
793
+ # FileUtils.touch('src0.txt')
794
+ # File.exist?('dest0.txt') # => false
795
+ # FileUtils.cp_r('src0.txt', 'dest0.txt')
796
+ # File.file?('dest0.txt') # => true
797
+ #
798
+ # If `src` is the path to a file and `dest` is the path to a directory, copies
799
+ # `src` to `dest/src`:
800
+ #
801
+ # FileUtils.touch('src1.txt')
802
+ # FileUtils.mkdir('dest1')
803
+ # FileUtils.cp_r('src1.txt', 'dest1')
804
+ # File.file?('dest1/src1.txt') # => true
805
+ #
806
+ # If `src` is the path to a directory and `dest` does not exist, recursively
807
+ # copies `src` to `dest`:
808
+ #
809
+ # tree('src2')
810
+ # # => src2
811
+ # # |-- dir0
812
+ # # | |-- src0.txt
813
+ # # | `-- src1.txt
814
+ # # `-- dir1
815
+ # # |-- src2.txt
816
+ # # `-- src3.txt
817
+ # FileUtils.exist?('dest2') # => false
818
+ # FileUtils.cp_r('src2', 'dest2')
819
+ # tree('dest2')
820
+ # # => dest2
821
+ # # |-- dir0
822
+ # # | |-- src0.txt
823
+ # # | `-- src1.txt
824
+ # # `-- dir1
825
+ # # |-- src2.txt
826
+ # # `-- src3.txt
827
+ #
828
+ # If `src` and `dest` are paths to directories, recursively copies `src` to
829
+ # `dest/src`:
830
+ #
831
+ # tree('src3')
832
+ # # => src3
833
+ # # |-- dir0
834
+ # # | |-- src0.txt
835
+ # # | `-- src1.txt
836
+ # # `-- dir1
837
+ # # |-- src2.txt
838
+ # # `-- src3.txt
839
+ # FileUtils.mkdir('dest3')
840
+ # FileUtils.cp_r('src3', 'dest3')
841
+ # tree('dest3')
842
+ # # => dest3
843
+ # # `-- src3
844
+ # # |-- dir0
845
+ # # | |-- src0.txt
846
+ # # | `-- src1.txt
847
+ # # `-- dir1
848
+ # # |-- src2.txt
849
+ # # `-- src3.txt
850
+ #
851
+ # If `src` is an array of paths and `dest` is a directory, recursively copies
852
+ # from each path in `src` to `dest`; the paths in `src` may point to files
853
+ # and/or directories.
854
+ #
855
+ # Keyword arguments:
856
+ #
857
+ # * `dereference_root: false` - if `src` is a symbolic link, does not
858
+ # dereference it.
859
+ # * `noop: true` - does not copy files.
860
+ # * `preserve: true` - preserves file times.
861
+ # * `remove_destination: true` - removes `dest` before copying files.
862
+ # * `verbose: true` - prints an equivalent command:
863
+ #
864
+ # FileUtils.cp_r('src0.txt', 'dest0.txt', noop: true, verbose: true)
865
+ # FileUtils.cp_r('src1.txt', 'dest1', noop: true, verbose: true)
866
+ # FileUtils.cp_r('src2', 'dest2', noop: true, verbose: true)
867
+ # FileUtils.cp_r('src3', 'dest3', noop: true, verbose: true)
868
+ #
869
+ # Output:
870
+ #
871
+ # cp -r src0.txt dest0.txt
872
+ # cp -r src1.txt dest1
873
+ # cp -r src2 dest2
874
+ # cp -r src3 dest3
875
+ #
876
+ #
877
+ # Raises an exception of `src` is the path to a directory and `dest` is the path
878
+ # to a file.
879
+ #
880
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
423
881
  #
424
882
  def self?.cp_r: (pathlist src, path dest, ?preserve: boolish, ?noop: boolish, ?verbose: boolish, ?dereference_root: boolish, ?remove_destination: boolish) -> void
425
883
 
@@ -427,11 +885,11 @@ module FileUtils
427
885
  # rdoc-file=lib/fileutils.rb
428
886
  # - have_option?(mid, opt)
429
887
  # -->
430
- # Returns true if the method `mid` have an option `opt`.
888
+ # Returns `true` if method `mid` accepts the given option `opt`, `false`
889
+ # otherwise; the arguments may be strings or symbols:
431
890
  #
432
- # p FileUtils.have_option?(:cp, :noop) #=> true
433
- # p FileUtils.have_option?(:rm, :force) #=> true
434
- # p FileUtils.have_option?(:rm, :preserve) #=> false
891
+ # FileUtils.have_option?(:chmod, :noop) # => true
892
+ # FileUtils.have_option?('chmod', 'secure') # => false
435
893
  #
436
894
  def self.have_option?: (Symbol mid, Symbol opt) -> bool
437
895
 
@@ -439,12 +897,69 @@ module FileUtils
439
897
  # rdoc-file=lib/fileutils.rb
440
898
  # - install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil, noop: nil, verbose: nil)
441
899
  # -->
442
- # If `src` is not same as `dest`, copies it and changes the permission mode to
443
- # `mode`. If `dest` is a directory, destination is `dest`/`src`. This method
444
- # removes destination before copy.
900
+ # Copies a file entry. See
901
+ # [install(1)](https://man7.org/linux/man-pages/man1/install.1.html).
902
+ #
903
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
904
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments);
905
+ #
906
+ # If the entry at `dest` does not exist, copies from `src` to `dest`:
907
+ #
908
+ # File.read('src0.txt') # => "aaa\n"
909
+ # File.exist?('dest0.txt') # => false
910
+ # FileUtils.install('src0.txt', 'dest0.txt')
911
+ # File.read('dest0.txt') # => "aaa\n"
912
+ #
913
+ # If `dest` is a file entry, copies from `src` to `dest`, overwriting:
914
+ #
915
+ # File.read('src1.txt') # => "aaa\n"
916
+ # File.read('dest1.txt') # => "bbb\n"
917
+ # FileUtils.install('src1.txt', 'dest1.txt')
918
+ # File.read('dest1.txt') # => "aaa\n"
919
+ #
920
+ # If `dest` is a directory entry, copies from `src` to `dest/src`, overwriting
921
+ # if necessary:
922
+ #
923
+ # File.read('src2.txt') # => "aaa\n"
924
+ # File.read('dest2/src2.txt') # => "bbb\n"
925
+ # FileUtils.install('src2.txt', 'dest2')
926
+ # File.read('dest2/src2.txt') # => "aaa\n"
445
927
  #
446
- # FileUtils.install 'ruby', '/usr/local/bin/ruby', mode: 0755, verbose: true
447
- # FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', verbose: true
928
+ # If `src` is an array of paths and `dest` points to a directory, copies each
929
+ # path `path` in `src` to `dest/path`:
930
+ #
931
+ # File.file?('src3.txt') # => true
932
+ # File.file?('src3.dat') # => true
933
+ # FileUtils.mkdir('dest3')
934
+ # FileUtils.install(['src3.txt', 'src3.dat'], 'dest3')
935
+ # File.file?('dest3/src3.txt') # => true
936
+ # File.file?('dest3/src3.dat') # => true
937
+ #
938
+ # Keyword arguments:
939
+ #
940
+ # * `group: *group`* - changes the group if not `nil`, using
941
+ # [File.chown](rdoc-ref:File.chown).
942
+ # * `mode: *permissions`* - changes the permissions. using
943
+ # [File.chmod](rdoc-ref:File.chmod).
944
+ # * `noop: true` - does not copy entries; returns `nil`.
945
+ # * `owner: *owner`* - changes the owner if not `nil`, using
946
+ # [File.chown](rdoc-ref:File.chown).
947
+ # * `preserve: true` - preserve timestamps using
948
+ # [File.utime](rdoc-ref:File.utime).
949
+ # * `verbose: true` - prints an equivalent command:
950
+ #
951
+ # FileUtils.install('src0.txt', 'dest0.txt', noop: true, verbose: true)
952
+ # FileUtils.install('src1.txt', 'dest1.txt', noop: true, verbose: true)
953
+ # FileUtils.install('src2.txt', 'dest2', noop: true, verbose: true)
954
+ #
955
+ # Output:
956
+ #
957
+ # install -c src0.txt dest0.txt
958
+ # install -c src1.txt dest1.txt
959
+ # install -c src2.txt dest2
960
+ #
961
+ #
962
+ # Related: [methods for copying](rdoc-ref:FileUtils@Copying).
448
963
  #
449
964
  def self?.install: (path src, path dest, ?mode: mode?, ?owner: String?, ?group: String?, ?preserve: boolish, ?noop: boolish, ?verbose: boolish) -> void
450
965
 
@@ -452,38 +967,108 @@ module FileUtils
452
967
  # rdoc-file=lib/fileutils.rb
453
968
  # - link_entry(src, dest, dereference_root = false, remove_destination = false)
454
969
  # -->
455
- # Hard links a file system entry `src` to `dest`. If `src` is a directory, this
456
- # method links its contents recursively.
970
+ # Creates [hard links](https://en.wikipedia.org/wiki/Hard_link); returns `nil`.
971
+ #
972
+ # Arguments `src` and `dest` should be [interpretable as
973
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
974
+ #
975
+ # If `src` is the path to a file and `dest` does not exist, creates a hard link
976
+ # at `dest` pointing to `src`:
457
977
  #
458
- # Both of `src` and `dest` must be a path name. `src` must exist, `dest` must
459
- # not exist.
978
+ # FileUtils.touch('src0.txt')
979
+ # File.exist?('dest0.txt') # => false
980
+ # FileUtils.link_entry('src0.txt', 'dest0.txt')
981
+ # File.file?('dest0.txt') # => true
460
982
  #
461
- # If `dereference_root` is true, this method dereferences the tree root.
983
+ # If `src` is the path to a directory and `dest` does not exist, recursively
984
+ # creates hard links at `dest` pointing to paths in `src`:
462
985
  #
463
- # If `remove_destination` is true, this method removes each destination file
464
- # before copy.
986
+ # FileUtils.mkdir_p(['src1/dir0', 'src1/dir1'])
987
+ # src_file_paths = [
988
+ # 'src1/dir0/t0.txt',
989
+ # 'src1/dir0/t1.txt',
990
+ # 'src1/dir1/t2.txt',
991
+ # 'src1/dir1/t3.txt',
992
+ # ]
993
+ # FileUtils.touch(src_file_paths)
994
+ # File.directory?('dest1') # => true
995
+ # FileUtils.link_entry('src1', 'dest1')
996
+ # File.file?('dest1/dir0/t0.txt') # => true
997
+ # File.file?('dest1/dir0/t1.txt') # => true
998
+ # File.file?('dest1/dir1/t2.txt') # => true
999
+ # File.file?('dest1/dir1/t3.txt') # => true
1000
+ #
1001
+ # Keyword arguments:
1002
+ #
1003
+ # * `dereference_root: true` - dereferences `src` if it is a symbolic link.
1004
+ # * `remove_destination: true` - removes `dest` before creating links.
1005
+ #
1006
+ #
1007
+ # Raises an exception if `dest` is the path to an existing file or directory and
1008
+ # keyword argument `remove_destination: true` is not given.
1009
+ #
1010
+ # Related: FileUtils.ln (has different options).
465
1011
  #
466
1012
  def self?.link_entry: (path src, path dest, ?boolish dereference_root, ?boolish remove_destination) -> void
467
1013
 
468
1014
  # <!--
469
1015
  # rdoc-file=lib/fileutils.rb
470
- # - FileUtils.ln(target, link, force: nil, noop: nil, verbose: nil)
471
- # - FileUtils.ln(target, dir, force: nil, noop: nil, verbose: nil)
472
- # - FileUtils.ln(targets, dir, force: nil, noop: nil, verbose: nil)
1016
+ # - ln(src, dest, force: nil, noop: nil, verbose: nil)
473
1017
  # -->
474
- # In the first form, creates a hard link `link` which points to `target`. If
475
- # `link` already exists, raises Errno::EEXIST. But if the `force` option is set,
476
- # overwrites `link`.
1018
+ # Creates [hard links](https://en.wikipedia.org/wiki/Hard_link).
1019
+ #
1020
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
1021
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments).
1022
+ #
1023
+ # When `src` is the path to an existing file and `dest` is the path to a
1024
+ # non-existent file, creates a hard link at `dest` pointing to `src`; returns
1025
+ # zero:
1026
+ #
1027
+ # Dir.children('tmp0/') # => ["t.txt"]
1028
+ # Dir.children('tmp1/') # => []
1029
+ # FileUtils.ln('tmp0/t.txt', 'tmp1/t.lnk') # => 0
1030
+ # Dir.children('tmp1/') # => ["t.lnk"]
1031
+ #
1032
+ # When `src` is the path to an existing file and `dest` is the path to an
1033
+ # existing directory, creates a hard link at `dest/src` pointing to `src`;
1034
+ # returns zero:
1035
+ #
1036
+ # Dir.children('tmp2') # => ["t.dat"]
1037
+ # Dir.children('tmp3') # => []
1038
+ # FileUtils.ln('tmp2/t.dat', 'tmp3') # => 0
1039
+ # Dir.children('tmp3') # => ["t.dat"]
477
1040
  #
478
- # FileUtils.ln 'gcc', 'cc', verbose: true
479
- # FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'
1041
+ # When `src` is an array of paths to existing files and `dest` is the path to an
1042
+ # existing directory, then for each path `target` in `src`, creates a hard link
1043
+ # at `dest/target` pointing to `target`; returns `src`:
480
1044
  #
481
- # In the second form, creates a link `dir/target` pointing to `target`. In the
482
- # third form, creates several hard links in the directory `dir`, pointing to
483
- # each item in `targets`. If `dir` is not a directory, raises Errno::ENOTDIR.
1045
+ # Dir.children('tmp4/') # => []
1046
+ # FileUtils.ln(['tmp0/t.txt', 'tmp2/t.dat'], 'tmp4/') # => ["tmp0/t.txt", "tmp2/t.dat"]
1047
+ # Dir.children('tmp4/') # => ["t.dat", "t.txt"]
484
1048
  #
485
- # FileUtils.cd '/sbin'
486
- # FileUtils.ln %w(cp mv mkdir), '/bin' # Now /sbin/cp and /bin/cp are linked.
1049
+ # Keyword arguments:
1050
+ #
1051
+ # * `force: true` - overwrites `dest` if it exists.
1052
+ # * `noop: true` - does not create links.
1053
+ # * `verbose: true` - prints an equivalent command:
1054
+ #
1055
+ # FileUtils.ln('tmp0/t.txt', 'tmp1/t.lnk', verbose: true)
1056
+ # FileUtils.ln('tmp2/t.dat', 'tmp3', verbose: true)
1057
+ # FileUtils.ln(['tmp0/t.txt', 'tmp2/t.dat'], 'tmp4/', verbose: true)
1058
+ #
1059
+ # Output:
1060
+ #
1061
+ # ln tmp0/t.txt tmp1/t.lnk
1062
+ # ln tmp2/t.dat tmp3
1063
+ # ln tmp0/t.txt tmp2/t.dat tmp4/
1064
+ #
1065
+ #
1066
+ # Raises an exception if `dest` is the path to an existing file and keyword
1067
+ # argument `force` is not `true`.
1068
+ #
1069
+ # FileUtils#link is an alias for FileUtils#ln.
1070
+ #
1071
+ # Related: FileUtils.link_entry (has different options).
487
1072
  #
488
1073
  def self?.ln: (pathlist src, path dest, ?force: boolish, ?noop: boolish, ?verbose: boolish) -> void
489
1074
 
@@ -503,59 +1088,147 @@ module FileUtils
503
1088
 
504
1089
  # <!--
505
1090
  # rdoc-file=lib/fileutils.rb
506
- # - FileUtils.ln_s(target, link, force: nil, noop: nil, verbose: nil)
507
- # - FileUtils.ln_s(target, dir, force: nil, noop: nil, verbose: nil)
508
- # - FileUtils.ln_s(targets, dir, force: nil, noop: nil, verbose: nil)
1091
+ # - ln_s(src, dest, force: nil, relative: false, target_directory: true, noop: nil, verbose: nil)
509
1092
  # -->
510
- # In the first form, creates a symbolic link `link` which points to `target`. If
511
- # `link` already exists, raises Errno::EEXIST. But if the `force` option is set,
512
- # overwrites `link`.
1093
+ # Creates [symbolic links](https://en.wikipedia.org/wiki/Symbolic_link).
1094
+ #
1095
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
1096
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments).
1097
+ #
1098
+ # If `src` is the path to an existing file:
513
1099
  #
514
- # FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'
515
- # FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true
1100
+ # * When `dest` is the path to a non-existent file, creates a symbolic link at
1101
+ # `dest` pointing to `src`:
516
1102
  #
517
- # In the second form, creates a link `dir/target` pointing to `target`. In the
518
- # third form, creates several symbolic links in the directory `dir`, pointing to
519
- # each item in `targets`. If `dir` is not a directory, raises Errno::ENOTDIR.
1103
+ # FileUtils.touch('src0.txt')
1104
+ # File.exist?('dest0.txt') # => false
1105
+ # FileUtils.ln_s('src0.txt', 'dest0.txt')
1106
+ # File.symlink?('dest0.txt') # => true
520
1107
  #
521
- # FileUtils.ln_s Dir.glob('/bin/*.rb'), '/home/foo/bin'
1108
+ # * When `dest` is the path to an existing file, creates a symbolic link at
1109
+ # `dest` pointing to `src` if and only if keyword argument `force: true` is
1110
+ # given (raises an exception otherwise):
522
1111
  #
523
- def self?.ln_s: (pathlist src, path dest, ?force: boolish, ?noop: boolish, ?verbose: boolish) -> void
1112
+ # FileUtils.touch('src1.txt')
1113
+ # FileUtils.touch('dest1.txt')
1114
+ # FileUtils.ln_s('src1.txt', 'dest1.txt', force: true)
1115
+ # FileTest.symlink?('dest1.txt') # => true
1116
+ #
1117
+ # FileUtils.ln_s('src1.txt', 'dest1.txt') # Raises Errno::EEXIST.
1118
+ #
1119
+ #
1120
+ # If `dest` is the path to a directory, creates a symbolic link at `dest/src`
1121
+ # pointing to `src`:
1122
+ #
1123
+ # FileUtils.touch('src2.txt')
1124
+ # FileUtils.mkdir('destdir2')
1125
+ # FileUtils.ln_s('src2.txt', 'destdir2')
1126
+ # File.symlink?('destdir2/src2.txt') # => true
1127
+ #
1128
+ # If `src` is an array of paths to existing files and `dest` is a directory, for
1129
+ # each child `child` in `src` creates a symbolic link `dest/child` pointing to
1130
+ # `child`:
1131
+ #
1132
+ # FileUtils.mkdir('srcdir3')
1133
+ # FileUtils.touch('srcdir3/src0.txt')
1134
+ # FileUtils.touch('srcdir3/src1.txt')
1135
+ # FileUtils.mkdir('destdir3')
1136
+ # FileUtils.ln_s(['srcdir3/src0.txt', 'srcdir3/src1.txt'], 'destdir3')
1137
+ # File.symlink?('destdir3/src0.txt') # => true
1138
+ # File.symlink?('destdir3/src1.txt') # => true
1139
+ #
1140
+ # Keyword arguments:
1141
+ #
1142
+ # * `force: true` - overwrites `dest` if it exists.
1143
+ # * `relative: false` - create links relative to `dest`.
1144
+ # * `noop: true` - does not create links.
1145
+ # * `verbose: true` - prints an equivalent command:
1146
+ #
1147
+ # FileUtils.ln_s('src0.txt', 'dest0.txt', noop: true, verbose: true)
1148
+ # FileUtils.ln_s('src1.txt', 'destdir1', noop: true, verbose: true)
1149
+ # FileUtils.ln_s('src2.txt', 'dest2.txt', force: true, noop: true, verbose: true)
1150
+ # FileUtils.ln_s(['srcdir3/src0.txt', 'srcdir3/src1.txt'], 'destdir3', noop: true, verbose: true)
1151
+ #
1152
+ # Output:
1153
+ #
1154
+ # ln -s src0.txt dest0.txt
1155
+ # ln -s src1.txt destdir1
1156
+ # ln -sf src2.txt dest2.txt
1157
+ # ln -s srcdir3/src0.txt srcdir3/src1.txt destdir3
1158
+ #
1159
+ #
1160
+ # FileUtils.symlink is an alias for FileUtils.ln_s.
1161
+ #
1162
+ # Related: FileUtils.ln_sf.
1163
+ #
1164
+ def self?.ln_s: (pathlist src, path dest, ?force: boolish, ?relative: boolish, ?target_directory: boolish, ?noop: boolish, ?verbose: boolish) -> void
524
1165
 
525
1166
  # <!--
526
1167
  # rdoc-file=lib/fileutils.rb
527
- # - symlink(src, dest, force: nil, noop: nil, verbose: nil)
1168
+ # - symlink(src, dest, force: nil, relative: false, target_directory: true, noop: nil, verbose: nil)
528
1169
  # -->
529
1170
  #
530
1171
  alias self.symlink self.ln_s
531
1172
 
532
1173
  # <!--
533
1174
  # rdoc-file=lib/fileutils.rb
534
- # - symlink(src, dest, force: nil, noop: nil, verbose: nil)
1175
+ # - symlink(src, dest, force: nil, relative: false, target_directory: true, noop: nil, verbose: nil)
535
1176
  # -->
536
1177
  #
537
1178
  alias symlink ln_s
538
1179
 
539
1180
  # <!--
540
1181
  # rdoc-file=lib/fileutils.rb
541
- # - FileUtils.ln_sf(*args)
1182
+ # - ln_sf(src, dest, noop: nil, verbose: nil)
542
1183
  # -->
543
- # Same as
544
- #
545
- # FileUtils.ln_s(*args, force: true)
1184
+ # Like FileUtils.ln_s, but always with keyword argument `force: true` given.
546
1185
  #
547
1186
  def self?.ln_sf: (pathlist src, path dest, ?noop: boolish, ?verbose: boolish) -> void
548
1187
 
1188
+ # <!--
1189
+ # rdoc-file=lib/fileutils.rb
1190
+ # - ln_sr(src, dest, target_directory: true, force: nil, noop: nil, verbose: nil)
1191
+ # -->
1192
+ # Like FileUtils.ln_s, but create links relative to `dest`.
1193
+ #
1194
+ def self?.ln_sr: (pathlist src, path dest, ?target_directory: boolish, ?noop: boolish, ?verbose: boolish) -> void
1195
+
549
1196
  # <!--
550
1197
  # rdoc-file=lib/fileutils.rb
551
1198
  # - mkdir(list, mode: nil, noop: nil, verbose: nil)
552
1199
  # -->
553
- # Creates one or more directories.
1200
+ # Creates directories at the paths in the given `list` (a single path or an
1201
+ # array of paths); returns `list` if it is an array, `[list]` otherwise.
1202
+ #
1203
+ # Argument `list` or its elements should be [interpretable as
1204
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1205
+ #
1206
+ # With no keyword arguments, creates a directory at each `path` in `list` by
1207
+ # calling: `Dir.mkdir(path, mode)`; see [Dir.mkdir](rdoc-ref:Dir.mkdir):
1208
+ #
1209
+ # FileUtils.mkdir(%w[tmp0 tmp1]) # => ["tmp0", "tmp1"]
1210
+ # FileUtils.mkdir('tmp4') # => ["tmp4"]
1211
+ #
1212
+ # Keyword arguments:
1213
+ #
1214
+ # * `mode: *mode`* - also calls `File.chmod(mode, path)`; see
1215
+ # [File.chmod](rdoc-ref:File.chmod).
1216
+ # * `noop: true` - does not create directories.
1217
+ # * `verbose: true` - prints an equivalent command:
1218
+ #
1219
+ # FileUtils.mkdir(%w[tmp0 tmp1], verbose: true)
1220
+ # FileUtils.mkdir(%w[tmp2 tmp3], mode: 0700, verbose: true)
1221
+ #
1222
+ # Output:
1223
+ #
1224
+ # mkdir tmp0 tmp1
1225
+ # mkdir -m 700 tmp2 tmp3
1226
+ #
554
1227
  #
555
- # FileUtils.mkdir 'test'
556
- # FileUtils.mkdir %w(tmp data)
557
- # FileUtils.mkdir 'notexist', noop: true # Does not really create.
558
- # FileUtils.mkdir 'tmp', mode: 0700
1228
+ # Raises an exception if any path points to an existing file or directory, or if
1229
+ # for any reason a directory cannot be created.
1230
+ #
1231
+ # Related: FileUtils.mkdir_p.
559
1232
  #
560
1233
  def self?.mkdir: (pathlist list, ?mode: Integer?, ?noop: boolish, ?verbose: boolish) -> void
561
1234
 
@@ -563,19 +1236,41 @@ module FileUtils
563
1236
  # rdoc-file=lib/fileutils.rb
564
1237
  # - mkdir_p(list, mode: nil, noop: nil, verbose: nil)
565
1238
  # -->
566
- # Creates a directory and all its parent directories. For example,
1239
+ # Creates directories at the paths in the given `list` (a single path or an
1240
+ # array of paths), also creating ancestor directories as needed; returns `list`
1241
+ # if it is an array, `[list]` otherwise.
1242
+ #
1243
+ # Argument `list` or its elements should be [interpretable as
1244
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1245
+ #
1246
+ # With no keyword arguments, creates a directory at each `path` in `list`, along
1247
+ # with any needed ancestor directories, by calling: `Dir.mkdir(path, mode)`; see
1248
+ # [Dir.mkdir](rdoc-ref:Dir.mkdir):
1249
+ #
1250
+ # FileUtils.mkdir_p(%w[tmp0/tmp1 tmp2/tmp3]) # => ["tmp0/tmp1", "tmp2/tmp3"]
1251
+ # FileUtils.mkdir_p('tmp4/tmp5') # => ["tmp4/tmp5"]
1252
+ #
1253
+ # Keyword arguments:
567
1254
  #
568
- # FileUtils.mkdir_p '/usr/local/lib/ruby'
1255
+ # * `mode: *mode`* - also calls `File.chmod(mode, path)`; see
1256
+ # [File.chmod](rdoc-ref:File.chmod).
1257
+ # * `noop: true` - does not create directories.
1258
+ # * `verbose: true` - prints an equivalent command:
569
1259
  #
570
- # causes to make following directories, if they do not exist.
1260
+ # FileUtils.mkdir_p(%w[tmp0 tmp1], verbose: true)
1261
+ # FileUtils.mkdir_p(%w[tmp2 tmp3], mode: 0700, verbose: true)
571
1262
  #
572
- # * /usr
573
- # * /usr/local
574
- # * /usr/local/lib
575
- # * /usr/local/lib/ruby
1263
+ # Output:
576
1264
  #
1265
+ # mkdir -p tmp0 tmp1
1266
+ # mkdir -p -m 700 tmp2 tmp3
577
1267
  #
578
- # You can pass several directories at a time in a list.
1268
+ #
1269
+ # Raises an exception if for any reason a directory cannot be created.
1270
+ #
1271
+ # FileUtils.mkpath and FileUtils.makedirs are aliases for FileUtils.mkdir_p.
1272
+ #
1273
+ # Related: FileUtils.mkdir.
579
1274
  #
580
1275
  def self?.mkdir_p: (pathlist list, ?mode: mode?, ?noop: boolish, ?verbose: boolish) -> void
581
1276
 
@@ -611,14 +1306,70 @@ module FileUtils
611
1306
  # rdoc-file=lib/fileutils.rb
612
1307
  # - mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
613
1308
  # -->
614
- # Moves file(s) `src` to `dest`. If `file` and `dest` exist on the different
615
- # disk partition, the file is copied then the original file is removed.
1309
+ # Moves entries.
1310
+ #
1311
+ # Arguments `src` (a single path or an array of paths) and `dest` (a single
1312
+ # path) should be [interpretable as paths](rdoc-ref:FileUtils@Path+Arguments).
616
1313
  #
617
- # FileUtils.mv 'badname.rb', 'goodname.rb'
618
- # FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', force: true # no error
1314
+ # If `src` and `dest` are on different file systems, first copies, then removes
1315
+ # `src`.
619
1316
  #
620
- # FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/'
621
- # FileUtils.mv Dir.glob('test*.rb'), 'test', noop: true, verbose: true
1317
+ # May cause a local vulnerability if not called with keyword argument `secure:
1318
+ # true`; see [Avoiding the TOCTTOU
1319
+ # Vulnerability](rdoc-ref:FileUtils@Avoiding+the+TOCTTOU+Vulnerability).
1320
+ #
1321
+ # If `src` is the path to a single file or directory and `dest` does not exist,
1322
+ # moves `src` to `dest`:
1323
+ #
1324
+ # tree('src0')
1325
+ # # => src0
1326
+ # # |-- src0.txt
1327
+ # # `-- src1.txt
1328
+ # File.exist?('dest0') # => false
1329
+ # FileUtils.mv('src0', 'dest0')
1330
+ # File.exist?('src0') # => false
1331
+ # tree('dest0')
1332
+ # # => dest0
1333
+ # # |-- src0.txt
1334
+ # # `-- src1.txt
1335
+ #
1336
+ # If `src` is an array of paths to files and directories and `dest` is the path
1337
+ # to a directory, copies from each path in the array to `dest`:
1338
+ #
1339
+ # File.file?('src1.txt') # => true
1340
+ # tree('src1')
1341
+ # # => src1
1342
+ # # |-- src.dat
1343
+ # # `-- src.txt
1344
+ # Dir.empty?('dest1') # => true
1345
+ # FileUtils.mv(['src1.txt', 'src1'], 'dest1')
1346
+ # tree('dest1')
1347
+ # # => dest1
1348
+ # # |-- src1
1349
+ # # | |-- src.dat
1350
+ # # | `-- src.txt
1351
+ # # `-- src1.txt
1352
+ #
1353
+ # Keyword arguments:
1354
+ #
1355
+ # * `force: true` - if the move includes removing `src` (that is, if `src` and
1356
+ # `dest` are on different file systems), ignores raised exceptions of
1357
+ # StandardError and its descendants.
1358
+ # * `noop: true` - does not move files.
1359
+ # * `secure: true` - removes `src` securely; see details at
1360
+ # FileUtils.remove_entry_secure.
1361
+ # * `verbose: true` - prints an equivalent command:
1362
+ #
1363
+ # FileUtils.mv('src0', 'dest0', noop: true, verbose: true)
1364
+ # FileUtils.mv(['src1.txt', 'src1'], 'dest1', noop: true, verbose: true)
1365
+ #
1366
+ # Output:
1367
+ #
1368
+ # mv src0 dest0
1369
+ # mv src1.txt src1 dest1
1370
+ #
1371
+ #
1372
+ # FileUtils.move is an alias for FileUtils.mv.
622
1373
  #
623
1374
  def self?.mv: (pathlist src, path dest, ?force: boolish, ?noop: boolish, ?verbose: boolish, ?secure: boolish) -> void
624
1375
 
@@ -640,9 +1391,9 @@ module FileUtils
640
1391
  # rdoc-file=lib/fileutils.rb
641
1392
  # - options()
642
1393
  # -->
643
- # Returns an Array of option names.
1394
+ # Returns an array of the string keyword names:
644
1395
  #
645
- # p FileUtils.options #=> ["noop", "force", "verbose", "preserve", "mode"]
1396
+ # FileUtils.options.take(3) # => ["noop", "verbose", "force"]
646
1397
  #
647
1398
  def self.options: () -> Array[String]
648
1399
 
@@ -650,9 +1401,11 @@ module FileUtils
650
1401
  # rdoc-file=lib/fileutils.rb
651
1402
  # - options_of(mid)
652
1403
  # -->
653
- # Returns an Array of option names of the method `mid`.
1404
+ # Returns an array of the string keyword name for method `mid`; the argument may
1405
+ # be a string or a symbol:
654
1406
  #
655
- # p FileUtils.options_of(:rm) #=> ["noop", "verbose", "force"]
1407
+ # FileUtils.options_of(:rm) # => ["force", "noop", "verbose"]
1408
+ # FileUtils.options_of('mv') # => ["force", "noop", "verbose", "secure"]
656
1409
  #
657
1410
  def self.options_of: (Symbol mid) -> Array[String]
658
1411
 
@@ -660,7 +1413,13 @@ module FileUtils
660
1413
  # rdoc-file=lib/fileutils.rb
661
1414
  # - pwd()
662
1415
  # -->
663
- # Returns the name of the current directory.
1416
+ # Returns a string containing the path to the current directory:
1417
+ #
1418
+ # FileUtils.pwd # => "/rdoc/fileutils"
1419
+ #
1420
+ # FileUtils.getwd is an alias for FileUtils.pwd.
1421
+ #
1422
+ # Related: FileUtils.cd.
664
1423
  #
665
1424
  def self?.pwd: () -> String
666
1425
 
@@ -682,8 +1441,16 @@ module FileUtils
682
1441
  # rdoc-file=lib/fileutils.rb
683
1442
  # - remove_dir(path, force = false)
684
1443
  # -->
685
- # Removes a directory `dir` and its contents recursively. This method ignores
686
- # StandardError if `force` is true.
1444
+ # Recursively removes the directory entry given by `path`, which should be the
1445
+ # entry for a regular file, a symbolic link, or a directory.
1446
+ #
1447
+ # Argument `path` should be [interpretable as a
1448
+ # path](rdoc-ref:FileUtils@Path+Arguments).
1449
+ #
1450
+ # Optional argument `force` specifies whether to ignore raised exceptions of
1451
+ # StandardError and its descendants.
1452
+ #
1453
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
687
1454
  #
688
1455
  def self?.remove_dir: (path path, ?boolish force) -> void
689
1456
 
@@ -691,11 +1458,16 @@ module FileUtils
691
1458
  # rdoc-file=lib/fileutils.rb
692
1459
  # - remove_entry(path, force = false)
693
1460
  # -->
694
- # This method removes a file system entry `path`. `path` might be a regular
695
- # file, a directory, or something. If `path` is a directory, remove it
696
- # recursively.
1461
+ # Removes the entry given by `path`, which should be the entry for a regular
1462
+ # file, a symbolic link, or a directory.
1463
+ #
1464
+ # Argument `path` should be [interpretable as a
1465
+ # path](rdoc-ref:FileUtils@Path+Arguments).
697
1466
  #
698
- # See also remove_entry_secure.
1467
+ # Optional argument `force` specifies whether to ignore raised exceptions of
1468
+ # StandardError and its descendants.
1469
+ #
1470
+ # Related: FileUtils.remove_entry_secure.
699
1471
  #
700
1472
  def self?.remove_entry: (path path, ?boolish force) -> void
701
1473
 
@@ -703,37 +1475,20 @@ module FileUtils
703
1475
  # rdoc-file=lib/fileutils.rb
704
1476
  # - remove_entry_secure(path, force = false)
705
1477
  # -->
706
- # This method removes a file system entry `path`. `path` shall be a regular
707
- # file, a directory, or something. If `path` is a directory, remove it
708
- # recursively. This method is required to avoid TOCTTOU
709
- # (time-of-check-to-time-of-use) local security vulnerability of rm_r. #rm_r
710
- # causes security hole when:
711
- #
712
- # * Parent directory is world writable (including /tmp).
713
- # * Removing directory tree includes world writable directory.
714
- # * The system has symbolic link.
1478
+ # Securely removes the entry given by `path`, which should be the entry for a
1479
+ # regular file, a symbolic link, or a directory.
715
1480
  #
1481
+ # Argument `path` should be [interpretable as a
1482
+ # path](rdoc-ref:FileUtils@Path+Arguments).
716
1483
  #
717
- # To avoid this security hole, this method applies special preprocess. If `path`
718
- # is a directory, this method chown(2) and chmod(2) all removing directories.
719
- # This requires the current process is the owner of the removing whole directory
720
- # tree, or is the super user (root).
1484
+ # Avoids a local vulnerability that can exist in certain circumstances; see
1485
+ # [Avoiding the TOCTTOU
1486
+ # Vulnerability](rdoc-ref:FileUtils@Avoiding+the+TOCTTOU+Vulnerability).
721
1487
  #
722
- # WARNING: You must ensure that **ALL** parent directories cannot be moved by
723
- # other untrusted users. For example, parent directories should not be owned by
724
- # untrusted users, and should not be world writable except when the sticky bit
725
- # set.
1488
+ # Optional argument `force` specifies whether to ignore raised exceptions of
1489
+ # StandardError and its descendants.
726
1490
  #
727
- # WARNING: Only the owner of the removing directory tree, or Unix super user
728
- # (root) should invoke this method. Otherwise this method does not work.
729
- #
730
- # For details of this security vulnerability, see Perl's case:
731
- #
732
- # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448
733
- # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452
734
- #
735
- #
736
- # For fileutils.rb, this vulnerability is reported in [ruby-dev:26100].
1491
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
737
1492
  #
738
1493
  def self?.remove_entry_secure: (path path, ?boolish force) -> void
739
1494
 
@@ -741,7 +1496,16 @@ module FileUtils
741
1496
  # rdoc-file=lib/fileutils.rb
742
1497
  # - remove_file(path, force = false)
743
1498
  # -->
744
- # Removes a file `path`. This method ignores StandardError if `force` is true.
1499
+ # Removes the file entry given by `path`, which should be the entry for a
1500
+ # regular file or a symbolic link.
1501
+ #
1502
+ # Argument `path` should be [interpretable as a
1503
+ # path](rdoc-ref:FileUtils@Path+Arguments).
1504
+ #
1505
+ # Optional argument `force` specifies whether to ignore raised exceptions of
1506
+ # StandardError and its descendants.
1507
+ #
1508
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
745
1509
  #
746
1510
  def self?.remove_file: (path path, ?void force) -> void
747
1511
 
@@ -749,12 +1513,34 @@ module FileUtils
749
1513
  # rdoc-file=lib/fileutils.rb
750
1514
  # - rm(list, force: nil, noop: nil, verbose: nil)
751
1515
  # -->
752
- # Remove file(s) specified in `list`. This method cannot remove directories.
753
- # All StandardErrors are ignored when the :force option is set.
1516
+ # Removes entries at the paths in the given `list` (a single path or an array of
1517
+ # paths) returns `list`, if it is an array, `[list]` otherwise.
1518
+ #
1519
+ # Argument `list` or its elements should be [interpretable as
1520
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1521
+ #
1522
+ # With no keyword arguments, removes files at the paths given in `list`:
1523
+ #
1524
+ # FileUtils.touch(['src0.txt', 'src0.dat'])
1525
+ # FileUtils.rm(['src0.dat', 'src0.txt']) # => ["src0.dat", "src0.txt"]
754
1526
  #
755
- # FileUtils.rm %w( junk.txt dust.txt )
756
- # FileUtils.rm Dir.glob('*.so')
757
- # FileUtils.rm 'NotExistFile', force: true # never raises exception
1527
+ # Keyword arguments:
1528
+ #
1529
+ # * `force: true` - ignores raised exceptions of StandardError and its
1530
+ # descendants.
1531
+ # * `noop: true` - does not remove files; returns `nil`.
1532
+ # * `verbose: true` - prints an equivalent command:
1533
+ #
1534
+ # FileUtils.rm(['src0.dat', 'src0.txt'], noop: true, verbose: true)
1535
+ #
1536
+ # Output:
1537
+ #
1538
+ # rm src0.dat src0.txt
1539
+ #
1540
+ #
1541
+ # FileUtils.remove is an alias for FileUtils.rm.
1542
+ #
1543
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
758
1544
  #
759
1545
  def self?.rm: (pathlist list, ?force: boolish, ?noop: boolish, ?verbose: boolish) -> void
760
1546
 
@@ -776,9 +1562,18 @@ module FileUtils
776
1562
  # rdoc-file=lib/fileutils.rb
777
1563
  # - rm_f(list, noop: nil, verbose: nil)
778
1564
  # -->
779
- # Equivalent to
1565
+ # Equivalent to:
1566
+ #
1567
+ # FileUtils.rm(list, force: true, **kwargs)
1568
+ #
1569
+ # Argument `list` (a single path or an array of paths) should be [interpretable
1570
+ # as paths](rdoc-ref:FileUtils@Path+Arguments).
1571
+ #
1572
+ # See FileUtils.rm for keyword arguments.
780
1573
  #
781
- # FileUtils.rm(list, force: true)
1574
+ # FileUtils.safe_unlink is an alias for FileUtils.rm_f.
1575
+ #
1576
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
782
1577
  #
783
1578
  def self?.rm_f: (pathlist list, ?noop: boolish, ?verbose: boolish) -> void
784
1579
 
@@ -800,22 +1595,55 @@ module FileUtils
800
1595
  # rdoc-file=lib/fileutils.rb
801
1596
  # - rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
802
1597
  # -->
803
- # remove files `list`[0] `list`[1]... If `list`[n] is a directory, removes its
804
- # all contents recursively. This method ignores StandardError when :force option
805
- # is set.
1598
+ # Removes entries at the paths in the given `list` (a single path or an array of
1599
+ # paths); returns `list`, if it is an array, `[list]` otherwise.
1600
+ #
1601
+ # Argument `list` or its elements should be [interpretable as
1602
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1603
+ #
1604
+ # May cause a local vulnerability if not called with keyword argument `secure:
1605
+ # true`; see [Avoiding the TOCTTOU
1606
+ # Vulnerability](rdoc-ref:FileUtils@Avoiding+the+TOCTTOU+Vulnerability).
1607
+ #
1608
+ # For each file path, removes the file at that path:
1609
+ #
1610
+ # FileUtils.touch(['src0.txt', 'src0.dat'])
1611
+ # FileUtils.rm_r(['src0.dat', 'src0.txt'])
1612
+ # File.exist?('src0.txt') # => false
1613
+ # File.exist?('src0.dat') # => false
1614
+ #
1615
+ # For each directory path, recursively removes files and directories:
1616
+ #
1617
+ # tree('src1')
1618
+ # # => src1
1619
+ # # |-- dir0
1620
+ # # | |-- src0.txt
1621
+ # # | `-- src1.txt
1622
+ # # `-- dir1
1623
+ # # |-- src2.txt
1624
+ # # `-- src3.txt
1625
+ # FileUtils.rm_r('src1')
1626
+ # File.exist?('src1') # => false
1627
+ #
1628
+ # Keyword arguments:
1629
+ #
1630
+ # * `force: true` - ignores raised exceptions of StandardError and its
1631
+ # descendants.
1632
+ # * `noop: true` - does not remove entries; returns `nil`.
1633
+ # * `secure: true` - removes `src` securely; see details at
1634
+ # FileUtils.remove_entry_secure.
1635
+ # * `verbose: true` - prints an equivalent command:
1636
+ #
1637
+ # FileUtils.rm_r(['src0.dat', 'src0.txt'], noop: true, verbose: true)
1638
+ # FileUtils.rm_r('src1', noop: true, verbose: true)
806
1639
  #
807
- # FileUtils.rm_r Dir.glob('/tmp/*')
808
- # FileUtils.rm_r 'some_dir', force: true
1640
+ # Output:
809
1641
  #
810
- # WARNING: This method causes local vulnerability if one of parent directories
811
- # or removing directory tree are world writable (including /tmp, whose
812
- # permission is 1777), and the current process has strong privilege such as Unix
813
- # super user (root), and the system has symbolic link. For secure removing,
814
- # read the documentation of remove_entry_secure carefully, and set :secure
815
- # option to true. Default is `secure: false`.
1642
+ # rm -r src0.dat src0.txt
1643
+ # rm -r src1
816
1644
  #
817
- # NOTE: This method calls remove_entry_secure if :secure option is set. See also
818
- # remove_entry_secure.
1645
+ #
1646
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
819
1647
  #
820
1648
  def self?.rm_r: (pathlist list, ?force: boolish, ?noop: boolish, ?verbose: boolish, ?secure: boolish) -> void
821
1649
 
@@ -823,12 +1651,22 @@ module FileUtils
823
1651
  # rdoc-file=lib/fileutils.rb
824
1652
  # - rm_rf(list, noop: nil, verbose: nil, secure: nil)
825
1653
  # -->
826
- # Equivalent to
1654
+ # Equivalent to:
1655
+ #
1656
+ # FileUtils.rm_r(list, force: true, **kwargs)
1657
+ #
1658
+ # Argument `list` or its elements should be [interpretable as
1659
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1660
+ #
1661
+ # May cause a local vulnerability if not called with keyword argument `secure:
1662
+ # true`; see [Avoiding the TOCTTOU
1663
+ # Vulnerability](rdoc-ref:FileUtils@Avoiding+the+TOCTTOU+Vulnerability).
1664
+ #
1665
+ # See FileUtils.rm_r for keyword arguments.
827
1666
  #
828
- # FileUtils.rm_r(list, force: true)
1667
+ # FileUtils.rmtree is an alias for FileUtils.rm_rf.
829
1668
  #
830
- # WARNING: This method causes local vulnerability. Read the documentation of
831
- # rm_r first.
1669
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
832
1670
  #
833
1671
  def self?.rm_rf: (pathlist list, ?noop: boolish, ?verbose: boolish, ?secure: boolish) -> void
834
1672
 
@@ -850,12 +1688,37 @@ module FileUtils
850
1688
  # rdoc-file=lib/fileutils.rb
851
1689
  # - rmdir(list, parents: nil, noop: nil, verbose: nil)
852
1690
  # -->
853
- # Removes one or more directories.
1691
+ # Removes directories at the paths in the given `list` (a single path or an
1692
+ # array of paths); returns `list`, if it is an array, `[list]` otherwise.
1693
+ #
1694
+ # Argument `list` or its elements should be [interpretable as
1695
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1696
+ #
1697
+ # With no keyword arguments, removes the directory at each `path` in `list`, by
1698
+ # calling: `Dir.rmdir(path)`; see [Dir.rmdir](rdoc-ref:Dir.rmdir):
1699
+ #
1700
+ # FileUtils.rmdir(%w[tmp0/tmp1 tmp2/tmp3]) # => ["tmp0/tmp1", "tmp2/tmp3"]
1701
+ # FileUtils.rmdir('tmp4/tmp5') # => ["tmp4/tmp5"]
1702
+ #
1703
+ # Keyword arguments:
1704
+ #
1705
+ # * `parents: true` - removes successive ancestor directories if empty.
1706
+ # * `noop: true` - does not remove directories.
1707
+ # * `verbose: true` - prints an equivalent command:
854
1708
  #
855
- # FileUtils.rmdir 'somedir'
856
- # FileUtils.rmdir %w(somedir anydir otherdir)
857
- # # Does not really remove directory; outputs message.
858
- # FileUtils.rmdir 'somedir', verbose: true, noop: true
1709
+ # FileUtils.rmdir(%w[tmp0/tmp1 tmp2/tmp3], parents: true, verbose: true)
1710
+ # FileUtils.rmdir('tmp4/tmp5', parents: true, verbose: true)
1711
+ #
1712
+ # Output:
1713
+ #
1714
+ # rmdir -p tmp0/tmp1 tmp2/tmp3
1715
+ # rmdir -p tmp4/tmp5
1716
+ #
1717
+ #
1718
+ # Raises an exception if a directory does not exist or if for any reason a
1719
+ # directory cannot be removed.
1720
+ #
1721
+ # Related: [methods for deleting](rdoc-ref:FileUtils@Deleting).
859
1722
  #
860
1723
  def self?.rmdir: (pathlist list, ?parents: boolish, ?noop: boolish, ?verbose: boolish) -> void
861
1724
 
@@ -863,11 +1726,50 @@ module FileUtils
863
1726
  # rdoc-file=lib/fileutils.rb
864
1727
  # - touch(list, noop: nil, verbose: nil, mtime: nil, nocreate: nil)
865
1728
  # -->
866
- # Updates modification time (mtime) and access time (atime) of file(s) in
867
- # `list`. Files are created if they don't exist.
1729
+ # Updates modification times (mtime) and access times (atime) of the entries
1730
+ # given by the paths in `list` (a single path or an array of paths); returns
1731
+ # `list` if it is an array, `[list]` otherwise.
1732
+ #
1733
+ # By default, creates an empty file for any path to a non-existent entry; use
1734
+ # keyword argument `nocreate` to raise an exception instead.
1735
+ #
1736
+ # Argument `list` or its elements should be [interpretable as
1737
+ # paths](rdoc-ref:FileUtils@Path+Arguments).
1738
+ #
1739
+ # Examples:
1740
+ #
1741
+ # # Single path.
1742
+ # f = File.new('src0.txt') # Existing file.
1743
+ # f.atime # => 2022-06-10 11:11:21.200277 -0700
1744
+ # f.mtime # => 2022-06-10 11:11:21.200277 -0700
1745
+ # FileUtils.touch('src0.txt')
1746
+ # f = File.new('src0.txt')
1747
+ # f.atime # => 2022-06-11 08:28:09.8185343 -0700
1748
+ # f.mtime # => 2022-06-11 08:28:09.8185343 -0700
1749
+ #
1750
+ # # Array of paths.
1751
+ # FileUtils.touch(['src0.txt', 'src0.dat'])
868
1752
  #
869
- # FileUtils.touch 'timestamp'
870
- # FileUtils.touch Dir.glob('*.c'); system 'make'
1753
+ # Keyword arguments:
1754
+ #
1755
+ # * `mtime: *time`* - sets the entry's mtime to the given time, instead of the
1756
+ # current time.
1757
+ # * `nocreate: true` - raises an exception if the entry does not exist.
1758
+ # * `noop: true` - does not touch entries; returns `nil`.
1759
+ # * `verbose: true` - prints an equivalent command:
1760
+ #
1761
+ # FileUtils.touch('src0.txt', noop: true, verbose: true)
1762
+ # FileUtils.touch(['src0.txt', 'src0.dat'], noop: true, verbose: true)
1763
+ # FileUtils.touch(path, noop: true, verbose: true)
1764
+ #
1765
+ # Output:
1766
+ #
1767
+ # touch src0.txt
1768
+ # touch src0.txt src0.dat
1769
+ # touch src0.txt
1770
+ #
1771
+ #
1772
+ # Related: FileUtils.uptodate?.
871
1773
  #
872
1774
  def self?.touch: (pathlist list, ?noop: boolish, ?verbose: boolish, ?mtime: (Time | Numeric)?, ?nocreate: boolish) -> void
873
1775
 
@@ -875,11 +1777,18 @@ module FileUtils
875
1777
  # rdoc-file=lib/fileutils.rb
876
1778
  # - uptodate?(new, old_list)
877
1779
  # -->
878
- # Returns true if `new` is newer than all `old_list`. Non-existent files are
879
- # older than any file.
1780
+ # Returns `true` if the file at path `new` is newer than all the files at paths
1781
+ # in array `old_list`; `false` otherwise.
1782
+ #
1783
+ # Argument `new` and the elements of `old_list` should be [interpretable as
1784
+ # paths](rdoc-ref:FileUtils@Path+Arguments):
1785
+ #
1786
+ # FileUtils.uptodate?('Rakefile', ['Gemfile', 'README.md']) # => true
1787
+ # FileUtils.uptodate?('Gemfile', ['Rakefile', 'README.md']) # => false
1788
+ #
1789
+ # A non-existent file is considered to be infinitely old.
880
1790
  #
881
- # FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or \
882
- # system 'make hello.o'
1791
+ # Related: FileUtils.touch.
883
1792
  #
884
1793
  def self?.uptodate?: (path new, pathlist old_list) -> bool
885
1794
  end