unlinkapps: modernize
Simplify code by using `Pathname` methods as much as possible. Also avoid calling external commands for basic functionality like unlinking, reduce code duplication by using a method from `cmd/linkapps.rb`, count unlinked symlinks with `ObserverPathnameExtension`, and adjust output for consistency with `brew linkapps`.
This commit is contained in:
parent
f63180927c
commit
dcf406f1e4
@ -1,33 +1,51 @@
|
||||
# Unlinks any Applications (.app) found in installed prefixes from /Applications
|
||||
require "keg"
|
||||
require "cmd/linkapps"
|
||||
|
||||
module Homebrew
|
||||
def unlinkapps
|
||||
target_dir = ARGV.include?("--local") ? File.expand_path("~/Applications") : "/Applications"
|
||||
target_dir = linkapps_target(:local => ARGV.include?("--local"))
|
||||
|
||||
return unless File.exist? target_dir
|
||||
|
||||
cellar_apps = Dir[target_dir + "/*.app"].select do |app|
|
||||
if File.symlink?(app)
|
||||
should_unlink? File.readlink(app)
|
||||
end
|
||||
end
|
||||
|
||||
cellar_apps.each do |app|
|
||||
puts "Unlinking #{app}"
|
||||
system "unlink", app
|
||||
end
|
||||
|
||||
puts "Finished unlinking from #{target_dir}" if cellar_apps
|
||||
unlinkapps_from_dir(target_dir)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def should_unlink?(file)
|
||||
if ARGV.named.empty?
|
||||
file.start_with?("#{HOMEBREW_CELLAR}/", "#{HOMEBREW_PREFIX}/opt/")
|
||||
def unlinkapps_from_dir(target_dir)
|
||||
return unless target_dir.directory?
|
||||
|
||||
apps = Pathname.glob("#{target_dir}/*.app").select do |app|
|
||||
unlinkapps_unlink?(app)
|
||||
end
|
||||
|
||||
ObserverPathnameExtension.reset_counts!
|
||||
|
||||
apps.each do |app|
|
||||
app.extend(ObserverPathnameExtension)
|
||||
puts "Unlinking: #{app}"
|
||||
app.unlink
|
||||
end
|
||||
|
||||
if ObserverPathnameExtension.total.zero?
|
||||
puts "No apps unlinked from #{target_dir}" if ARGV.verbose?
|
||||
else
|
||||
ARGV.kegs.any? { |keg| file.start_with?("#{keg}/", "#{keg.opt_record}/") }
|
||||
n = ObserverPathnameExtension.total
|
||||
puts "Unlinked #{n} app#{plural(n)} from #{target_dir}"
|
||||
end
|
||||
end
|
||||
|
||||
UNLINKAPPS_PREFIXES = %W[
|
||||
#{HOMEBREW_CELLAR}/
|
||||
#{HOMEBREW_PREFIX}/opt/
|
||||
].freeze
|
||||
|
||||
def unlinkapps_unlink?(target_app)
|
||||
# Skip non-symlinks and symlinks that don't point into the Homebrew prefix.
|
||||
app = "#{target_app.readlink}" if target_app.symlink?
|
||||
return false unless app && app.start_with?(*UNLINKAPPS_PREFIXES)
|
||||
|
||||
if ARGV.named.empty?
|
||||
true
|
||||
else
|
||||
ARGV.kegs.any? { |keg| app.start_with?("#{keg}/", "#{keg.opt_record}/") }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user