aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/missing_formula.rb
blob: 31dfa94efa499403813146e72f2ec91f5e9ce430 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
require "formulary"
require "tap"
require "utils"

module Homebrew
  module MissingFormula
    class << self
      def reason(name, silent: false)
        blacklisted_reason(name) || tap_migration_reason(name) ||
          deleted_reason(name, silent: silent)
      end

      def blacklisted_reason(name)
        case name.downcase
        when "gem", /^rubygems?$/ then <<~EOS
          Homebrew provides gem via: `brew install ruby`.
          EOS
        when "tex", "tex-live", "texlive", "latex" then <<~EOS
          Installing TeX from source is weird and gross, requires a lot of patches,
          and only builds 32-bit (and thus can't use Homebrew dependencies)

          We recommend using a MacTeX distribution: https://www.tug.org/mactex/

          You can install it with Homebrew-Cask:
            brew cask install mactex
          EOS
        when "pip" then <<~EOS
          Homebrew provides pip via: `brew install python`. However you will then
          have two Pythons installed on your Mac, so alternatively you can install
          pip via the instructions at:
            #{Formatter.url("https://pip.readthedocs.io/en/stable/installing/")}
          EOS
        when "pil" then <<~EOS
          Instead of PIL, consider `pip2 install pillow`.
          EOS
        when "macruby" then <<~EOS
          MacRuby is not packaged and is on an indefinite development hiatus.
          You can read more about it at:
            #{Formatter.url("https://github.com/MacRuby/MacRuby")}
          EOS
        when /(lib)?lzma/
          "lzma is now part of the xz formula."
        when "gtest", "googletest", "google-test" then <<~EOS
          Installing gtest system-wide is not recommended; it should be vendored
          in your projects that use it.
          EOS
        when "gmock", "googlemock", "google-mock" then <<~EOS
          Installing gmock system-wide is not recommended; it should be vendored
          in your projects that use it.
          EOS
        when "sshpass" then <<~EOS
          We won't add sshpass because it makes it too easy for novice SSH users to
          ruin SSH's security.
          EOS
        when "gsutil" then <<~EOS
          Install gsutil with `pip2 install gsutil`
          EOS
        when "gfortran" then <<~EOS
          GNU Fortran is now provided as part of GCC, and can be installed with:
            brew install gcc
          EOS
        when "play" then <<~EOS
          Play 2.3 replaces the play command with activator:
            brew install typesafe-activator

          You can read more about this change at:
            #{Formatter.url("https://www.playframework.com/documentation/2.3.x/Migration23")}
            #{Formatter.url("https://www.playframework.com/documentation/2.3.x/Highlights23")}
          EOS
        when "haskell-platform" then <<~EOS
          We no longer package haskell-platform. Consider installing ghc
          and cabal-install instead:
            brew install ghc cabal-install

          You can install with Homebrew-Cask:
            brew cask install haskell-platform
          EOS
        when "mysqldump-secure" then <<~EOS
          The creator of mysqldump-secure tried to game our popularity metrics.
          EOS
        when "ngrok" then <<~EOS
          Upstream sunsetted 1.x in March 2016 and 2.x is not open-source.

          If you wish to use the 2.x release you can install with Homebrew-Cask:
            brew cask install ngrok
          EOS
        end
      end
      alias generic_blacklisted_reason blacklisted_reason

      def tap_migration_reason(name)
        message = nil

        Tap.each do |old_tap|
          new_tap = old_tap.tap_migrations[name]
          next unless new_tap

          new_tap_user, new_tap_repo, = new_tap.split("/")
          new_tap_name = "#{new_tap_user}/#{new_tap_repo}"

          message = <<~EOS
            It was migrated from #{old_tap} to #{new_tap}.
          EOS
          break if new_tap_name == CoreTap.instance.name

          message += <<~EOS
            You can access it again by running:
              brew tap #{new_tap_name}
          EOS
          break
        end

        message
      end

      def deleted_reason(name, silent: false)
        path = Formulary.path name
        return if File.exist? path
        tap = Tap.from_path(path)
        return if tap.nil? || !File.exist?(tap.path)
        relative_path = path.relative_path_from tap.path

        tap.path.cd do
          unless silent
            ohai "Searching for a previously deleted formula (in the last month)..."
            if (tap.path/".git/shallow").exist?
              opoo <<~EOS
                #{tap} is shallow clone. To get complete history run:
                  git -C "$(brew --repo #{tap})" fetch --unshallow

              EOS
            end
          end

          log_command = "git log --since='1 month ago' --diff-filter=D --name-only --max-count=1 --format=%H\\\\n%h\\\\n%B -- #{relative_path}"
          hash, short_hash, *commit_message, relative_path =
            Utils.popen_read(log_command).gsub("\\n", "\n").lines.map(&:chomp)

          if hash.to_s.empty? || short_hash.to_s.empty? ||
             relative_path.to_s.empty?
            ofail "No previously deleted formula found." unless silent
            return
          end

          commit_message = commit_message.reject(&:empty?).join("\n  ")

          commit_message.sub!(/ \(#(\d+)\)$/, " (#{tap.issues_url}/\\1)")
          commit_message.gsub!(/(Closes|Fixes) #(\d+)/, "\\1 #{tap.issues_url}/\\2")

          <<~EOS
            #{name} was deleted from #{tap.name} in commit #{short_hash}:
              #{commit_message}

            To show the formula before removal run:
              git -C "$(brew --repo #{tap})" show #{short_hash}^:#{relative_path}

            If you still use this formula consider creating your own tap:
              https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap
          EOS
        end
      end

      require "extend/os/missing_formula"
    end
  end
end