lib/vagrant-invade/action/create.rb in vagrant-invade-0.5.5 vs lib/vagrant-invade/action/create.rb in vagrant-invade-0.6.0

- old
+ new

@@ -7,95 +7,62 @@ class Create def initialize(app, env) @app = app @env = env + @ui = env[:ui] @logger = Log4r::Logger.new('vagrant::invade::action::create') + + ENV['VAGRANT_VAGRANTFILE'] ? @vagrantfile_name = ENV['VAGRANT_VAGRANTFILE'] : @vagrantfile_name = 'Vagrantfile' + @root_path = Dir.pwd end def call(env) - # Get project root where vagrant is running from - # Since it is possible to set it through the environment we need to validate it - root_path = Dir.pwd - ENV['VAGRANT_VAGRANTFILE'] ? vagrantfile_name = ENV['VAGRANT_VAGRANTFILE'] : vagrantfile_name = "Vagrantfile" + data = @env[:invade]['vagrantfile'] - # Get generated Vagrantfile from environment - if @env[:invade]['vagrantfile'] - generated_vagrantfile_data = @env[:invade]['vagrantfile'] - else - raise "[Invade]: No generated data found. Can't build Vagrantfile." - end + checksum_helper = Helper::Checksum.new @env + vagrantfile_path = "#{@root_path}/#{@vagrantfile_name}" + md5_current = checksum_helper.get_checksum_of_file(vagrantfile_path) + md5_generated = checksum_helper.get_checksum_of_data(data) # Write new Vagrantfile if checksum is not equal - if !check_md5_checksum(@env[:ui], root_path, vagrantfile_name, generated_vagrantfile_data) || @env[:invade_build_force] - @env[:invade_build_force] ? - write_vagrantfile(@env[:ui], root_path, generated_vagrantfile_data, vagrantfile_name, true) : - write_vagrantfile(@env[:ui], root_path, generated_vagrantfile_data, vagrantfile_name, false) + if !checksum_helper.check + write_vagrantfile(data, md5_current) + + @env[:ui].success "[Invade][BUILD] Current : '#{md5_current}'" + @env[:ui].success "[Invade][BUILD] Generated : '#{md5_generated}'" + @env[:ui].success '[Invade][BUILD] Saved new Vagrantfile to:' + @env[:ui].success "[Invade][BUILD] #{vagrantfile_path}" + else + @ui.warn("[Invade][BUILD] Checksum: #{md5_current}") + @ui.warn('[Invade][BUILD] No changes found in invade.yml - Vagrantfile will remain untouched.') end @app.call(env) end private - # Compare md5 strings to replace Vagrantfile - def check_md5_checksum(ui, root_path, vagrantfile_name, generated_vagrantfile_data) + def write_vagrantfile(data, checksum) - require 'digest' + vagrantfile = "#{@root_path}/#{@vagrantfile_name}" - md5_new = Digest::MD5.hexdigest(generated_vagrantfile_data) + # Backup old Vagrantfile and safe it with checksum + backup_file = vagrantfile + '-' + "#{checksum}" - if File.exists?("#{root_path}/#{vagrantfile_name}") - md5_current = Digest::MD5.file("#{root_path}/#{vagrantfile_name}").hexdigest - else - md5_current = 0 + unless File.exist?(backup_file) || !File.exist?(vagrantfile) + File.rename( + vagrantfile, + backup_file + ) end - (md5_new.eql? md5_current) ? md5_check = true : md5_check = false - - unless md5_check - ui.warn "[Invade] Checksum not equal!" - ui.warn "[Invade] Current : '#{md5_current}'" - ui.warn "[Invade] Generated : '#{md5_new}'" - - return false - end - - ui.success "[Invade] Vagrantfile is still valid. Use '-f|--force' to force replacing it." unless @env[:invade_build_force] - - true - end - - def reload(ui) - - # Get corrent command whether in development mode or using Vagrant for real - unless Vagrant.in_installer? && Vagrant.very_quiet? - command = 'bundle exec vagrant reload' - else - command = 'vagrant reload' - end - - ui.warn '[Invade] Auto reload Vagrant with new Vagrantfile...' - sleep 2 - - Kernel.exec(command) - end - - def write_vagrantfile(ui, root_path, vagrantfile, vagrantfile_name, overwrite) - - overwrite ? - vagrantfile_path = "#{root_path}/#{vagrantfile_name}" : - vagrantfile_path = "#{root_path}/#{vagrantfile_name}.new" - # Write new Vagrantfile - open(vagrantfile_path, "w+") do |f| - f.puts vagrantfile + open(vagrantfile, 'w+') do |f| + f.puts data end - overwrite ? - ui.warn("[Invade] Replaced Vagrantfile at '#{root_path}/#{vagrantfile_name}'.") : - ui.warn("[Invade] Saved new Vagrantfile at '#{root_path}/#{vagrantfile_name}.new'.") end end end end