Module: Squared::Common::Shell

Defined in:
lib/squared/common/shell.rb

Class Method Summary collapse

Class Method Details

.basic_option(flag, val, merge: false) ⇒ Object



95
96
97
# File 'lib/squared/common/shell.rb', line 95

def basic_option(flag, val, merge: false)
  shell_option(flag, val, escape: false, force: false, merge: merge)
end

.fill_option(val, double: false) ⇒ Object



85
86
87
88
89
# File 'lib/squared/common/shell.rb', line 85

def fill_option(val, double: false)
  return "-#{val}" if val.match?(/^[a-z]\d*$/i)

  shell_escape(val.start_with?('-') ? val : "--#{val}", double: double)
end

.quote_option(flag, val, double: false) ⇒ Object



91
92
93
# File 'lib/squared/common/shell.rb', line 91

def quote_option(flag, val, double: false)
  shell_option(flag, val, escape: false, double: double)
end

.shell_escape(val, quote: false, force: false, double: false, override: false) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/squared/common/shell.rb', line 11

def shell_escape(val, quote: false, force: false, double: false, override: false)
  if (r = /\A(--?)([^= ]+)((=|\s+)(["'])?(.+?)(["'])?)?\z/m.match(val = val.to_s))
    return val if !r[3] || (!r[5] && r[6].match?(/\s/))

    combine = lambda do |opt|
      if r[2] =~ /^(["'])(.+)\1$/
        double = $1 == '"'
        r[2] = $2
        override = true
      end
      r[1] + r[2] + r[4] + shell_quote(opt, double: double, force: force, override: override)
    end
    if r[5] == r[7]
      r[5] ? val : combine.(r[6])
    else
      force = true
      combine.(r[5] + r[6] + r[7])
    end
  elsif Rake::Win32.windows?
    quote ? shell_quote(val, double: double, force: force) : val
  else
    Shellwords.escape(val)
  end
end

.shell_option(flag, val = nil, escape: true, quote: true, force: true, double: false, override: false, merge: false) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/squared/common/shell.rb', line 48

def shell_option(flag, val = nil, escape: true, quote: true, force: true, double: false, override: false,
                 merge: false)
  flag = flag.to_s
  if flag =~ /^(["'])(.+)\1$/
    double = $1 == '"'
    flag = $2
    escape = false
    override = true
  end
  if flag[0] == '-'
    b = flag[1] == '-' ? '=' : ' '
  elsif flag.size == 1
    a = '-'
    b = merge ? '' : ' '
  else
    a = '--'
    b = '='
  end
  "#{a}#{flag}#{if val
                  "#{b}#{if escape
                           shell_escape(val, quote: quote, double: double, override: override)
                         else
                           quote ? shell_quote(val, force: force, double: double, override: override) : val
                         end}"
                end}"
end

.shell_quote(val, option: true, force: true, double: false, override: false) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/squared/common/shell.rb', line 36

def shell_quote(val, option: true, force: true, double: false, override: false)
  val = val.to_s
  return val if !force && !val.include?(' ')
  return val if option && val.match?(/(?:\A|\S=|[^=]\s+|#{Rake::Win32.windows? ? '[\\\/]' : '\/'})(["']).+\1\z/m)

  if double || Rake::Win32.windows? || (ARG[:QUOTE] == '"' && !override)
    "\"#{val.gsub(/(?<!\\)"/, '\\"')}\""
  else
    "'#{val.gsub("'", "'\\\\''")}'"
  end
end

.shell_split(val, escape: true, quote: false, join: nil) ⇒ Object



75
76
77
78
79
80
81
82
83
# File 'lib/squared/common/shell.rb', line 75

def shell_split(val, escape: true, quote: false, join: nil)
  ret = Shellwords.split(val)
  return ret if join == false

  ret.map! { |opt| shell_escape(opt, quote: quote) } if escape
  return ret unless join

  ret.join(join.is_a?(::String) ? join : ' ')
end