lib/backupsss/tar.rb in backupsss-0.2.0 vs lib/backupsss/tar.rb in backupsss-0.3.0

- old
+ new

@@ -10,27 +10,40 @@ @dest = dest @compress_archive = compress_archive end def make - return nil unless valid_dest? && valid_src? + return unless valid_dest? && valid_src? _, err, status = Open3.capture3("#{tar_command} #{dest} #{src}") - STDERR.puts "tar command stderr:\n#{err}" unless err.empty? - check_tar_result(status) - File.open(dest) + File.open(dest) if valid_exit?(status, err) && valid_file? end - def check_tar_result(status) - if status.exitstatus.nonzero? - raise "ERROR: #{tar_command} exited #{status.exitstatus}" - end - unless File.exist?(dest) - raise 'ERROR: Tar destination file does not exist' - end - raise 'ERROR: Tar destionation file is 0 bytes.' if File.size(dest).zero? + def valid_exit?(status, err) + output = [] + output << "command.......#{tar_command}" + output << "stderr........#{err}" unless err.empty? + output << "status........#{status}" + output << "exit code.....#{status.to_i}" + $stdout.puts output.join("\n") + + return true if success_cases(status.to_i, err) + raise "ERROR: #{tar_command} exited #{status.to_i}" end + def valid_file? + raise messages[:no_file] unless File.exist?(dest) + raise messages[:zero_byte] if File.size(dest).zero? + true + end + + def messages + { + no_file: 'ERROR: Tar destination file does not exist.', + zero_byte: 'ERROR: Tar destination file is 0 bytes.' + } + end + def valid_dest? dir_exists?(dest_dir) && dest_writable? end def valid_src? @@ -45,23 +58,35 @@ compress_archive ? 'tar -zcvf' : 'tar -cvf' end private + def clean_exit(status) + status.zero? + end + def dest_dir File.dirname(dest) end def dest_writable? File.writable?(dest_dir) || raise_sys_err(dest_dir, Errno::EPERM::Errno) end def dir_exists?(dir) - File.exist?(dir) || raise_sys_err(dir, Errno::ENOENT::Errno) + File.exist?(File.open(dir)) || raise_sys_err(dir, Errno::ENOENT::Errno) end + def file_changed?(signal_int, err) + signal_int == 1 && err.match(/file changed as we read it/) + end + def src_readable? File.readable?(src) || raise_sys_err(src, Errno::EPERM::Errno) + end + + def success_cases(signal_int, err) + clean_exit(signal_int) || file_changed?(signal_int, err) end def raise_sys_err(dir, err) raise SystemCallError.new(dir.to_s, err) end