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.

Constant Summary collapse

WINDOWS =
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



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

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

.define_module_function(name, &block) ⇒ Object



36
37
38
39
# File 'lib/rake/alt_system.rb', line 36

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

.find_runnable(file) ⇒ Object



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

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

.repair_command(cmd) ⇒ Object



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

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



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

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