Skip to content

Instantly share code, notes, and snippets.

@ryu39
Last active August 15, 2017 03:09
Show Gist options
  • Save ryu39/7573a7151b04c8bebe95 to your computer and use it in GitHub Desktop.
Save ryu39/7573a7151b04c8bebe95 to your computer and use it in GitHub Desktop.
List unnecessary homebrew formulae.
require 'formula'
require 'set'
DESCRIPTION = <<EOS
List unnecessary formulae except for specified and its dependant formulae
usage:
brew list-unnecessaries FORMULA...
exmaple:
brew list-unnecessaries git rbenv
EOS
if ARGV.include?('-h') || ARGV.include?('--help')
puts DESCRIPTION
exit 0
end
INSTALLED_FORMULA_MAP = Formula.installed.each_with_object({}) do |f, result|
result[f.name] = f
end
required_formulae = Set.new
ARGV.each do |arg|
if INSTALLED_FORMULA_MAP.key?(arg)
required_formulae << INSTALLED_FORMULA_MAP[arg]
else
STDERR.puts "Uninstalled formula #{arg} is specified."
exit 1
end
end
# add dependant formulae
next_search = required_formulae
until next_search.empty?
deps, reqs = [], []
next_search.each do |f|
deps << f.deps.default.map(&:to_formula)
reqs << f.requirements.to_a.map(&:default_formula).map {|df| INSTALLED_FORMULA_MAP[df]}.compact
end
dependant = Set.new([deps, reqs].flatten)
next_search = dependant - required_formulae
required_formulae.add(dependant).flatten!
end
unnecessary_formulae = Set.new(Formula.installed) - required_formulae
unnecessary_formulae.sort.each do |f|
puts f.name
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment