Module: Utils::Inreplace Private

Extended by:
T::Sig
Included in:
Formula
Defined in:
utils/inreplace.rb

Overview

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.

Helper functions for replacing text in files in-place.

Defined Under Namespace

Classes: Error

Class Method Summary collapse

Class Method Details

.inreplace(paths, before = nil, after = nil, audit_result = true) ⇒ void

This method returns an undefined value.

Sometimes we have to change a bit before we install. Mostly we prefer a patch, but if you need the prefix of this formula in the patch you have to resort to inreplace, because in the patch you don’t have access to any variables defined by the formula, as only HOMEBREW_PREFIX is available in the embedded patch.

inreplace supports regular expressions:

inreplace "somefile.cfg", /look[for]what?/, "replace by #{bin}/tool"

inreplace supports blocks:

inreplace "Makefile" do |s|
  s.gsub! "/usr/local", HOMEBREW_PREFIX.to_s
end

Parameters:

  • paths (Array<T.untyped>, String, Pathname)
  • before (Regexp, String, nil) (defaults to: nil)
  • after (String, Symbol, nil) (defaults to: nil)
  • audit_result (Boolean) (defaults to: true)

Raises:

See Also:



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'utils/inreplace.rb', line 51

def inreplace(paths, before = nil, after = nil, audit_result = true) # rubocop:disable Style/OptionalBooleanParameter
  after = after.to_s if after.is_a? Symbol

  errors = {}

  errors["`paths` (first) parameter"] = ["`paths` was empty"] if paths.blank?

  Array(paths).each do |path|
    str = File.open(path, "rb", &:read) || ""
    s = StringInreplaceExtension.new(str)

    if before.nil? && after.nil?
      yield s
    else
      s.gsub!(T.must(before), after, audit_result)
    end

    errors[path] = s.errors unless s.errors.empty?

    Pathname(path).atomic_write(s.inreplace_string)
  end

  raise Error, errors unless errors.empty?
end

.inreplace_pairs(path, replacement_pairs, read_only_run: false, silent: false) ⇒ Object

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.

Raises:



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'utils/inreplace.rb', line 77

def inreplace_pairs(path, replacement_pairs, read_only_run: false, silent: false)
  str = File.open(path, "rb", &:read) || ""
  contents = StringInreplaceExtension.new(str)
  replacement_pairs.each do |old, new|
    ohai "replace #{old.inspect} with #{new.inspect}" unless silent
    unless old
      contents.errors << "No old value for new value #{new}! Did you pass the wrong arguments?"
      next
    end

    contents.gsub!(old, new)
  end
  raise Error, path => contents.errors unless contents.errors.empty?

  Pathname(path).atomic_write(contents.inreplace_string) unless read_only_run
  contents.inreplace_string
end