| 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
 |