Module: Utils::Inreplace Private

Included in:
Formula
Defined in:
Library/Homebrew/utils/inreplace.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

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) ⇒ Object

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 var defined by the formula. Only HOMEBREW_PREFIX is available in the embedded patch.

inreplace supports regular expressions:

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

Raises:


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'Library/Homebrew/utils/inreplace.rb', line 30

def inreplace(paths, before = nil, after = nil, audit_result = true) # rubocop:disable Style/OptionalBooleanParameter
  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
      after = after.to_s if after.is_a? Symbol
      s.gsub!(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. You should avoid using this method if possible, as it may be removed or be changed in the future.

Raises:


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'Library/Homebrew/utils/inreplace.rb', line 54

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