# frozen_string_literal: true require 'travis/cli' module Travis module CLI class Cache < RepoCommand description 'lists or deletes repository caches' on '-d', '--delete', 'delete listed caches' on '-b', '--branch BRANCH', 'only list/delete caches on given branch' on '-m', '--match STRING', 'only list/delete caches where slug matches given string' on '-f', '--force', 'do not ask user to confirm deleting the caches' def run error "not allowed to access caches for #{color(repository.slug, :bold)}" unless repository.push? branches = caches.group_by(&:branch) check_caches warn "Deleted the following caches:\n" if delete? branches.each { |name, list| display_branch(name, list) } size = caches.inject(0) { |s, c| s + c.size } say 'Overall size of above caches: ' << formatter.file_size(size) end private def check_caches return if caches.any? say 'no caches found' exit end def display_branch(name, list) say color(name ? "On branch #{name}:" : 'Global:', :important) list.each { |c| display_cache(c) } puts end def display_cache(cache) say [ color(cache.slug.ljust(space), :bold), 'last modified: ' << formatter.time(cache.last_modified), 'size: ' << formatter.file_size(cache.size) ].join(' ') << "\n" end def params params = {} params[:branch] = branch if branch? params[:match] = match if match? params end def caches @caches ||= drop? ? repository.delete_caches(params) : repository.caches(params) end def space @space ||= caches.map(&:slug).map(&:size).max end def drop? return false unless delete? return true if force? error 'not deleting caches without --force' unless interactive? error 'aborted' unless danger_zone? "Do you really want to delete #{description}?" true end def description description = color('all caches', :important) description << " on branch #{color(branch, :important)}" if branch? description << " that match #{color(match, :important)}" if match? description end end end end