Module: Rake::AltSystem

Defined in:
lib/rake/alt_system.rb

Overview

Alternate implementations of system() and backticks “ on Windows for ruby-1.8 and earlier. – TODO: Remove in Rake 11

Constant Summary collapse

WINDOWS =

:nodoc: all

RbConfig::CONFIG["host_os"] =~
%r!(msdos|mswin|djgpp|mingw|[Ww]indows)!
RUNNABLE_EXTS =
%w[com exe bat cmd]
RUNNABLE_PATTERN =
%r!\.(#{RUNNABLE_EXTS.join('|')})\Z!i

Class Method Summary collapse

Class Method Details

.backticks(cmd) ⇒ Object



99
100
101
# File 'lib/rake/alt_system.rb', line 99

def backticks(cmd)
  kernel_backticks(repair_command(cmd))
end

.define_module_function(name, &block) ⇒ Object



38
39
40
41
# File 'lib/rake/alt_system.rb', line 38

def define_module_function(name, &block)
  define_method(name, &block)
  module_function(name)
end

.find_runnable(file) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rake/alt_system.rb', line 73

def find_runnable(file)
  if file =~ RUNNABLE_PATTERN
    file
  else
    RUNNABLE_EXTS.each { |ext|
      test = "#{file}.#{ext}"
      return test if File.exist?(test)
    }
    nil
  end
end

.repair_command(cmd) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/rake/alt_system.rb', line 53

def repair_command(cmd)
  "call " + (
    if cmd =~ %r!\A\s*\".*?\"!
      # already quoted
      cmd
    elsif match = cmd.match(%r!\A\s*(\S+)!)
      if match[1] =~ %r!/!
        # avoid x/y.bat interpretation as x with option /y
        %Q!"#{match[1]}"! + match.post_match
      else
        # a shell command will fail if quoted
        cmd
      end
    else
      # empty or whitespace
      cmd
    end
  )
end

.system(cmd, *args) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/rake/alt_system.rb', line 85

def system(cmd, *args)
  repaired = (
    if args.empty?
      [repair_command(cmd)]
    elsif runnable = find_runnable(cmd)
      [File.expand_path(runnable), *args]
    else
      # non-existent file
      [cmd, *args]
    end
  )
  kernel_system(*repaired)
end