class TinyCI::Compactor

Tool for compressing old builds into .tar.gz files

Constants

BLOCKSIZE_TO_READ

Public Class Methods

new(working_dir: nil, num_builds_to_leave: nil, builds_to_leave: nil, logger: nil) click to toggle source

Constructor

@param [String] working_dir The directory from which to run. @param [Integer] num_builds_to_leave How many builds not to compact, starting from the newest @param [String] builds_to_leave Comma-separated list of build directory names not to compact @param [Logger] logger Logger object

# File lib/tinyci/compactor.rb, line 24
def initialize(working_dir: nil, num_builds_to_leave: nil, builds_to_leave: nil, logger: nil)
  @logger = logger
  @working_dir = working_dir || repo_root
  @num_builds_to_leave = (num_builds_to_leave || 1).to_i
  @builds_to_leave = (Array(builds_to_leave) || []).map(&:to_s)
end

Public Instance Methods

compact!() click to toggle source

Compress and delete the build directories

# File lib/tinyci/compactor.rb, line 32
def compact!
  unless inside_repository?
    log_error 'not currently in a git repository'
    return false
  end

  directories_to_compact.each do |dir|
    compress_directory dir
    FileUtils.rm_rf builds_dir(dir)

    log_info "Compacted #{archive_path(dir)}"
  end
end

Private Instance Methods

archive_path(dir) click to toggle source

Build the path for a compressed archive

# File lib/tinyci/compactor.rb, line 67
def archive_path(dir)
  File.join(builds_dir, dir + '.tar.gz')
end
builds_dir(*path_segments) click to toggle source

Get the location of the builds directory

# File lib/tinyci/compactor.rb, line 62
def builds_dir(*path_segments)
  File.join @working_dir, 'builds/', *path_segments
end
compress_directory(dir) click to toggle source

Create a .tar.gz file from a directory Done in pure ruby to ensure portability

# File lib/tinyci/compactor.rb, line 73
def compress_directory(dir)
  File.open archive_path(dir), 'wb' do |oarchive_path|
    Zlib::GzipWriter.wrap oarchive_path do |gz|
      Gem::Package::TarWriter.new gz do |tar|
        Find.find "#{builds_dir}/" + dir do |f|
          relative_path = f.sub "#{builds_dir}/", ''
          mode = File.stat(f).mode
          size = File.stat(f).size

          if File.directory? f
            tar.mkdir relative_path, mode
          else
            tar.add_file_simple relative_path, mode, size do |tio|
              File.open f, 'rb' do |rio|
                while (buffer = rio.read(BLOCKSIZE_TO_READ))
                  tio.write buffer
                end
              end
            end
          end
        end
      end
    end
  end
end
directories_to_compact() click to toggle source

Build the list of directories to compact according to the options

# File lib/tinyci/compactor.rb, line 49
def directories_to_compact
  builds = Dir.entries builds_dir
  builds.select! { |e| File.directory? builds_dir(e) }
  builds.reject! { |e| %w[. ..].include? e }
  builds.sort!

  builds = builds[0..-(@num_builds_to_leave + 1)]
  builds.reject! { |e| @builds_to_leave.include?(e) || @builds_to_leave.include?(builds_dir(e)) }

  builds
end