aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cli/cleanup.rb
blob: 4115d26fc75027e2152a2f26e9780c11d40beb8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
class Hbc::CLI::Cleanup < Hbc::CLI::Base
  OUTDATED_DAYS = 10
  OUTDATED_TIMESTAMP = Time.now - (60 * 60 * 24 * OUTDATED_DAYS)

  def self.help
    "cleans up cached downloads and tracker symlinks"
  end

  def self.needs_init?
    true
  end

  def self.run(*args)
    if args.empty?
      default.cleanup!
    else
      default.cleanup(args)
    end
  end

  def self.default
    @default ||= new(Hbc.cache, Hbc.cleanup_outdated)
  end

  attr_reader :cache_location, :outdated_only
  def initialize(cache_location, outdated_only)
    @cache_location = Pathname.new(cache_location)
    @outdated_only = outdated_only
  end

  def cleanup!
    remove_cache_files
  end

  def cleanup(tokens)
    remove_cache_files(*tokens)
  end

  def cache_files
    return [] unless cache_location.exist?
    cache_location.children
                  .map(&method(:Pathname))
                  .reject(&method(:outdated?))
  end

  def outdated?(file)
    outdated_only && file && file.stat.mtime > OUTDATED_TIMESTAMP
  end

  def incomplete?(file)
    file.extname == ".incomplete"
  end

  def cache_incompletes
    cache_files.select(&method(:incomplete?))
  end

  def cache_completes
    cache_files.reject(&method(:incomplete?))
  end

  def disk_cleanup_size
    Hbc::Utils.size_in_bytes(cache_files)
  end

  def remove_cache_files(*tokens)
    message = "Removing cached downloads"
    message.concat " for #{tokens.join(', ')}" unless tokens.empty?
    message.concat " older than #{OUTDATED_DAYS} days old" if outdated_only
    ohai message

    deletable_cache_files = if tokens.empty?
                              cache_files
                            else
                              start_withs = tokens.map { |token| "#{token}--" }

                              cache_files.select { |path|
                                path.basename.to_s.start_with?(*start_withs)
                              }
                            end

    delete_paths(deletable_cache_files)
  end

  def delete_paths(paths)
    cleanup_size = 0
    processed_files = 0
    paths.each do |item|
      next unless item.exist?
      processed_files += 1
      if Hbc::Utils.file_locked?(item)
        puts "skipping: #{item} is locked"
        next
      end
      puts item
      item_size = File.size?(item)
      cleanup_size += item_size unless item_size.nil?
      item.unlink
    end

    if processed_files.zero?
      puts "Nothing to do"
    else
      disk_space = disk_usage_readable(cleanup_size)
      ohai "This operation has freed approximately #{disk_space} of disk space."
    end
  end
end