Module: Utils::Shell Private

Extended by:
T::Helpers
Included in:
Formula
Defined in:
utils/shell.rb

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Constant Summary collapse

SHELL_PROFILE_MAP =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

{
  bash: "~/.profile",
  csh:  "~/.cshrc",
  fish: "~/.config/fish/config.fish",
  ksh:  "~/.kshrc",
  mksh: "~/.kshrc",
  rc:   "~/.rcrc",
  sh:   "~/.profile",
  tcsh: "~/.tcshrc",
  zsh:  "~/.zshrc",
}.freeze
UNSAFE_SHELL_CHAR =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

%r{([^A-Za-z0-9_\-.,:/@~+\n])}

Class Method Summary collapse

Class Method Details

.csh_quote(str) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



116
117
118
119
120
121
122
123
124
125
126
127
# File 'utils/shell.rb', line 116

def csh_quote(str)
  # Ruby's implementation of `shell_escape`.
  str = str.to_s
  return "''" if str.empty?

  str = str.dup
  # Anything that isn't a known safe character is padded.
  str.gsub!(UNSAFE_SHELL_CHAR, "\\\\" + "\\1") # rubocop:disable Style/StringConcatenation
  # Newlines have to be specially quoted in `csh`.
  str.gsub!("\n", "'\\\n'")
  str
end

.export_value(key, value, shell = preferred) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Quote values. Quoting keys is overkill.

Parameters:

Returns:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'utils/shell.rb', line 40

def export_value(key, value, shell = preferred)
  case shell
  when :bash, :ksh, :mksh, :sh, :zsh
    "export #{key}=\"#{sh_quote(value)}\""
  when :fish
    # fish quoting is mostly Bourne compatible except that
    # a single quote can be included in a single-quoted string via \'
    # and a literal \ can be included via \\
    "set -gx #{key} \"#{sh_quote(value)}\""
  when :rc
    "#{key}=(#{sh_quote(value)})"
  when :csh, :tcsh
    "setenv #{key} #{csh_quote(value)};"
  end
end

.from_path(path) ⇒ Symbol?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Take a path and heuristically convert it to a shell name, return nil if there's no match.

Parameters:

Returns:



15
16
17
18
19
20
21
# File 'utils/shell.rb', line 15

def from_path(path)
  # we only care about the basename
  shell_name = File.basename(path)
  # handle possible version suffix like `zsh-5.2`
  shell_name.sub!(/-.*\z/m, "")
  shell_name.to_sym if %w[bash csh fish ksh mksh rc sh tcsh zsh].include?(shell_name)
end

.parentSymbol?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



34
35
36
# File 'utils/shell.rb', line 34

def parent
  from_path(`ps -p #{Process.ppid} -o ucomm=`.strip)
end

.preferredSymbol?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



29
30
31
# File 'utils/shell.rb', line 29

def preferred
  from_path(preferred_path)
end

.preferred_path(default: "") ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • default (String) (defaults to: "")

Returns:



24
25
26
# File 'utils/shell.rb', line 24

def preferred_path(default: "")
  ENV.fetch("SHELL", default)
end

.prepend_path_in_profile(path) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



88
89
90
91
92
93
94
95
96
97
98
99
# File 'utils/shell.rb', line 88

def prepend_path_in_profile(path)
  case preferred
  when :bash, :ksh, :mksh, :sh, :zsh, nil
    "echo 'export PATH=\"#{sh_quote(path)}:$PATH\"' >> #{profile}"
  when :rc
    "echo 'path=(#{sh_quote(path)} $path)' >> #{profile}"
  when :csh, :tcsh
    "echo 'setenv PATH #{csh_quote(path)}:$PATH' >> #{profile}"
  when :fish
    "fish_add_path #{sh_quote(path)}"
  end
end

.profileString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Return the shell profile file based on user's preferred shell.

Returns:



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'utils/shell.rb', line 58

def profile
  case preferred
  when :bash
    bash_profile = "#{Dir.home}/.bash_profile"
    return bash_profile if File.exist? bash_profile
  when :rc
    rc_profile = "#{Dir.home}/.rcrc"
    return rc_profile if File.exist? rc_profile
  when :zsh
    return "#{ENV["HOMEBREW_ZDOTDIR"]}/.zshrc" if ENV["HOMEBREW_ZDOTDIR"].present?
  end

  SHELL_PROFILE_MAP.fetch(preferred, "~/.profile")
end

.set_variable_in_profile(variable, value) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



74
75
76
77
78
79
80
81
82
83
84
85
# File 'utils/shell.rb', line 74

def set_variable_in_profile(variable, value)
  case preferred
  when :bash, :ksh, :sh, :zsh, nil
    "echo 'export #{variable}=#{sh_quote(value)}' >> #{profile}"
  when :rc
    "echo '#{variable}=(#{sh_quote(value)})' >> #{profile}"
  when :csh, :tcsh
    "echo 'setenv #{variable} #{csh_quote(value)}' >> #{profile}"
  when :fish
    "echo 'set -gx #{variable} #{sh_quote(value)}' >> #{profile}"
  end
end

.sh_quote(str) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



130
131
132
133
134
135
136
137
138
139
140
# File 'utils/shell.rb', line 130

def sh_quote(str)
  # Ruby's implementation of `shell_escape`.
  str = str.to_s
  return "''" if str.empty?

  str = str.dup
  # Anything that isn't a known safe character is padded.
  str.gsub!(UNSAFE_SHELL_CHAR, "\\\\" + "\\1") # rubocop:disable Style/StringConcatenation
  str.gsub!("\n", "'\n'")
  str
end