Class: Chef::Util::FileEdit

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/util/file_edit.rb

Instance Method Summary collapse

Constructor Details

#initialize(filepath) ⇒ FileEdit

Returns a new instance of FileEdit.

Raises:

  • (ArgumentError)


31
32
33
34
35
36
37
# File 'lib/chef/util/file_edit.rb', line 31

def initialize(filepath)
  raise ArgumentError, "File '#{filepath}' does not exist" unless TargetIO::File.exist?(filepath)

  @editor = Editor.new(TargetIO::File.open(filepath, &:readlines))
  @original_pathname = filepath
  @file_edited = false
end

Instance Method Details

#file_edited?Boolean

return if file has been edited

Returns:

  • (Boolean)


40
41
42
# File 'lib/chef/util/file_edit.rb', line 40

def file_edited?
  @file_edited
end

#insert_line_after_match(regex, newline) ⇒ Object

search the file line by line and match each line with the given regex if matched, insert newline after each matching line



70
71
72
# File 'lib/chef/util/file_edit.rb', line 70

def insert_line_after_match(regex, newline)
  @changes = (editor.append_line_after(regex, newline) > 0) || @changes
end

#insert_line_if_no_match(regex, newline) ⇒ Object

search the file line by line and match each line with the given regex if not matched, insert newline at the end of the file



76
77
78
# File 'lib/chef/util/file_edit.rb', line 76

def insert_line_if_no_match(regex, newline)
  @changes = (editor.append_line_if_missing(regex, newline) > 0) || @changes
end

#search_file_delete(regex) ⇒ Object

search the file line by line and match each line with the given regex if matched, delete the match (all occurrences) from the line



64
65
66
# File 'lib/chef/util/file_edit.rb', line 64

def search_file_delete(regex)
  search_file_replace(regex, "")
end

#search_file_delete_line(regex) ⇒ Object

search the file line by line and match each line with the given regex if matched, delete the line



58
59
60
# File 'lib/chef/util/file_edit.rb', line 58

def search_file_delete_line(regex)
  @changes = (editor.remove_lines(regex) > 0) || @changes
end

#search_file_replace(regex, replace) ⇒ Object

search the file line by line and match each line with the given regex if matched, replace the match (all occurrences) with the replace parameter



52
53
54
# File 'lib/chef/util/file_edit.rb', line 52

def search_file_replace(regex, replace)
  @changes = (editor.replace(regex, replace) > 0) || @changes
end

#search_file_replace_line(regex, newline) ⇒ Object

search the file line by line and match each line with the given regex if matched, replace the whole line with newline.



46
47
48
# File 'lib/chef/util/file_edit.rb', line 46

def search_file_replace_line(regex, newline)
  @changes = (editor.replace_lines(regex, newline) > 0) || @changes
end

#unwritten_changes?Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/chef/util/file_edit.rb', line 80

def unwritten_changes?
  !!@changes
end

#write_fileObject

Make a copy of old_file and write new file out (only if file changed)



85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/chef/util/file_edit.rb', line 85

def write_file
  if @changes
    backup_pathname = original_pathname + ".old"
    TargetIO::FileUtils.cp(original_pathname, backup_pathname, preserve: true)
    TargetIO::File.open(original_pathname, "w") do |newfile|
      editor.lines.each do |line|
        newfile.puts(line)
      end
      newfile.flush
    end
    @file_edited = true
  end
  @changes = false
end