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