Module: FileUtils

Included in:
Rake::Cleaner, Rake::FileUtilsExt
Defined in:
lib/rake/file_utils.rb

Overview

– This a FileUtils extension that defines several additional commands to be added to the FileUtils utility functions.

Constant Summary

RUBY =

Path to the currently running Ruby program

ENV['RUBY'] || File.join(
RbConfig::CONFIG['bindir'],
RbConfig::CONFIG['ruby_install_name'] + RbConfig::CONFIG['EXEEXT']).
sub(/.*\s.*/m, '"\&"')
LN_SUPPORTED =
[true]

Instance Method Summary collapse

Instance Method Details

#ruby(*args, &block) ⇒ Object

Run a Ruby interpreter with the given arguments.

Example:

ruby %{-pe '$_.upcase!' <README}


91
92
93
94
95
96
97
98
# File 'lib/rake/file_utils.rb', line 91

def ruby(*args, &block)
  options = (Hash === args.last) ? args.pop : {}
  if args.length > 1
    sh(*([RUBY] + args + [options]), &block)
  else
    sh("#{RUBY} #{args.first}", options, &block)
  end
end

#safe_ln(*args) ⇒ Object

Attempt to do a normal file link, but fall back to a copy if the link

fails.


104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/rake/file_utils.rb', line 104

def safe_ln(*args)
  if ! LN_SUPPORTED[0]
    cp(*args)
  else
    begin
      ln(*args)
    rescue StandardError, NotImplementedError
      LN_SUPPORTED[0] = false
      cp(*args)
    end
  end
end

#sh(*cmd, &block) ⇒ Object

Run the system command cmd. If multiple arguments are given the command is run directly (without the shell, same semantics as Kernel::exec and Kernel::system).

It is recommended you use the multiple argument form over interpolating user input for both usability and security reasons. With the multiple argument form you can easily process files with spaces or other shell reserved characters in them. With the multiple argument form your rake tasks are not vulnerable to users providing an argument like ; rm # -rf /.

If a block is given, upon command completion the block is called with an OK flag (true on a zero exit status) and a Process::Status object. Without a block a RuntimeError is raised when the command exits non-zero.

Examples:

sh 'ls -ltr'

sh 'ls', 'file with spaces'

# check exit status after command runs
sh %{grep pattern file} do |ok, res|
  if ! ok
    puts "pattern not found (status = #{res.exitstatus})"
  end
end


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/rake/file_utils.rb', line 45

def sh(*cmd, &block)
  options = (Hash === cmd.last) ? cmd.pop : {}
  shell_runner = block_given? ? block : create_shell_runner(cmd)
  set_verbose_option(options)
  options[:noop] ||= Rake::FileUtilsExt.nowrite_flag
  Rake.rake_check_options options, :noop, :verbose
  Rake.rake_output_message cmd.join(" ") if options[:verbose]

  unless options[:noop]
    res = rake_system(*cmd)
    status = $?
    status = Rake::PseudoStatus.new(1) if !res && status.nil?
    shell_runner.call(res, status)
  end
end

#split_all(path) ⇒ Object

Split a file path into individual directory names.

Example:

split_all("a/b/c") =>  ['a', 'b', 'c']


122
123
124
125
126
127
# File 'lib/rake/file_utils.rb', line 122

def split_all(path)
  head, tail = File.split(path)
  return [tail] if head == '.' || tail == '/'
  return [head, tail] if head == '/'
  return split_all(head) + [tail]
end