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
# File 'lib/chef/util/file_edit.rb', line 31

def initialize(filepath)
  raise ArgumentError, "File '#{filepath}' does not exist" unless File.exist?(filepath)
  @editor = Editor.new(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)


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

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



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

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



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

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



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

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



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

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



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

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.



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

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

#unwritten_changes?Boolean

Returns:

  • (Boolean)


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

def unwritten_changes?
  !!@changes
end

#write_fileObject

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



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

def write_file
  if @changes
    backup_pathname = original_pathname + ".old"
    FileUtils.cp(original_pathname, backup_pathname, :preserve => true)
    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