diff options
| author | Martin Afanasjew | 2015-12-08 09:11:33 +0100 |
|---|---|---|
| committer | Martin Afanasjew | 2016-04-06 10:31:54 +0200 |
| commit | ea38a7039552b27334efad63897bbc3ad2b7263c (patch) | |
| tree | 054233c5a3b3b6f5986d08f7699dc6423941f19b /Library | |
| parent | b50e950f0ea2a5fdfc8d312d1a6eb4f4e6240fa0 (diff) | |
| download | brew-ea38a7039552b27334efad63897bbc3ad2b7263c.tar.bz2 | |
prune: handle broken app symlinks
Remove broken symlinks from `/Applications` and `~/Applications` that
were previously created by `brew linkapps`, but are no longer valid
because formulae were uninstalled or the provided apps have changed.
Diffstat (limited to 'Library')
| -rw-r--r-- | Library/Homebrew/cmd/prune.rb | 3 | ||||
| -rw-r--r-- | Library/Homebrew/cmd/unlinkapps.rb | 20 | ||||
| -rw-r--r-- | Library/Homebrew/manpages/brew.1.md | 4 |
3 files changed, 21 insertions, 6 deletions
diff --git a/Library/Homebrew/cmd/prune.rb b/Library/Homebrew/cmd/prune.rb index 9631f1f81..ef416a343 100644 --- a/Library/Homebrew/cmd/prune.rb +++ b/Library/Homebrew/cmd/prune.rb @@ -1,5 +1,6 @@ require "keg" require "cmd/tap" +require "cmd/unlinkapps" module Homebrew def prune @@ -45,5 +46,7 @@ module Homebrew print "and #{d} directories " if d > 0 puts "from #{HOMEBREW_PREFIX}" end unless ARGV.dry_run? + + unlinkapps_prune(:dry_run => ARGV.dry_run?, :quiet => true) end end diff --git a/Library/Homebrew/cmd/unlinkapps.rb b/Library/Homebrew/cmd/unlinkapps.rb index 68ee9d94e..e6e321085 100644 --- a/Library/Homebrew/cmd/unlinkapps.rb +++ b/Library/Homebrew/cmd/unlinkapps.rb @@ -9,22 +9,30 @@ module Homebrew private + def unlinkapps_prune(opts = {}) + opts = opts.merge(:prune => true) + unlinkapps_from_dir(linkapps_target(:local => false), opts) + unlinkapps_from_dir(linkapps_target(:local => true), opts) + end + def unlinkapps_from_dir(target_dir, opts = {}) return unless target_dir.directory? dry_run = opts.fetch(:dry_run, false) + quiet = opts.fetch(:quiet, false) apps = Pathname.glob("#{target_dir}/*.app").select do |app| - unlinkapps_unlink?(app) + unlinkapps_unlink?(app, opts) end ObserverPathnameExtension.reset_counts! + app_kind = opts.fetch(:prune, false) ? " (broken link)" : "" apps.each do |app| app.extend(ObserverPathnameExtension) if dry_run - puts "Would unlink: #{app}" + puts "Would unlink#{app_kind}: #{app}" else - puts "Unlinking: #{app}" + puts "Unlinking#{app_kind}: #{app}" unless quiet app.unlink end end @@ -44,12 +52,14 @@ module Homebrew #{HOMEBREW_PREFIX}/opt/ ].freeze - def unlinkapps_unlink?(target_app) + def unlinkapps_unlink?(target_app, opts = {}) # 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? + if opts.fetch(:prune, false) + !File.exist?(app) # Remove only broken symlinks in prune mode. + elsif ARGV.named.empty? true else ARGV.kegs.any? { |keg| app.start_with?("#{keg}/", "#{keg.opt_record}/") } diff --git a/Library/Homebrew/manpages/brew.1.md b/Library/Homebrew/manpages/brew.1.md index 9e3c2cd07..f1849f90f 100644 --- a/Library/Homebrew/manpages/brew.1.md +++ b/Library/Homebrew/manpages/brew.1.md @@ -340,7 +340,9 @@ With `--verbose` or `-v`, many commands print extra debugging information. Note * `prune` [`--dry-run`]: Remove dead symlinks from the Homebrew prefix. This is generally not - needed, but can be useful when doing DIY installations. + needed, but can be useful when doing DIY installations. Also remove broken + app symlinks from `/Applications` and `~/Applications` that were previously + created by `brew linkapps`. If `--dry-run` or `-n` is passed, show what would be removed, but do not actually remove anything. |
