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