123456789_123456789_123456789_123456789_123456789_

Class: Rake::Application

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Inherits: Object
Defined in: lib/rake/application.rb

Overview

::Rake main application object. When invoking rake from the command line, a Application object is created and run.

Constant Summary

Class Method Summary

Instance Attribute Summary

TaskManager - Included

#last_description

Track the last comment made in the Rakefile.

Instance Method Summary

TraceOutput - Included

#trace_on

Write trace output to output stream out.

TaskManager - Included

#[]

Find a matching task for task_name.

#clear

Clear all tasks in this application.

#current_scope

Return the list of scope names currently active in the task manager.

#enhance_with_matching_rule

If a rule can be found that matches the task name, enhance the task with the prerequisites and actions from the rule.

#generate_did_you_mean_suggestions, #generate_message_for_undefined_task,
#in_namespace

Evaluate the block in a nested namespace named #name.

#intern

Lookup a task.

#lookup

Lookup a task, using scope and the scope hints in the task name.

#resolve_args

Resolve the arguments for a task/rule.

#tasks

List of all defined tasks in this application.

#tasks_in_scope

List of all the tasks defined in the given scope (and its sub-scopes).

#add_location

Add a location to the locations field of the given task.

#attempt_rule

Attempt to create a rule given the list of prerequisites.

#find_location

Find the location that called into the dsl layer.

#generate_name

Generate an anonymous namespace name.

#get_description

Return the current description, clearing it in the process.

#lookup_in_scope

Lookup the task name.

#make_sources

Make a list of sources from the list of file name extensions / translation procs.

#resolve_args_without_dependencies

Resolve task arguments for a task or rule when there are no dependencies declared.

#create_rule, #define_task, #initialize, #synthesize_file_task,
#resolve_args_with_dependencies

Resolve task arguments for a task or rule when there are dependencies declared.

#trace_rule

Constructor Details

.newApplication

Initialize a Application object.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 49

def initialize
  super
  @name = "rake"
  @rakefiles = DEFAULT_RAKEFILES.dup
  @rakefile = nil
  @pending_imports = []
  @imported = []
  @loaders = {}
  @default_loader = Rake::DefaultLoader.new
  @original_dir = Dir.pwd
  @top_level_tasks = []
  add_loader("rb", DefaultLoader.new)
  add_loader("rf", DefaultLoader.new)
  add_loader("rake", DefaultLoader.new)
  @tty_output = STDOUT.tty?
  @terminal_columns = ENV["RAKE_COLUMNS"].to_i

  set_default_options
end

Instance Attribute Details

#name (readonly)

The name of the application (typically ‘rake’)

[ GitHub ]

  
# File 'lib/rake/application.rb', line 24

attr_reader :name

#original_dir (readonly)

The original directory where rake was invoked.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 27

attr_reader :original_dir

#rakefile (readonly)

Name of the actual rakefile used.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 30

attr_reader :rakefile

#terminal_columns (rw)

Number of columns on the terminal

[ GitHub ]

  
# File 'lib/rake/application.rb', line 33

attr_accessor :terminal_columns

#top_level_tasks (readonly)

List of the top level task names (task names from the command line).

[ GitHub ]

  
# File 'lib/rake/application.rb', line 36

attr_reader :top_level_tasks

#truncate_output?Boolean (readonly)

This method is for internal use only.

We will truncate output if we are outputting to a TTY or if we’ve been given an explicit column width to honor

[ GitHub ]

  
# File 'lib/rake/application.rb', line 317

def truncate_output? # :nodoc:
  tty_output? || @terminal_columns.nonzero?
end

#tty_output=(value) (rw)

Override the detected TTY output state (mostly for testing)

[ GitHub ]

  
# File 'lib/rake/application.rb', line 39

attr_writer :tty_output

#tty_output?Boolean (rw)

This method is for internal use only.

True if we are outputting to TTY, false otherwise

[ GitHub ]

  
# File 'lib/rake/application.rb', line 311

def tty_output? # :nodoc:
  @tty_output
end

#unix?Boolean (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 385

def unix? # :nodoc:
  RbConfig::CONFIG["host_os"] =~
    /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
end

#windows?Boolean (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 390

def windows? # :nodoc:
  Win32.windows?
end

Instance Method Details

#add_import(fn)

This method is for internal use only.

Add a file to the list of files to be imported.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 801

def add_import(fn) # :nodoc:
  @pending_imports << fn
end

#add_loader(ext, loader)

Add a loader to handle imported files ending in the extension ext.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 161

def add_loader(ext, loader)
  ext = ".#{ext}" unless ext =~ /^\./
  @loaders[ext] = loader
end

#collect_command_line_tasks(args)

This method is for internal use only.

Collect the list of tasks on the command line. If no tasks are given, return a list containing only the default task. Environmental assignments are processed at this time as well.

args is the list of arguments to peruse to get the list of tasks. It should be the command line that was given to rake, less any recognised command-line options, which OptionParser.parse will have taken care of already.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 782

def collect_command_line_tasks(args) # :nodoc:
  @top_level_tasks = []
  args.each do |arg|
    if arg =~ /^(\w+)=(.*)$/m
      ENV[$1] = $2
    else
      @top_level_tasks << arg unless arg =~ /^-/
    end
  end
  @top_level_tasks.push(default_task_name) if @top_level_tasks.empty?
end

#default_task_name

This method is for internal use only.

Default task name (“default”). (May be overridden by subclasses)

[ GitHub ]

  
# File 'lib/rake/application.rb', line 796

def default_task_name # :nodoc:
  "default"
end

#deprecate(old_usage, new_usage, call_site)

This method is for internal use only.

Warn about deprecated usage.

Example:

Rake.application.deprecate("import", "Rake.import", caller.first)
[ GitHub ]

  
# File 'lib/rake/application.rb', line 282

def deprecate(old_usage, new_usage, call_site) # :nodoc:
  unless options.ignore_deprecate
    $stderr.puts "WARNING: '#{old_usage}' is deprecated.  " +
      "Please use '#{new_usage}' instead.\n" +
      "    at #{call_site}"
  end
end

#display_cause_details(ex)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 244

def display_cause_details(ex) # :nodoc:
  return if display_exception_details_seen.include? ex

  trace "\nCaused by:"
  display_exception_details(ex)
end

#display_error_message(ex)

This method is for internal use only.

Display the error message that caused the exception.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 228

def display_error_message(ex) # :nodoc:
  trace "#{name} aborted!"
  display_exception_details(ex)
  trace "Tasks: #{ex.chain}" if has_chain?(ex)
  trace "(See full trace by running task with --trace)" unless
     options.backtrace
end

#display_exception_backtrace(ex)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 269

def display_exception_backtrace(ex) # :nodoc:
  if options.backtrace
    trace ex.backtrace.join("\n")
  else
    trace Backtrace.collapse(ex.backtrace).join("\n")
  end
end

#display_exception_details(ex)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 236

def display_exception_details(ex) # :nodoc:
  display_exception_details_seen << ex

  display_exception_message_details(ex)
  display_exception_backtrace(ex)
  display_cause_details(ex.cause) if has_cause?(ex)
end

#display_exception_details_seen

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 251

def display_exception_details_seen # :nodoc:
  Thread.current[:rake_display_exception_details_seen] ||= []
end

#display_exception_message_details(ex)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 259

def display_exception_message_details(ex) # :nodoc:
  if ex.instance_of?(RuntimeError)
    trace ex.message
  elsif ex.respond_to?(:detailed_message)
    trace "#{ex.class.name}: #{ex.detailed_message(highlight: false)}"
  else
    trace "#{ex.class.name}: #{ex.message}"
  end
end

#display_prerequisites

This method is for internal use only.

Display the tasks and prerequisites

[ GitHub ]

  
# File 'lib/rake/application.rb', line 405

def display_prerequisites # :nodoc:
  tasks.each do |t|
    puts "#{name} #{t.name}"
    t.prerequisites.each { |pre| puts "    #{pre}" }
  end
end

#display_tasks_and_comments

This method is for internal use only.

Display the tasks and comments.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 322

def display_tasks_and_comments # :nodoc:
  displayable_tasks = tasks.select { |t|
    (options.show_all_tasks || t.comment) &&
      t.name =~ options.show_task_pattern
  }
  case options.show_tasks
  when :tasks
    width = displayable_tasks.map { |t| t.name_with_args.length }.max || 10
    if truncate_output?
      max_column = terminal_width - name.size - width - 7
    else
      max_column = nil
    end

    displayable_tasks.each do |t|
      printf("#{name} %-#{width}s  # %s\n",
        t.name_with_args,
        max_column ? truncate(t.comment, max_column) : t.comment)
    end
  when :describe
    displayable_tasks.each do |t|
      puts "#{name} #{t.name_with_args}"
      comment = t.full_comment || ""
      comment.split("\n").each do |line|
        puts "    #{line}"
      end
      puts
    end
  when :lines
    displayable_tasks.each do |t|
      t.locations.each do |loc|
        printf "#{name} %-30s %s\n", t.name_with_args, loc
      end
    end
  else
    fail "Unknown show task mode: '#{options.show_tasks}'"
  end
end

#dynamic_width

This method is for internal use only.

Calculate the dynamic width of the

[ GitHub ]

  
# File 'lib/rake/application.rb', line 373

def dynamic_width # :nodoc:
  @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
end

#dynamic_width_stty

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 377

def dynamic_width_stty # :nodoc:
  %x{stty size 2>/dev/null}.split[1].to_i
end

#dynamic_width_tput

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 381

def dynamic_width_tput # :nodoc:
  %x{tput cols 2>/dev/null}.to_i
end

#exit_because_of_exception(ex)

This method is for internal use only.

Exit the program because of an unhandled exception. (may be overridden by subclasses)

[ GitHub ]

  
# File 'lib/rake/application.rb', line 223

def exit_because_of_exception(ex) # :nodoc:
  exit(false)
end

#find_rakefile_location

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 702

def find_rakefile_location # :nodoc:
  here = Dir.pwd
  until (fn = have_rakefile)
    Dir.chdir("..")
    return nil if Dir.pwd == here || options.nosearch
    here = Dir.pwd
  end
  [fn, here]
ensure
  Dir.chdir(Rake.original_dir)
end

#glob(path, &block) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 745

def glob(path, &block) # :nodoc:
  FileList.glob(path.tr("\\", "/")).each(&block)
end

#handle_options(argv)

This method is for internal use only.

Read and handle the command line options. Returns the command line arguments that we didn’t understand, which should (in theory) be just task names and env vars.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 668

def handle_options(argv) # :nodoc:
  set_default_options

  OptionParser.new do |opts|
    opts.banner = "#{Rake.application.name} [-f rakefile] {options} targets..."
    opts.separator ""
    opts.separator "Options are ..."

    opts.on_tail("-h", "--help", "-H", "Display this help message.") do
      puts opts
      exit
    end

    standard_rake_options.each { |args| opts.on(*args) }
    opts.environment("RAKEOPT")
  end.parse(argv)
end

#has_cause?(ex) ⇒ Boolean

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 255

def has_cause?(ex) # :nodoc:
  ex.respond_to?(:cause) && ex.cause
end

#has_chain?(exception) ⇒ Boolean (private)

This method is for internal use only.

Does the exception have a task invocation chain?

[ GitHub ]

  
# File 'lib/rake/application.rb', line 291

def has_chain?(exception) # :nodoc:
  exception.respond_to?(:chain) && exception.chain
end

#have_rakefile

This method is for internal use only.

True if one of the files in RAKEFILES is in the current directory. If a match is found, it is copied into @rakefile.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 298

def have_rakefile # :nodoc:
  @rakefiles.each do |fn|
    if File.exist?(fn)
      others = FileList.glob(fn, File::FNM_CASEFOLD)
      return others.size == 1 ? others.first : fn
    elsif fn == ""
      return fn
    end
  end
  return nil
end

#init(app_name = "rake", argv = ARGV)

Initialize the command line parameters and app name.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 88

def init(app_name="rake", argv = ARGV)
  standard_exception_handling do
    @name = app_name
    begin
      args = handle_options argv
    rescue ArgumentError
      # Backward compatibility for capistrano
      args = handle_options
    end
    load_debug_at_stop_feature
    collect_command_line_tasks(args)
  end
end

#invoke_task(task_string)

This method is for internal use only.

Invokes a task with arguments that are extracted from task_string

[ GitHub ]

  
# File 'lib/rake/application.rb', line 179

def invoke_task(task_string) # :nodoc:
  name, args = parse_task_string(task_string)
  t = self[name]
  t.invoke(*args)
end

#load_debug_at_stop_feature (private)

[ GitHub ]

  
# File 'lib/rake/application.rb', line 102

def load_debug_at_stop_feature
  return unless ENV["RAKE_DEBUG"]
  require "debug/session"
  DEBUGGER__::start no_sigint_hook: true, nonstop: true
  Rake::Task.prepend Module.new {
    def execute(*)
      exception = DEBUGGER__::SESSION.capture_exception_frames(/(exe|bin|lib)\/rake/) do
        super
      end

      if exception
        STDERR.puts exception.message
        DEBUGGER__::SESSION.enter_postmortem_session exception
        raise exception
      end
    end
  }
rescue LoadError
end

#load_imports

This method is for internal use only.

Load the pending list of imported files.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 806

def load_imports # :nodoc:
  while fn = @pending_imports.shift
    next if @imported.member?(fn)
    fn_task = lookup(fn) and fn_task.invoke
    ext = File.extname(fn)
    loader = @loaders[ext] || @default_loader
    loader.load(fn)
    if fn_task = lookup(fn) and fn_task.needed?
      fn_task.reenable
      fn_task.invoke
      loader.load(fn)
    end
    @imported << fn
  end
end

#load_rakefile

Find the rakefile and then load it and any pending imports.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 124

def load_rakefile
  standard_exception_handling do
    raw_load_rakefile
  end
end

#options

Application options from the command line

[ GitHub ]

  
# File 'lib/rake/application.rb', line 167

def options
  @options ||= OpenStruct.new
end

#parse_task_string(string)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 185

def parse_task_string(string) # :nodoc:
  /^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s

  name           = $1
  remaining_args = $2

  return string, [] unless name
  return name,   [] if     remaining_args.empty?

  args = []

  begin
    /\s*((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args

    remaining_args = $2
    args << $1.gsub(/\\(.)/, '\1')
  end while remaining_args

  return name, args
end

#rake_require(file_name, paths = $LOAD_PATH, loaded = $")

This method is for internal use only.

Similar to the regular Ruby require command, but will check for *.rake files in addition to *.rb files.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 688

def rake_require(file_name, paths=$LOAD_PATH, loaded=$") # :nodoc:
  fn = file_name + ".rake"
  return false if loaded.include?(fn)
  paths.each do |path|
    full_path = File.join(path, fn)
    if File.exist?(full_path)
      Rake.load_rakefile(full_path)
      loaded << fn
      return true
    end
  end
  fail LoadError, "Can't find #{file_name}"
end

#rakefile_location(backtrace = caller)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 822

def rakefile_location(backtrace=caller) # :nodoc:
  backtrace.map { |t| t[/([^:]+):/, 1] }

  re = /^#{@rakefile}$/
  re = /#{re.source}/i if windows?

  backtrace.find { |str| str =~ re } || ""
end

#raw_load_rakefile

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 719

def raw_load_rakefile # :nodoc:
  rakefile, location = find_rakefile_location
  if (!options.ignore_system) &&
      (options.load_system || rakefile.nil?) &&
      system_dir && File.directory?(system_dir)
    print_rakefile_directory(location)
    glob("#{system_dir}/*.rake") do |name|
      add_import name
    end
  else
    fail "No Rakefile found (looking for: #{@rakefiles.join(', ')})" if
      rakefile.nil?
    @rakefile = rakefile
    Dir.chdir(location)
    print_rakefile_directory(location)
    Rake.load_rakefile(File.expand_path(@rakefile)) if
      @rakefile && @rakefile != ""
    options.rakelib.each do |rlib|
      glob("#{rlib}/*.rake") do |name|
        add_import name
      end
    end
  end
  load_imports
end

#run(argv = ARGV)

Run the ::Rake application. The run method performs the following three steps:

If you wish to build a custom rake command, you should call #init on your application. Then define any tasks. Finally, call #top_level to run your top level tasks.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 79

def run(argv = ARGV)
  standard_exception_handling do
    init "rake", argv
    load_rakefile
    top_level
  end
end

#run_with_threads

Run the given block with the thread startup and shutdown.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 144

def run_with_threads
  thread_pool.gather_history if options.job_stats == :history

  yield

  thread_pool.join if defined?(@thread_pool)
  if options.job_stats
    stats = thread_pool.statistics
    puts "Maximum active threads: #{stats[:max_active_threads]} + main"
    puts "Total threads in play:  #{stats[:total_threads_in_play]} + main"
  end
  ThreadHistoryDisplay.new(thread_pool.history).show if
    options.job_stats == :history
end

#select_tasks_to_show(options, show_tasks, value) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 644

def select_tasks_to_show(options, show_tasks, value) # :nodoc:
  options.show_tasks = show_tasks
  options.show_task_pattern = Regexp.new(value || "")
  Rake::TaskManager. = true
end

#select_trace_output(options, trace_option, value) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 651

def select_trace_output(options, trace_option, value) # :nodoc:
  value = value.strip unless value.nil?
  case value
  when "stdout"
    options.trace_output = $stdout
  when "stderr", nil
    options.trace_output = $stderr
  else
    fail CommandLineOptionError,
      "Unrecognized --#{trace_option} option '#{value}'"
  end
end

#set_default_options

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 831

def set_default_options # :nodoc:
  options.always_multitask           = false
  options.backtrace                  = false
  options.build_all                  = false
  options.dryrun                     = false
  options.ignore_deprecate           = false
  options.ignore_system              = false
  options.job_stats                  = false
  options.load_system                = false
  options.nosearch                   = false
  options.rakelib                    = %w[rakelib]
  options.show_all_tasks             = false
  options.show_prereqs               = false
  options.show_task_pattern          = nil
  options.show_tasks                 = nil
  options.silent                     = false
  options.suppress_backtrace_pattern = nil
  options.thread_pool_size           = Rake.suggested_thread_count
  options.trace                      = false
  options.trace_output               = $stderr
  options.trace_rules                = false
end

#sort_options(options) (private)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 417

def sort_options(options) # :nodoc:
  options.sort_by { |opt|
    opt.select { |o| o.is_a?(String) && o =~ /^-/ }.map(&:downcase).sort.reverse
  }
end

#standard_exception_handling

This method is for internal use only.

Provide standard exception handling for the given block.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 207

def standard_exception_handling # :nodoc:
  yield
rescue SystemExit
  # Exit silently with current status
  raise
rescue OptionParser::InvalidOption => ex
  $stderr.puts ex.message
  exit(false)
rescue Exception => ex
  # Exit with error message
  display_error_message(ex)
  exit_because_of_exception(ex)
end

#standard_rake_options

This method is for internal use only.

A list of all the standard options used in rake, suitable for passing to OptionParser.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 426

def standard_rake_options # :nodoc:
  sort_options(
    [
      ["--all", "-A",
        "Show all tasks, even uncommented ones (in combination with -T or -D)",
        lambda { |value|
          options.show_all_tasks = value
        }
      ],
      ["--backtrace=[OUT]",
        "Enable full backtrace.  OUT can be stderr (default) or stdout.",
        lambda { |value|
          options.backtrace = true
          select_trace_output(options, "backtrace", value)
        }
      ],
      ["--build-all", "-B",
       "Build all prerequisites, including those which are up-to-date.",
       lambda { |value|
         options.build_all = true
       }
      ],
      ["--comments",
        "Show commented tasks only",
        lambda { |value|
          options.show_all_tasks = !value
        }
      ],
      ["--describe", "-D [PATTERN]",
        "Describe the tasks (matching optional PATTERN), then exit.",
        lambda { |value|
          select_tasks_to_show(options, :describe, value)
        }
      ],
      ["--directory", "-C [DIRECTORY]",
        "Change to DIRECTORY before doing anything.",
        lambda { |value|
          Dir.chdir value
          @original_dir = Dir.pwd
        }
      ],
      ["--dry-run", "-n",
        "Do a dry run without executing actions.",
        lambda { |value|
          Rake.verbose(true)
          Rake.nowrite(true)
          options.dryrun = true
          options.trace = true
        }
      ],
      ["--execute", "-e CODE",
        "Execute some Ruby code and exit.",
        lambda { |value|
          eval(value)
          exit
        }
      ],
      ["--execute-print", "-p CODE",
        "Execute some Ruby code, print the result, then exit.",
        lambda { |value|
          puts eval(value)
          exit
        }
      ],
      ["--execute-continue",  "-E CODE",
        "Execute some Ruby code, " +
        "then continue with normal task processing.",
        lambda { |value| eval(value) }
      ],
      ["--jobs",  "-j [NUMBER]",
        "Specifies the maximum number of tasks to execute in parallel. " +
        "(default is number of CPU cores + 4)",
        lambda { |value|
          if value.nil? || value == ""
            value = Float::INFINITY
          elsif value =~ /^\d+$/
            value = value.to_i
          else
            value = Rake.suggested_thread_count
          end
          value = 1 if value < 1
          options.thread_pool_size = value - 1
        }
      ],
      ["--job-stats [LEVEL]",
        "Display job statistics. " +
        "LEVEL=history displays a complete job list",
        lambda { |value|
          if value =~ /^history/i
            options.job_stats = :history
          else
            options.job_stats = true
          end
        }
      ],
      ["--libdir", "-I LIBDIR",
        "Include LIBDIR in the search path for required modules.",
        lambda { |value| $:.push(value) }
      ],
      ["--multitask", "-m",
        "Treat all tasks as multitasks.",
        lambda { |value| options.always_multitask = true }
      ],
      ["--no-search", "--nosearch",
        "-N", "Do not search parent directories for the Rakefile.",
        lambda { |value| options.nosearch = true }
      ],
      ["--prereqs", "-P",
        "Display the tasks and dependencies, then exit.",
        lambda { |value| options.show_prereqs = true }
      ],
      ["--quiet", "-q",
        "Do not log messages to standard output.",
        lambda { |value| Rake.verbose(false) }
      ],
      ["--rakefile", "-f [FILENAME]",
        "Use FILENAME as the rakefile to search for.",
        lambda { |value|
          value ||= ""
          @rakefiles.clear
          @rakefiles << value
        }
      ],
      ["--rakelibdir", "--rakelib", "-R RAKELIBDIR",
        "Auto-import any .rake files in RAKELIBDIR. " +
        "(default is 'rakelib')",
        lambda { |value|
          options.rakelib = value.split(File::PATH_SEPARATOR)
        }
      ],
      ["--require", "-r MODULE",
        "Require MODULE before executing rakefile.",
        lambda { |value|
          begin
            require value
          rescue LoadError => ex
            begin
              rake_require value
            rescue LoadError
              raise ex
            end
          end
        }
      ],
      ["--rules",
        "Trace the rules resolution.",
        lambda { |value| options.trace_rules = true }
      ],
      ["--silent", "-s",
        "Like --quiet, but also suppresses the " +
        "'in directory' announcement.",
        lambda { |value|
          Rake.verbose(false)
          options.silent = true
        }
      ],
      ["--suppress-backtrace PATTERN",
        "Suppress backtrace lines matching regexp PATTERN. " +
        "Ignored if --trace is on.",
        lambda { |value|
          options.suppress_backtrace_pattern = Regexp.new(value)
        }
      ],
      ["--system",  "-g",
        "Using system wide (global) rakefiles " +
        "(usually '~/.rake/*.rake').",
        lambda { |value| options.load_system = true }
      ],
      ["--no-system", "--nosystem", "-G",
        "Use standard project Rakefile search paths, " +
        "ignore system wide rakefiles.",
        lambda { |value| options.ignore_system = true }
      ],
      ["--tasks", "-T [PATTERN]",
        "Display the tasks (matching optional PATTERN) " +
        "with descriptions, then exit. " +
        "-AT combination displays all the tasks, including those without descriptions.",
        lambda { |value|
          select_tasks_to_show(options, :tasks, value)
        }
      ],
      ["--trace=[OUT]", "-t",
        "Turn on invoke/execute tracing, enable full backtrace. " +
        "OUT can be stderr (default) or stdout.",
        lambda { |value|
          options.trace = true
          options.backtrace = true
          select_trace_output(options, "trace", value)
          Rake.verbose(true)
        }
      ],
      ["--verbose", "-v",
        "Log message to standard output.",
        lambda { |value| Rake.verbose(true) }
      ],
      ["--version", "-V",
        "Display the program version.",
        lambda { |value|
          puts "rake, version #{Rake::VERSION}"
          exit
        }
      ],
      ["--where", "-W [PATTERN]",
        "Describe the tasks (matching optional PATTERN), then exit.",
        lambda { |value|
          select_tasks_to_show(options, :lines, value)
          options.show_all_tasks = true
        }
      ],
      ["--no-deprecation-warnings", "-X",
        "Disable the deprecation warnings.",
        lambda { |value|
          options.ignore_deprecate = true
        }
      ],
    ])
end

#standard_system_dir (private)

This method is for internal use only.

See additional method definition at line 764.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 768

def standard_system_dir #:nodoc:
  Win32.win32_system_dir
end

#system_dir

This method is for internal use only.

The directory path containing the system wide rakefiles.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 751

def system_dir # :nodoc:
  @system_dir ||=
    begin
      if ENV["RAKE_SYSTEM"]
        ENV["RAKE_SYSTEM"]
      else
        standard_system_dir
      end
    end
end

#terminal_width

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 361

def terminal_width # :nodoc:
  if @terminal_columns.nonzero?
    result = @terminal_columns
  else
    result = unix? ? dynamic_width : 80
  end
  (result < 10) ? 80 : result
rescue
  80
end

#thread_pool

This method is for internal use only.

Return the thread pool used for multithreaded processing.

[ GitHub ]

  
# File 'lib/rake/application.rb', line 172

def thread_pool             # :nodoc:
  @thread_pool ||= ThreadPool.new(options.thread_pool_size || Rake.suggested_thread_count-1)
end

#top_level

Run the top level tasks of a ::Rake application.

[ GitHub ]

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

def top_level
  run_with_threads do
    if options.show_tasks
      display_tasks_and_comments
    elsif options.show_prereqs
      display_prerequisites
    else
      top_level_tasks.each { |task_name| invoke_task(task_name) }
    end
  end
end

#trace(*strings)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 412

def trace(*strings) # :nodoc:
  options.trace_output ||= $stderr
  trace_on(options.trace_output, *strings)
end

#truncate(string, width)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rake/application.rb', line 394

def truncate(string, width) # :nodoc:
  if string.nil?
    ""
  elsif string.length <= width
    string
  else
    (string[0, width - 3] || "") + "..."
  end
end