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

Sign up to get free protection for your applications and to get access to all the features.
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