Skip to content
Snippets Groups Projects
Commit dcf406f1 authored by Martin Afanasjew's avatar Martin Afanasjew
Browse files

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`.
parent f6318092
No related branches found
No related tags found
No related merge requests found
# 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
unlinkapps_from_dir(target_dir)
end
private
cellar_apps = Dir[target_dir + "/*.app"].select do |app|
if File.symlink?(app)
should_unlink? File.readlink(app)
end
def unlinkapps_from_dir(target_dir)
return unless target_dir.directory?
apps = Pathname.glob("#{target_dir}/*.app").select do |app|
unlinkapps_unlink?(app)
end
cellar_apps.each do |app|
puts "Unlinking #{app}"
system "unlink", app
ObserverPathnameExtension.reset_counts!
apps.each do |app|
app.extend(ObserverPathnameExtension)
puts "Unlinking: #{app}"
app.unlink
end
puts "Finished unlinking from #{target_dir}" if cellar_apps
if ObserverPathnameExtension.total.zero?
puts "No apps unlinked from #{target_dir}" if ARGV.verbose?
else
n = ObserverPathnameExtension.total
puts "Unlinked #{n} app#{plural(n)} from #{target_dir}"
end
end
private
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)
def should_unlink?(file)
if ARGV.named.empty?
file.start_with?("#{HOMEBREW_CELLAR}/", "#{HOMEBREW_PREFIX}/opt/")
true
else
ARGV.kegs.any? { |keg| file.start_with?("#{keg}/", "#{keg.opt_record}/") }
ARGV.kegs.any? { |keg| app.start_with?("#{keg}/", "#{keg.opt_record}/") }
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment