vagrant/lib/vagrant/util/string_block_editor.rb

78 lines
2.3 KiB
Ruby

module Vagrant
module Util
# This class modifies strings by creating and managing Vagrant-owned
# "blocks" via wrapping them in specially formed comments.
#
# This is useful when modifying a file that someone else owns and adding
# automatic entries into it. Example: /etc/exports or some other
# configuration file.
#
# Vagrant marks ownership of a block in the string by wrapping it in
# VAGRANT-BEGIN and VAGRANT-END comments with a unique ID. Example:
#
# foo
# # VAGRANT-BEGIN: id
# some contents
# created by vagrant
# # VAGRANT-END: id
#
# The goal of this class is to be able to insert and remove these
# blocks without modifying anything else in the string.
#
# The strings usually come from files but it is up to the caller to
# manage the file resource.
class StringBlockEditor
# The current string value. This is the value that is modified by
# the methods below.
#
# @return [String]
attr_reader :value
def initialize(string)
@value = string
end
# This returns the keys (or ids) that are in the string.
#
# @return [<Array<String>]
def keys
regexp = /^#\s*VAGRANT-BEGIN:\s*(.+?)$\r?\n?(.*)$\r?\n?^#\s*VAGRANT-END:\s(\1)$/m
@value.scan(regexp).map do |match|
match[0]
end
end
# This deletes the block with the given key if it exists.
def delete(key)
key = Regexp.quote(key)
regexp = /^#\s*VAGRANT-BEGIN:\s*#{key}$.*^#\s*VAGRANT-END:\s*#{key}$\r?\n?/m
@value.gsub!(regexp, "")
end
# This gets the value of the block with the given key.
def get(key)
key = Regexp.quote(key)
regexp = /^#\s*VAGRANT-BEGIN:\s*#{key}$\r?\n?(.*?)\r?\n?^#\s*VAGRANT-END:\s*#{key}$\r?\n?/m
match = regexp.match(@value)
return nil if !match
match[1]
end
# This inserts a block with the given key and value.
#
# @param [String] key
# @param [String] value
def insert(key, value)
# Insert the new block into the value
new_block = <<BLOCK
# VAGRANT-BEGIN: #{key}
#{value.strip}
# VAGRANT-END: #{key}
BLOCK
@value << new_block
end
end
end
end