|
2 | 2 | # frozen_string_literal: true |
3 | 3 |
|
4 | 4 | require "bundle/extensions/extension" |
| 5 | +require "json" |
5 | 6 |
|
6 | 7 | module Homebrew |
7 | 8 | module Bundle |
@@ -32,6 +33,11 @@ def dump_disable_supported? |
32 | 33 | false |
33 | 34 | end |
34 | 35 |
|
| 36 | + sig { override.returns(T.nilable(String)) } |
| 37 | + def cleanup_heading |
| 38 | + "Mac App Store apps" |
| 39 | + end |
| 40 | + |
35 | 41 | sig { override.params(name: String, options: Homebrew::Bundle::EntryInputOptions).returns(Dsl::Entry) } |
36 | 42 | def entry(name, options = {}) |
37 | 43 | id = options[:id] |
@@ -104,6 +110,41 @@ def dump_entry(package) |
104 | 110 | "mas #{quote(app.name)}, id: #{app.id}" |
105 | 111 | end |
106 | 112 |
|
| 113 | + sig { params(app: App).returns(String) } |
| 114 | + def cleanup_item(app) |
| 115 | + JSON.generate("id" => app.id, "name" => app.name) |
| 116 | + end |
| 117 | + |
| 118 | + sig { override.params(item: String).returns(String) } |
| 119 | + def cleanup_item_name(item) |
| 120 | + app = parse_cleanup_item(item) |
| 121 | + "#{app.name} (#{app.id})" |
| 122 | + end |
| 123 | + |
| 124 | + sig { override.params(entries: T::Array[Dsl::Entry]).returns(T::Array[String]) } |
| 125 | + def cleanup_items(entries) |
| 126 | + return [].freeze unless package_manager_installed? |
| 127 | + |
| 128 | + kept_app_ids = entries.filter_map do |entry| |
| 129 | + entry.options[:id].to_s if entry.type == type |
| 130 | + end |
| 131 | + return [].freeze if kept_app_ids.empty? |
| 132 | + |
| 133 | + packages.reject { |app| kept_app_ids.any? { |id| app.id.to_i == id.to_i } } |
| 134 | + .map { |app| cleanup_item(app) } |
| 135 | + end |
| 136 | + |
| 137 | + sig { override.params(items: T::Array[String]).void } |
| 138 | + def cleanup!(items) |
| 139 | + mas = package_manager_executable |
| 140 | + return if mas.nil? |
| 141 | + |
| 142 | + items.each do |item| |
| 143 | + Bundle.system(mas, "uninstall", parse_cleanup_item(item).id, verbose: false) |
| 144 | + end |
| 145 | + puts "Uninstalled #{items.size} Mac App Store app#{"s" if items.size != 1}" |
| 146 | + end |
| 147 | + |
107 | 148 | sig { params(id: Integer).returns(T::Boolean) } |
108 | 149 | def app_id_installed?(id) |
109 | 150 | installed_app_ids.any? { |app_id| app_id.to_i == id } |
@@ -209,6 +250,18 @@ def install!(name, id = nil, with: nil, preinstall: true, no_upgrade: false, ver |
209 | 250 | installed_app_ids << id.to_s unless installed_app_ids.include?(id.to_s) |
210 | 251 | true |
211 | 252 | end |
| 253 | + |
| 254 | + sig { params(item: String).returns(App) } |
| 255 | + def parse_cleanup_item(item) |
| 256 | + parsed = JSON.parse(item) |
| 257 | + raise TypeError, "Invalid Mac App Store cleanup item: #{item}" unless parsed.is_a?(Hash) |
| 258 | + |
| 259 | + id = parsed["id"] |
| 260 | + name = parsed["name"] |
| 261 | + raise TypeError, "Invalid Mac App Store cleanup item: #{item}" if !id.is_a?(String) || !name.is_a?(String) |
| 262 | + |
| 263 | + App.new(id:, name:) |
| 264 | + end |
212 | 265 | end |
213 | 266 |
|
214 | 267 | sig { override.params(entries: T::Array[Object]).returns(T::Array[Object]) } |
|
0 commit comments