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