123456789_123456789_123456789_123456789_123456789_

Module: FileUtils

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Extended In:
Included In:
Defined in: lib/rake/file_utils.rb

Constant Summary

Instance Method Summary

Instance Method Details

#create_shell_runner(cmd) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/file_utils.rb', line 61

def create_shell_runner(cmd) # :nodoc:
  show_command = sh_show_command cmd
  show_command = show_command[0, 42] + "..." unless $trace

  lambda do |ok, status|
    ok or
      fail "Command failed with status (#{status.exitstatus}): " +
      "[#{show_command}]"
  end
end

#ruby(*args, &block)

Run a Ruby interpreter with the given arguments.

Example:

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

  
# File 'lib/rake/file_utils.rb', line 100

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)

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

[ GitHub ]

  
# File 'lib/rake/file_utils.rb', line 113

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

#set_verbose_option(options) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/file_utils.rb', line 86

def set_verbose_option(options) # :nodoc:
  unless options.key? :verbose
    options[:verbose] =
      (Rake::FileUtilsExt.verbose_flag == Rake::FileUtilsExt::DEFAULT) ||
      Rake::FileUtilsExt.verbose_flag
  end
end

#sh(*cmd, &block)

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
[ GitHub ]

  
# File 'lib/rake/file_utils.rb', line 43

def sh(*cmd, &block)
  options = (Hash === cmd.last) ? cmd.pop : {}
  shell_runner = block_given? ? block : create_shell_runner(cmd)

  set_verbose_option(options)
  verbose = options.delete :verbose
  noop    = options.delete(:noop) || Rake::FileUtilsExt.nowrite_flag

  Rake.rake_output_message sh_show_command cmd if verbose

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

#sh_show_command(cmd) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/file_utils.rb', line 73

def sh_show_command(cmd) # :nodoc:
  cmd = cmd.dup

  if Hash === cmd.first
    env = cmd.first
    env = env.map { |name, value| "#{name}=#{value}" }.join " "
    cmd[0] = env
  end

  cmd.join " "
end

#split_all(path)

Split a file path into individual directory names.

Example:

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

  
# File 'lib/rake/file_utils.rb', line 131

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