lib/entangler/executor/master.rb in entangler-1.0.2 vs lib/entangler/executor/master.rb in entangler-1.1.0

- old
+ new

@@ -1,11 +1,14 @@ +require_relative 'helpers' require_relative 'background/master' +require_relative 'validation/master' module Entangler module Executor class Master < Base include Entangler::Executor::Background::Master + include Entangler::Executor::Validation::Master def run perform_initial_rsync sleep 1 start_remote_slave @@ -14,68 +17,21 @@ @remote_reader.close end private - def validate_opts - super - if @opts[:remote_mode] - @opts[:remote_port] ||= '22' - validate_remote_opts - else - validate_local_opts - end + def log_outputs + outs = [Entangler::Logger.log_file_path(base_dir)] + outs << STDOUT unless @opts[:quiet] end - def validate_local_opts - unless File.exist?(@opts[:remote_base_dir]) - raise Entangler::ValidationError, "Destination directory doesn't exist" - end - unless File.directory?(@opts[:remote_base_dir]) - raise Entangler::ValidationError, 'Destination directory is a file' - end - @opts[:remote_base_dir] = File.realpath(File.expand_path(@opts[:remote_base_dir])) - return unless @opts[:remote_base_dir] == base_dir - raise Entangler::ValidationError, "Destination directory can't be the same as the base directory" - end - - def validate_remote_opts - keys = @opts.keys - raise Entangler::ValidationError, 'Missing remote base dir' unless keys.include?(:remote_base_dir) - raise Entangler::ValidationError, 'Missing remote user' unless keys.include?(:remote_user) - raise Entangler::ValidationError, 'Missing remote host' unless keys.include?(:remote_host) - validate_remote_base_dir - validate_remote_entangler_version - end - - def validate_remote_base_dir - res = `#{generate_ssh_command("[[ -d '#{@opts[:remote_base_dir]}' ]] && echo 'ok' || echo 'missing'")}` - raise Entangler::ValidationError, 'Cannot connect to remote' if res.empty? - raise Entangler::ValidationError, 'Remote base dir invalid' unless res.strip == 'ok' - end - - def validate_remote_entangler_version - return unless @opts[:remote_mode] - res = `#{generate_ssh_command('source ~/.rvm/environments/default && entangler --version')}` - remote_version = Gem::Version.new(res.strip) - local_version = Gem::Version.new(Entangler::VERSION) - return unless major_version_mismatch?(local_version, remote_version) - msg = 'Entangler version too far apart, please update either local or remote Entangler.' \ - " Local version is #{local_version} and remote version is #{remote_version}." - raise Entangler::VersionMismatchError, msg - end - - def major_version_mismatch?(version1, version2) - version1.segments[0] != version2.segments[0] || - (version1.segments[0].zero? && version1 != version2) || - ((version1.prerelease? || version2.prerelease?) && version1 != version2) - end - def perform_initial_rsync logger.info 'Running initial sync' - IO.popen(rsync_cmd_string).each do |line| - logger.debug line.chomp + with_temp_rsync_ignores do |file_path| + IO.popen(rsync_cmd_string(file_path)).each do |line| + logger.debug line.chomp + end end logger.debug 'Initial sync complete' end def find_all_folders @@ -105,15 +61,20 @@ def remote_hostname "#{@opts[:remote_user]}@#{@opts[:remote_host]}" end - def rsync_cmd_string - exclude_args = find_rsync_ignore_folders.map { |path| "--exclude #{path}" }.join(' ') + def with_temp_rsync_ignores + Entangler::Helper.with_temp_file(name: 'rsync_ignores', contents: find_rsync_ignore_folders.join("\n")) do |f| + yield f.path + end + end + + def rsync_cmd_string(rsync_ignores_file_path) remote_path = @opts[:remote_mode] ? "#{@opts[:remote_user]}@#{@opts[:remote_host]}:" : '' remote_path += "#{@opts[:remote_base_dir]}/" - cmd = "rsync -azv #{exclude_args}" + cmd = "rsync -azv --exclude-from #{rsync_ignores_file_path}" cmd += " -e \"ssh -p #{@opts[:remote_port]}\"" if @opts[:remote_mode] cmd + " --delete #{base_dir}/ #{remote_path}" end end end