class Bosh::Director::Core::TarGzipper

Public Instance Methods

compress(base_dir, sources, dest, options = {}) click to toggle source

@param [String] base_dir the directory from which the tar command is run @param [String, Array] sources the relative paths to include @param [String] dest the destination filename for the tgz output @param [Hash] options the options for compress @option options [Boolean] :copy_first copy the source to a temp dir before archiving

# File lib/bosh/director/core/tar_gzipper.rb, line 11
def compress(base_dir, sources, dest, options = {})
  sources = [*sources]
  sources.each do |source|
    source = source.gsub(%r(^\./), '')
    if source.include?(File::SEPARATOR)
      raise "Sources must have a path depth of 1 and contain no '#{File::SEPARATOR}'"
    end
  end

  base_dir_path = Pathname.new(base_dir)
  raise "The base directory #{base_dir} could not be found." unless base_dir_path.exist?
  raise "The base directory #{base_dir} is not an absolute path." unless base_dir_path.absolute?

  if options[:copy_first]
    Dir.mktmpdir do |tmpdir|
      FileUtils.cp_r(sources.map { |s| File.join(base_dir, s) }, "#{tmpdir}/")
      tar(tmpdir, dest, sources)
    end
  else
    tar(base_dir, dest, sources)
  end
end

Private Instance Methods

tar(base_dir, dest, sources) click to toggle source
# File lib/bosh/director/core/tar_gzipper.rb, line 36
def tar(base_dir, dest, sources)
  out, err, status = Open3.capture3('tar', '-C', base_dir, '-czf', dest, *sources)
  raise("tar exited #{status.exitstatus}, output: '#{out}', error: '#{err}'") unless status.success?
  out
end