summaryrefslogtreecommitdiff
path: root/lib/dslkeywords/touch.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dslkeywords/touch.rb')
-rw-r--r--lib/dslkeywords/touch.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/dslkeywords/touch.rb b/lib/dslkeywords/touch.rb
new file mode 100644
index 0000000..d1073f2
--- /dev/null
+++ b/lib/dslkeywords/touch.rb
@@ -0,0 +1,36 @@
+require 'fileutils'
+
+require_relative 'file'
+
+module RCM
+ # Creates an empty file (touch semantics). Supports the additional
+ # :updated state which re-touches the file even when it already exists.
+ class Touch < BaseFile
+ def is(what) = @is = validate(__method__, what.to_sym, :present, :absent, :purged, :updated)
+
+ def evaluate!
+ return unless super
+ return evaluate_absent! if %i[absent purged].include?(@is)
+ return if ::File.file?(@file_path) && @is != :updated
+
+ create_parent_directory! if @manage_directory
+ do? "Touching #{@file_path}" do
+ FileUtils.touch(@file_path)
+ end
+ ensure
+ permissions!
+ end
+ end
+
+ class DSL
+ def touch(file_path = nil, &block)
+ return :touch if file_path.nil?
+ return unless @conds_met
+
+ t = Touch.new(file_path)
+ t.instance_eval(&block) if block
+ self << t
+ t
+ end
+ end
+end