Module: Homebrew::Uninstall Private

Defined in:
brew/Library/Homebrew/uninstall.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Helper module for uninstalling kegs.

Defined Under Namespace

Classes: DependentsMessage, DeveloperDependentsMessage, NondeveloperDependentsMessage

Class Method Summary collapse

Class Method Details

.check_for_dependents(kegs, named_args: []) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



107
108
109
110
111
112
113
114
115
116
117
# File 'brew/Library/Homebrew/uninstall.rb', line 107

def check_for_dependents(kegs, named_args: [])
  return false unless result = Keg.find_some_installed_dependents(kegs)

  if Homebrew::EnvConfig.developer?
    DeveloperDependentsMessage.new(*result, named_args: named_args).output
  else
    NondeveloperDependentsMessage.new(*result, named_args: named_args).output
  end

  true
end

.handle_unsatisfied_dependents(kegs_by_rack, ignore_dependencies: false, named_args: []) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



97
98
99
100
101
102
103
104
105
# File 'brew/Library/Homebrew/uninstall.rb', line 97

def handle_unsatisfied_dependents(kegs_by_rack, ignore_dependencies: false, named_args: [])
  return if ignore_dependencies

  all_kegs = kegs_by_rack.values.flatten(1)
  check_for_dependents(all_kegs, named_args: named_args)
rescue MethodDeprecatedError
  # Silently ignore deprecations when uninstalling.
  nil
end

.rm_pin(rack) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



164
165
166
167
168
# File 'brew/Library/Homebrew/uninstall.rb', line 164

def rm_pin(rack)
  Formulary.from_rack(rack).unpin
rescue
  nil
end

.uninstall_kegs(kegs_by_rack, force: false, ignore_dependencies: false, named_args: []) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'brew/Library/Homebrew/uninstall.rb', line 14

def uninstall_kegs(kegs_by_rack, force: false, ignore_dependencies: false, named_args: [])
  handle_unsatisfied_dependents(kegs_by_rack,
                                ignore_dependencies: ignore_dependencies,
                                named_args:          named_args)
  return if Homebrew.failed?

  kegs_by_rack.each do |rack, kegs|
    if force
      name = rack.basename

      if rack.directory?
        puts "Uninstalling #{name}... (#{rack.abv})"
        kegs.each do |keg|
          keg.unlink
          keg.uninstall
        end
      end

      rm_pin rack
    else
      kegs.each do |keg|
        begin
          f = Formulary.from_rack(rack)
          if f.pinned?
            onoe "#{f.full_name} is pinned. You must unpin it to uninstall."
            next
          end
        rescue
          nil
        end

        keg.lock do
          puts "Uninstalling #{keg}... (#{keg.abv})"
          keg.unlink
          keg.uninstall
          rack = keg.rack
          rm_pin rack

          if rack.directory?
            versions = rack.subdirs.map(&:basename)
            puts "#{keg.name} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed."
            puts "Run `brew uninstall --force #{keg.name}` to remove all versions."
          end

          next unless f

          paths = f.pkgetc.find.map(&:to_s) if f.pkgetc.exist?
          if paths.present?
            puts
            opoo <<~EOS
              The following #{f.name} configuration files have not been removed!
              If desired, remove them manually with `rm -rf`:
                #{paths.sort.uniq.join("\n  ")}
            EOS
          end

          unversioned_name = f.name.gsub(/@.+$/, "")
          maybe_paths = Dir.glob("#{f.etc}/*#{unversioned_name}*")
          maybe_paths -= paths if paths.present?
          if maybe_paths.present?
            puts
            opoo <<~EOS
              The following may be #{f.name} configuration files and have not been removed!
              If desired, remove them manually with `rm -rf`:
                #{maybe_paths.sort.uniq.join("\n  ")}
            EOS
          end
        end
      end
    end
  end
rescue MultipleVersionsInstalledError => e
  ofail e
ensure
  # If we delete Cellar/newname, then Cellar/oldname symlink
  # can become broken and we have to remove it.
  if HOMEBREW_CELLAR.directory?
    HOMEBREW_CELLAR.children.each do |rack|
      rack.unlink if rack.symlink? && !rack.resolved_path_exists?
    end
  end
end