summaryrefslogtreecommitdiff
path: root/lib/chef/util/file_edit.rb
diff options
context:
space:
mode:
authorChris Bandy <bandy.chris@gmail.com>2014-01-10 07:49:26 +0000
committerBryan McLellan <btm@getchef.com>2014-03-19 14:39:24 -0700
commitbd6079ddf7079c88d83f31335ec8bdfa5481b54b (patch)
tree5e5d70044cf52f771a82280d4be1d811a7650325 /lib/chef/util/file_edit.rb
parent963e33beb327162dd03b8b4d37789a53914b8ba8 (diff)
downloadchef-bd6079ddf7079c88d83f31335ec8bdfa5481b54b.tar.gz
CHEF-3714: Use Editor to manipulate text
Diffstat (limited to 'lib/chef/util/file_edit.rb')
-rw-r--r--lib/chef/util/file_edit.rb68
1 files changed, 12 insertions, 56 deletions
diff --git a/lib/chef/util/file_edit.rb b/lib/chef/util/file_edit.rb
index bb19435a12..b30f0f4e48 100644
--- a/lib/chef/util/file_edit.rb
+++ b/lib/chef/util/file_edit.rb
@@ -15,8 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+require 'chef/util/editor'
require 'fileutils'
-require 'tempfile'
class Chef
class Util
@@ -24,108 +24,64 @@ class Chef
private
- attr_accessor :original_pathname, :contents, :file_edited
+ attr_reader :editor, :original_pathname
public
def initialize(filepath)
+ @editor = Editor.new(File.open(filepath, &:readlines))
@original_pathname = filepath
- @file_edited = false
-
- raise ArgumentError, "File doesn't exist" unless File.exist? @original_pathname
- @contents = File.open(@original_pathname) { |f| f.readlines }
end
#search the file line by line and match each line with the given regex
#if matched, replace the whole line with newline.
def search_file_replace_line(regex, newline)
- search_match(regex, newline, 'r', 1)
+ @changes = (editor.replace_lines(regex, newline) > 0) || @changes
end
#search the file line by line and match each line with the given regex
#if matched, replace the match (all occurances) with the replace parameter
def search_file_replace(regex, replace)
- search_match(regex, replace, 'r', 2)
+ @changes = (editor.replace(regex, replace) > 0) || @changes
end
#search the file line by line and match each line with the given regex
#if matched, delete the line
def search_file_delete_line(regex)
- search_match(regex, " ", 'd', 1)
+ @changes = (editor.remove_lines(regex) > 0) || @changes
end
#search the file line by line and match each line with the given regex
#if matched, delete the match (all occurances) from the line
def search_file_delete(regex)
- search_match(regex, " ", 'd', 2)
+ search_file_replace(regex, '')
end
#search the file line by line and match each line with the given regex
#if matched, insert newline after each matching line
def insert_line_after_match(regex, newline)
- search_match(regex, newline, 'i', 1)
+ @changes = (editor.append_line_after(regex, newline) > 0) || @changes
end
#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
def insert_line_if_no_match(regex, newline)
- search_match(regex, newline, 'i', 2)
+ @changes = (editor.append_line_if_missing(regex, newline) > 0) || @changes
end
#Make a copy of old_file and write new file out (only if file changed)
def write_file
-
- # file_edited is false when there was no match in the whole file and thus no contents have changed.
- if file_edited
+ if @changes
backup_pathname = original_pathname + ".old"
FileUtils.cp(original_pathname, backup_pathname, :preserve => true)
File.open(original_pathname, "w") do |newfile|
- contents.each do |line|
+ editor.lines.each do |line|
newfile.puts(line)
end
newfile.flush
end
end
- self.file_edited = false
- end
-
- private
-
- #helper method to do the match, replace, delete, and insert operations
- #command is the switch of delete, replace, and insert ('d', 'r', 'i')
- #method is to control operation on whole line or only the match (1 for line, 2 for match)
- def search_match(regex, replace, command, method)
-
- #convert regex to a Regexp object (if not already is one) and store it in exp.
- exp = Regexp.new(regex)
-
- #loop through contents and do the appropriate operation depending on 'command' and 'method'
- new_contents = []
-
- contents.each do |line|
- if line.match(exp)
- self.file_edited = true
- case
- when command == 'r'
- new_contents << ((method == 1) ? replace : line.gsub!(exp, replace))
- when command == 'd'
- if method == 2
- new_contents << line.gsub!(exp, "")
- end
- when command == 'i'
- new_contents << line
- new_contents << replace unless method == 2
- end
- else
- new_contents << line
- end
- end
- if command == 'i' && method == 2 && ! file_edited
- new_contents << replace
- self.file_edited = true
- end
-
- self.contents = new_contents
+ @changes = false
end
end
end