Merge remote-tracking branch 'origin/master' into add_change_origin_command
This commit is contained in:
		
						commit
						cfe2f5bfda
					
				
							
								
								
									
										33
									
								
								.github/issue-close-app.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/issue-close-app.yml
									
									
									
									
										vendored
									
									
								
							@ -1,33 +0,0 @@
 | 
			
		||||
# Comment that will be sent if an issue is judged to be closed
 | 
			
		||||
comment: |
 | 
			
		||||
  Whoops, it looks like you created an issue without filling out the checklist and providing all the needed information from one of the issue templates: <https://github.com/Homebrew/brew/issues/new/choose>
 | 
			
		||||
 | 
			
		||||
  As we need all this information to help you we're closing this issue. If you add the necessary information to this issue (**don't create a new or duplicate issue, please**) and comment to let us know, a Homebrew maintainer will check it out when they get the chance. If it's deemed to be a valid issue then this issue may be reopened.
 | 
			
		||||
 | 
			
		||||
  Sorry!
 | 
			
		||||
issueConfigs:
 | 
			
		||||
# There can be several configs for different kind of issues.
 | 
			
		||||
- content:
 | 
			
		||||
# new feature suggestion
 | 
			
		||||
  - "A detailed description of the proposed feature"
 | 
			
		||||
  - "The motivation for the feature"
 | 
			
		||||
  - "How the feature would be relevant to at least 90% of Homebrew users"
 | 
			
		||||
  - "What alternatives to the feature have been considered"
 | 
			
		||||
- content:
 | 
			
		||||
# reproducible bug report
 | 
			
		||||
  - "are reporting a bug others will be able to reproduce"
 | 
			
		||||
  - "reproduced the problem with multiple formulae"
 | 
			
		||||
  - "brew update"
 | 
			
		||||
  - "brew doctor"
 | 
			
		||||
  - "brew config"
 | 
			
		||||
  - "What you were trying to do (and why)"
 | 
			
		||||
  - "What happened (include command output)"
 | 
			
		||||
  - "What you expected to happen"
 | 
			
		||||
  - "Step-by-step reproduction instructions (by running `brew` commands)"
 | 
			
		||||
# Optional configuration:
 | 
			
		||||
#
 | 
			
		||||
# whether the keywords are case-insensitive
 | 
			
		||||
# default value is false, which means keywords are case-sensitive
 | 
			
		||||
caseInsensitive: false
 | 
			
		||||
# The issue is judged to be legal if it includes all keywords from any of these two configs.
 | 
			
		||||
# Or it will be closed by the app.
 | 
			
		||||
							
								
								
									
										43
									
								
								.github/workflows/tests.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								.github/workflows/tests.yml
									
									
									
									
										vendored
									
									
								
							@ -11,15 +11,25 @@ jobs:
 | 
			
		||||
        os: [ubuntu-latest, macOS-latest]
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Set up Git repository
 | 
			
		||||
      uses: actions/checkout@master
 | 
			
		||||
      uses: actions/checkout@v1
 | 
			
		||||
 | 
			
		||||
    - name: Set up Homebrew
 | 
			
		||||
      run: |
 | 
			
		||||
        if [ "$RUNNER_OS" = "Linux" ]; then
 | 
			
		||||
          HOMEBREW_REPOSITORY=/home/linuxbrew/.linuxbrew
 | 
			
		||||
          sudo mkdir -p /home/linuxbrew
 | 
			
		||||
          sudo ln -s "$PWD" "$HOMEBREW_REPOSITORY"
 | 
			
		||||
          HOMEBREW_REPOSITORY=/home/linuxbrew/.linuxbrew/Homebrew
 | 
			
		||||
          sudo mkdir -p /home/linuxbrew/.linuxbrew
 | 
			
		||||
          cd ..
 | 
			
		||||
          sudo mv "brew" "$HOMEBREW_REPOSITORY"
 | 
			
		||||
          sudo ln -s "$HOMEBREW_REPOSITORY" "brew"
 | 
			
		||||
          cd /home/linuxbrew/.linuxbrew
 | 
			
		||||
          sudo mkdir -p bin etc include lib opt sbin share var/homebrew/linked Cellar
 | 
			
		||||
          sudo ln -s ../Homebrew/bin/brew /home/linuxbrew/.linuxbrew/bin/
 | 
			
		||||
          sudo chown -R "$USER" /home/linuxbrew
 | 
			
		||||
          export PATH="/home/linuxbrew/.linuxbrew/bin:/usr/local/bin:/usr/bin:/bin"
 | 
			
		||||
 | 
			
		||||
          # Install taps needed for 'brew tests'
 | 
			
		||||
          export HOMEBREW_NO_AUTO_UPDATE=1
 | 
			
		||||
          brew tap homebrew/bundle
 | 
			
		||||
        else
 | 
			
		||||
          HOMEBREW_REPOSITORY="$(brew --repo)"
 | 
			
		||||
          mv "$HOMEBREW_REPOSITORY/Library/Taps" "$PWD/Library"
 | 
			
		||||
@ -28,11 +38,30 @@ jobs:
 | 
			
		||||
          brew update-reset Library/Taps/homebrew/homebrew-core
 | 
			
		||||
 | 
			
		||||
          # Install taps needed for 'brew tests'
 | 
			
		||||
          export HOMEBREW_NO_AUTO_UPDATE=1
 | 
			
		||||
          brew tap homebrew/cask
 | 
			
		||||
          brew tap homebrew/bundle
 | 
			
		||||
          brew tap homebrew/services
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
    - name: Run brew config
 | 
			
		||||
      run: |
 | 
			
		||||
        export PATH="/home/linuxbrew/.linuxbrew/bin:/usr/local/bin:/usr/bin:/bin"
 | 
			
		||||
        brew config
 | 
			
		||||
 | 
			
		||||
    - name: Run brew doctor
 | 
			
		||||
      run: |
 | 
			
		||||
        if [ "$RUNNER_OS" = "Linux" ]; then
 | 
			
		||||
          export PATH="/home/linuxbrew/.linuxbrew/bin:/usr/bin:/bin"
 | 
			
		||||
 | 
			
		||||
          # Cleanup some Linux `brew doctor` failures
 | 
			
		||||
          sudo rm -rf /usr/local/include/node/
 | 
			
		||||
        else
 | 
			
		||||
          # Allow Xcode to be outdated
 | 
			
		||||
          export HOMEBREW_GITHUB_ACTIONS=1
 | 
			
		||||
        fi
 | 
			
		||||
        brew doctor
 | 
			
		||||
 | 
			
		||||
    - name: Install Bundler RubyGems
 | 
			
		||||
      run: |
 | 
			
		||||
        export PATH="/home/linuxbrew/.linuxbrew/bin:/usr/local/bin:/usr/bin:/bin"
 | 
			
		||||
@ -101,6 +130,12 @@ jobs:
 | 
			
		||||
        export PATH="/home/linuxbrew/.linuxbrew/bin:/usr/local/bin:/usr/bin:/bin"
 | 
			
		||||
        brew readall --aliases
 | 
			
		||||
 | 
			
		||||
    - name: Run vale for docs linting
 | 
			
		||||
      run: |
 | 
			
		||||
        export PATH="/home/linuxbrew/.linuxbrew/bin:/usr/local/bin:/usr/bin:/bin"
 | 
			
		||||
        brew install vale
 | 
			
		||||
        vale $(brew --repo)/docs/
 | 
			
		||||
 | 
			
		||||
    - name: Build Docker image
 | 
			
		||||
      run: |
 | 
			
		||||
        docker pull homebrew/brew
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -154,6 +154,7 @@
 | 
			
		||||
!/.editorconfig
 | 
			
		||||
!/.gitignore
 | 
			
		||||
!/.yardopts
 | 
			
		||||
!/.vale.ini
 | 
			
		||||
!/CHANGELOG.md
 | 
			
		||||
!/CONTRIBUTING.md
 | 
			
		||||
!/Dockerfile
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								.vale.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.vale.ini
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
StylesPath = ./docs/vale-styles
 | 
			
		||||
 | 
			
		||||
[*.md]
 | 
			
		||||
BasedOnStyles = Homebrew
 | 
			
		||||
@ -79,7 +79,7 @@ Metrics/PerceivedComplexity:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# GitHub diff UI wraps beyond 118 characters (so that's the goal)
 | 
			
		||||
Metrics/LineLength:
 | 
			
		||||
Layout/LineLength:
 | 
			
		||||
  Max: 170
 | 
			
		||||
  # ignore manpage comments and long single-line strings
 | 
			
		||||
  IgnoredPatterns: ['#: ', ' url "', ' mirror "', ' plist_options :']
 | 
			
		||||
 | 
			
		||||
@ -33,7 +33,7 @@ Layout/FirstHashElementIndentation:
 | 
			
		||||
  EnforcedStyle: align_braces
 | 
			
		||||
 | 
			
		||||
# Casks often contain long URLs and file paths.
 | 
			
		||||
Metrics/LineLength:
 | 
			
		||||
Layout/LineLength:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
 | 
			
		||||
# Casks don't need documentation.
 | 
			
		||||
 | 
			
		||||
@ -62,7 +62,7 @@ Metrics/PerceivedComplexity:
 | 
			
		||||
  Max: 100
 | 
			
		||||
 | 
			
		||||
# GitHub diff UI wraps beyond 118 characters
 | 
			
		||||
Metrics/LineLength:
 | 
			
		||||
Layout/LineLength:
 | 
			
		||||
  Max: 118
 | 
			
		||||
  # ignore manpage comments
 | 
			
		||||
  IgnoredPatterns: ['#: ']
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
GEM
 | 
			
		||||
  remote: https://rubygems.org/
 | 
			
		||||
  specs:
 | 
			
		||||
    activesupport (6.0.1)
 | 
			
		||||
    activesupport (6.0.2.1)
 | 
			
		||||
      concurrent-ruby (~> 1.0, >= 1.0.2)
 | 
			
		||||
      i18n (>= 0.7, < 2)
 | 
			
		||||
      minitest (~> 5.1)
 | 
			
		||||
@ -26,7 +26,7 @@ GEM
 | 
			
		||||
    i18n (1.7.0)
 | 
			
		||||
      concurrent-ruby (~> 1.0)
 | 
			
		||||
    jaro_winkler (1.5.4)
 | 
			
		||||
    json (2.2.0)
 | 
			
		||||
    json (2.3.0)
 | 
			
		||||
    mechanize (2.7.6)
 | 
			
		||||
      domain_name (~> 0.5, >= 0.5.1)
 | 
			
		||||
      http-cookie (~> 1.0)
 | 
			
		||||
@ -36,22 +36,22 @@ GEM
 | 
			
		||||
      nokogiri (~> 1.6)
 | 
			
		||||
      ntlm-http (~> 0.1, >= 0.1.1)
 | 
			
		||||
      webrobots (>= 0.0.9, < 0.2)
 | 
			
		||||
    mime-types (3.3)
 | 
			
		||||
    mime-types (3.3.1)
 | 
			
		||||
      mime-types-data (~> 3.2015)
 | 
			
		||||
    mime-types-data (3.2019.1009)
 | 
			
		||||
    mini_portile2 (2.4.0)
 | 
			
		||||
    minitest (5.13.0)
 | 
			
		||||
    mustache (1.1.0)
 | 
			
		||||
    mustache (1.1.1)
 | 
			
		||||
    net-http-digest_auth (1.4.1)
 | 
			
		||||
    net-http-persistent (3.1.0)
 | 
			
		||||
      connection_pool (~> 2.2)
 | 
			
		||||
    nokogiri (1.10.5)
 | 
			
		||||
    nokogiri (1.10.7)
 | 
			
		||||
      mini_portile2 (~> 2.4.0)
 | 
			
		||||
    ntlm-http (0.1.1)
 | 
			
		||||
    parallel (1.19.1)
 | 
			
		||||
    parallel_tests (2.29.2)
 | 
			
		||||
    parallel_tests (2.30.0)
 | 
			
		||||
      parallel
 | 
			
		||||
    parser (2.6.5.0)
 | 
			
		||||
    parser (2.7.0.0)
 | 
			
		||||
      ast (~> 2.4.0)
 | 
			
		||||
    plist (3.5.0)
 | 
			
		||||
    rainbow (3.0.0)
 | 
			
		||||
@ -64,8 +64,8 @@ GEM
 | 
			
		||||
      rspec-core (~> 3.9.0)
 | 
			
		||||
      rspec-expectations (~> 3.9.0)
 | 
			
		||||
      rspec-mocks (~> 3.9.0)
 | 
			
		||||
    rspec-core (3.9.0)
 | 
			
		||||
      rspec-support (~> 3.9.0)
 | 
			
		||||
    rspec-core (3.9.1)
 | 
			
		||||
      rspec-support (~> 3.9.1)
 | 
			
		||||
    rspec-expectations (3.9.0)
 | 
			
		||||
      diff-lcs (>= 1.2.0, < 2.0)
 | 
			
		||||
      rspec-support (~> 3.9.0)
 | 
			
		||||
@ -77,19 +77,19 @@ GEM
 | 
			
		||||
      rspec-support (~> 3.9.0)
 | 
			
		||||
    rspec-retry (0.6.2)
 | 
			
		||||
      rspec-core (> 3.3)
 | 
			
		||||
    rspec-support (3.9.0)
 | 
			
		||||
    rspec-support (3.9.1)
 | 
			
		||||
    rspec-wait (0.0.9)
 | 
			
		||||
      rspec (>= 3, < 4)
 | 
			
		||||
    rubocop (0.77.0)
 | 
			
		||||
    rubocop (0.78.0)
 | 
			
		||||
      jaro_winkler (~> 1.5.1)
 | 
			
		||||
      parallel (~> 1.10)
 | 
			
		||||
      parser (>= 2.6)
 | 
			
		||||
      rainbow (>= 2.2.2, < 4.0)
 | 
			
		||||
      ruby-progressbar (~> 1.7)
 | 
			
		||||
      unicode-display_width (>= 1.4.0, < 1.7)
 | 
			
		||||
    rubocop-performance (1.5.1)
 | 
			
		||||
    rubocop-performance (1.5.2)
 | 
			
		||||
      rubocop (>= 0.71.0)
 | 
			
		||||
    rubocop-rspec (1.37.0)
 | 
			
		||||
    rubocop-rspec (1.37.1)
 | 
			
		||||
      rubocop (>= 0.68.1)
 | 
			
		||||
    ruby-macho (2.2.0)
 | 
			
		||||
    ruby-progressbar (1.10.1)
 | 
			
		||||
@ -100,10 +100,10 @@ GEM
 | 
			
		||||
    simplecov-html (0.10.2)
 | 
			
		||||
    term-ansicolor (1.7.1)
 | 
			
		||||
      tins (~> 1.0)
 | 
			
		||||
    thor (0.20.3)
 | 
			
		||||
    thor (1.0.1)
 | 
			
		||||
    thread_safe (0.3.6)
 | 
			
		||||
    tins (1.22.2)
 | 
			
		||||
    tzinfo (1.2.5)
 | 
			
		||||
    tzinfo (1.2.6)
 | 
			
		||||
      thread_safe (~> 0.1)
 | 
			
		||||
    unf (0.1.4)
 | 
			
		||||
      unf_ext
 | 
			
		||||
 | 
			
		||||
@ -77,8 +77,8 @@ HOMEBREW_VERSION="$(git -C "$HOMEBREW_REPOSITORY" describe --tags --dirty --abbr
 | 
			
		||||
HOMEBREW_USER_AGENT_VERSION="$HOMEBREW_VERSION"
 | 
			
		||||
if [[ -z "$HOMEBREW_VERSION" ]]
 | 
			
		||||
then
 | 
			
		||||
  HOMEBREW_VERSION=">=1.7.1 (shallow or no git repository)"
 | 
			
		||||
  HOMEBREW_USER_AGENT_VERSION="1.X.Y"
 | 
			
		||||
  HOMEBREW_VERSION=">=2.2.0 (shallow or no git repository)"
 | 
			
		||||
  HOMEBREW_USER_AGENT_VERSION="2.X.Y"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ "$HOMEBREW_PREFIX" = "/" || "$HOMEBREW_PREFIX" = "/usr" ]]
 | 
			
		||||
@ -410,8 +410,8 @@ fi
 | 
			
		||||
check-run-command-as-root() {
 | 
			
		||||
  [[ "$(id -u)" = 0 ]] || return
 | 
			
		||||
 | 
			
		||||
  # Allow Azure Pipelines/Docker/Kubernetes to do everything as root (as it's normal there)
 | 
			
		||||
  [[ -f /proc/1/cgroup ]] && grep -E "azpl_job|docker|kubepods" -q /proc/1/cgroup && return
 | 
			
		||||
  # Allow Azure Pipelines/Docker/Concourse/Kubernetes to do everything as root (as it's normal there)
 | 
			
		||||
  [[ -f /proc/1/cgroup ]] && grep -E "azpl_job|docker|garden|kubepods" -q /proc/1/cgroup && return
 | 
			
		||||
 | 
			
		||||
  # Homebrew Services may need `sudo` for system-wide daemons.
 | 
			
		||||
  [[ "$HOMEBREW_COMMAND" = "services" ]] && return
 | 
			
		||||
 | 
			
		||||
@ -127,7 +127,7 @@ class Build
 | 
			
		||||
        end
 | 
			
		||||
        if ARGV.interactive?
 | 
			
		||||
          ohai "Entering interactive mode"
 | 
			
		||||
          puts "Type `exit` to return and finalize the installation"
 | 
			
		||||
          puts "Type `exit` to return and finalize the installation."
 | 
			
		||||
          puts "Install to this prefix: #{formula.prefix}"
 | 
			
		||||
 | 
			
		||||
          if ARGV.git?
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ module Cask
 | 
			
		||||
 | 
			
		||||
      DIVIDER_REGEX = /(#{DIVIDERS.keys.map { |v| Regexp.quote(v) }.join('|')})/.freeze
 | 
			
		||||
 | 
			
		||||
      MAJOR_MINOR_PATCH_REGEX = /^(\d+)(?:\.(\d+)(?:\.(\d+))?)?/.freeze
 | 
			
		||||
      MAJOR_MINOR_PATCH_REGEX = /^([^.,:]+)(?:\.([^.,:]+)(?:\.([^.,:]+))?)?/.freeze
 | 
			
		||||
 | 
			
		||||
      INVALID_CHARACTERS = /[^0-9a-zA-Z\.\,\:\-\_]/.freeze
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -111,7 +111,7 @@ class Cleaner
 | 
			
		||||
        end
 | 
			
		||||
        if ARGV.debug?
 | 
			
		||||
          old_perms = path.stat.mode & 0777
 | 
			
		||||
          puts "Fixing #{path} permissions from #{old_perms.to_s(8)} to #{perms.to_s(8)}" if perms != old_perms
 | 
			
		||||
          odebug "Fixing #{path} permissions from #{old_perms.to_s(8)} to #{perms.to_s(8)}" if perms != old_perms
 | 
			
		||||
        end
 | 
			
		||||
        path.chmod perms
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -5,16 +5,23 @@ require "ostruct"
 | 
			
		||||
module Homebrew
 | 
			
		||||
  module CLI
 | 
			
		||||
    class Args < OpenStruct
 | 
			
		||||
      attr_accessor :processed_options
 | 
			
		||||
      attr_reader :processed_options, :args_parsed
 | 
			
		||||
      # undefine tap to allow --tap argument
 | 
			
		||||
      undef tap
 | 
			
		||||
 | 
			
		||||
      def initialize(argv:)
 | 
			
		||||
        super
 | 
			
		||||
        @argv = argv
 | 
			
		||||
        @args_parsed = false
 | 
			
		||||
        @processed_options = []
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def freeze_processed_options!(processed_options)
 | 
			
		||||
        @processed_options += processed_options
 | 
			
		||||
        @processed_options.freeze
 | 
			
		||||
        @args_parsed = true
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def option_to_name(option)
 | 
			
		||||
        option.sub(/\A--?/, "")
 | 
			
		||||
              .tr("-", "_")
 | 
			
		||||
@ -51,22 +58,38 @@ module Homebrew
 | 
			
		||||
        options_only - CLI::Parser.global_options.values.map(&:first).flatten
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def downcased_unique_named
 | 
			
		||||
        # Only lowercase names, not paths, bottle filenames or URLs
 | 
			
		||||
        @downcased_unique_named ||= remaining.map do |arg|
 | 
			
		||||
          if arg.include?("/") || arg.end_with?(".tar.gz") || File.exist?(arg)
 | 
			
		||||
            arg
 | 
			
		||||
      def named
 | 
			
		||||
        return [] if remaining.nil?
 | 
			
		||||
 | 
			
		||||
        remaining
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def formulae
 | 
			
		||||
        require "formula"
 | 
			
		||||
        @formulae ||= (downcased_unique_named - casks).map do |name|
 | 
			
		||||
          if name.include?("/") || File.exist?(name)
 | 
			
		||||
            Formulary.factory(name, spec)
 | 
			
		||||
          else
 | 
			
		||||
            arg.downcase
 | 
			
		||||
            Formulary.find_with_priority(name, spec)
 | 
			
		||||
          end
 | 
			
		||||
        end.uniq
 | 
			
		||||
        end.uniq(&:name)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def resolved_formulae
 | 
			
		||||
        require "formula"
 | 
			
		||||
        @resolved_formulae ||= (downcased_unique_named - casks).map do |name|
 | 
			
		||||
          Formulary.resolve(name, spec: spec(nil))
 | 
			
		||||
        end.uniq(&:name)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def casks
 | 
			
		||||
        @casks ||= downcased_unique_named.grep HOMEBREW_CASK_TAP_CASK_REGEX
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def kegs
 | 
			
		||||
        require "keg"
 | 
			
		||||
        require "formula"
 | 
			
		||||
        require "missing_formula"
 | 
			
		||||
 | 
			
		||||
        @kegs ||= downcased_unique_named.map do |name|
 | 
			
		||||
          raise UsageError if name.empty?
 | 
			
		||||
 | 
			
		||||
@ -113,6 +136,42 @@ module Homebrew
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      private
 | 
			
		||||
 | 
			
		||||
      def downcased_unique_named
 | 
			
		||||
        # Only lowercase names, not paths, bottle filenames or URLs
 | 
			
		||||
        arguments = if args_parsed
 | 
			
		||||
          remaining
 | 
			
		||||
        else
 | 
			
		||||
          cmdline_args.reject { |arg| arg.start_with?("-") }
 | 
			
		||||
        end
 | 
			
		||||
        arguments.map do |arg|
 | 
			
		||||
          if arg.include?("/") || arg.end_with?(".tar.gz") || File.exist?(arg)
 | 
			
		||||
            arg
 | 
			
		||||
          else
 | 
			
		||||
            arg.downcase
 | 
			
		||||
          end
 | 
			
		||||
        end.uniq
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def head
 | 
			
		||||
        (args_parsed && HEAD?) || cmdline_args.include?("--HEAD")
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def devel
 | 
			
		||||
        (args_parsed && devel?) || cmdline_args.include?("--devel")
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def spec(default = :stable)
 | 
			
		||||
        if head
 | 
			
		||||
          :head
 | 
			
		||||
        elsif devel
 | 
			
		||||
          :devel
 | 
			
		||||
        else
 | 
			
		||||
          default
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ module Homebrew
 | 
			
		||||
      attr_reader :processed_options, :hide_from_man_page
 | 
			
		||||
 | 
			
		||||
      def self.parse(args = ARGV, &block)
 | 
			
		||||
        new(&block).parse(args)
 | 
			
		||||
        new(args, &block).parse(args)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def self.global_options
 | 
			
		||||
@ -25,13 +25,16 @@ module Homebrew
 | 
			
		||||
        }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def initialize(&block)
 | 
			
		||||
      def initialize(args = ARGV, &block)
 | 
			
		||||
        @parser = OptionParser.new
 | 
			
		||||
        @args = Homebrew::CLI::Args.new(argv: ARGV_WITHOUT_MONKEY_PATCHING)
 | 
			
		||||
        @args[:remaining] = []
 | 
			
		||||
        @args[:cmdline_args] = args.dup
 | 
			
		||||
        @constraints = []
 | 
			
		||||
        @conflicts = []
 | 
			
		||||
        @switch_sources = {}
 | 
			
		||||
        @processed_options = []
 | 
			
		||||
        @max_named_args = nil
 | 
			
		||||
        @hide_from_man_page = false
 | 
			
		||||
        instance_eval(&block)
 | 
			
		||||
        post_initialize
 | 
			
		||||
@ -137,11 +140,12 @@ module Homebrew
 | 
			
		||||
          raise e
 | 
			
		||||
        end
 | 
			
		||||
        check_constraint_violations
 | 
			
		||||
        check_named_args(remaining_args)
 | 
			
		||||
        @args[:remaining] = remaining_args
 | 
			
		||||
        @args_parsed = true
 | 
			
		||||
        @args.processed_options = @processed_options
 | 
			
		||||
        @args.freeze_processed_options!(@processed_options)
 | 
			
		||||
        Homebrew.args = @args
 | 
			
		||||
        cmdline_args.freeze
 | 
			
		||||
        @args_parsed = true
 | 
			
		||||
        @parser
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -159,7 +163,7 @@ module Homebrew
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def formula_options
 | 
			
		||||
        ARGV.formulae.each do |f|
 | 
			
		||||
        @args.formulae.each do |f|
 | 
			
		||||
          next if f.options.empty?
 | 
			
		||||
 | 
			
		||||
          f.options.each do |o|
 | 
			
		||||
@ -176,6 +180,10 @@ module Homebrew
 | 
			
		||||
        []
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def max_named(count)
 | 
			
		||||
        @max_named_args = count
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def hide_from_man_page!
 | 
			
		||||
        @hide_from_man_page = true
 | 
			
		||||
      end
 | 
			
		||||
@ -267,6 +275,10 @@ module Homebrew
 | 
			
		||||
        check_constraints
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def check_named_args(args)
 | 
			
		||||
        raise NamedArgumentsError, @max_named_args if !@max_named_args.nil? && args.size > @max_named_args
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def process_option(*args)
 | 
			
		||||
        option, = @parser.make_switch(args)
 | 
			
		||||
        @processed_options << [option.short.first, option.long.first, option.arg, option.desc.first]
 | 
			
		||||
@ -275,14 +287,10 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    class OptionConstraintError < RuntimeError
 | 
			
		||||
      def initialize(arg1, arg2, missing: false)
 | 
			
		||||
        if !missing
 | 
			
		||||
          message = <<~EOS
 | 
			
		||||
            `#{arg1}` and `#{arg2}` should be passed together.
 | 
			
		||||
          EOS
 | 
			
		||||
        message = if !missing
 | 
			
		||||
          "`#{arg1}` and `#{arg2}` should be passed together."
 | 
			
		||||
        else
 | 
			
		||||
          message = <<~EOS
 | 
			
		||||
            `#{arg2}` cannot be passed without `#{arg1}`.
 | 
			
		||||
          EOS
 | 
			
		||||
          "`#{arg2}` cannot be passed without `#{arg1}`."
 | 
			
		||||
        end
 | 
			
		||||
        super message
 | 
			
		||||
      end
 | 
			
		||||
@ -292,17 +300,27 @@ module Homebrew
 | 
			
		||||
      def initialize(args)
 | 
			
		||||
        args_list = args.map(&Formatter.public_method(:option))
 | 
			
		||||
                        .join(" and ")
 | 
			
		||||
        super <<~EOS
 | 
			
		||||
          Options #{args_list} are mutually exclusive.
 | 
			
		||||
        EOS
 | 
			
		||||
        super "Options #{args_list} are mutually exclusive."
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    class InvalidConstraintError < RuntimeError
 | 
			
		||||
      def initialize(arg1, arg2)
 | 
			
		||||
        super <<~EOS
 | 
			
		||||
          `#{arg1}` and `#{arg2}` cannot be mutually exclusive and mutually dependent simultaneously.
 | 
			
		||||
        EOS
 | 
			
		||||
        super "`#{arg1}` and `#{arg2}` cannot be mutually exclusive and mutually dependent simultaneously."
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    class NamedArgumentsError < UsageError
 | 
			
		||||
      def initialize(maximum)
 | 
			
		||||
        message = case maximum
 | 
			
		||||
        when 0
 | 
			
		||||
          "This command does not take named arguments."
 | 
			
		||||
        when 1
 | 
			
		||||
          "This command does not take multiple named arguments."
 | 
			
		||||
        else
 | 
			
		||||
          "This command does not take more than #{maximum} named arguments."
 | 
			
		||||
        end
 | 
			
		||||
        super message
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ module Homebrew
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
      puts HOMEBREW_CACHE
 | 
			
		||||
    else
 | 
			
		||||
      ARGV.formulae.each do |f|
 | 
			
		||||
      Homebrew.args.formulae.each do |f|
 | 
			
		||||
        if Fetch.fetch_bottle?(f)
 | 
			
		||||
          puts f.bottle.cached_download
 | 
			
		||||
        else
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ module Homebrew
 | 
			
		||||
  def __cellar
 | 
			
		||||
    __cellar_args.parse
 | 
			
		||||
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
    if Homebrew.args.named.blank?
 | 
			
		||||
      puts HOMEBREW_CELLAR
 | 
			
		||||
    else
 | 
			
		||||
      puts ARGV.resolved_formulae.map(&:rack)
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@ module Homebrew
 | 
			
		||||
  def __env_args
 | 
			
		||||
    Homebrew::CLI::Parser.new do
 | 
			
		||||
      usage_banner <<~EOS
 | 
			
		||||
        `--env` [<options>]
 | 
			
		||||
        `--env` [<options>] [<formula>]
 | 
			
		||||
 | 
			
		||||
        Summarise Homebrew's build environment as a plain list.
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ module Homebrew
 | 
			
		||||
    __env_args.parse
 | 
			
		||||
 | 
			
		||||
    ENV.activate_extensions!
 | 
			
		||||
    ENV.deps = ARGV.formulae if superenv?
 | 
			
		||||
    ENV.deps = Homebrew.args.formulae if superenv?
 | 
			
		||||
    ENV.setup_build_environment
 | 
			
		||||
    ENV.universal_binary if ARGV.build_universal?
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ module Homebrew
 | 
			
		||||
  def __prefix
 | 
			
		||||
    __prefix_args.parse
 | 
			
		||||
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
    if Homebrew.args.named.blank?
 | 
			
		||||
      puts HOMEBREW_PREFIX
 | 
			
		||||
    else
 | 
			
		||||
      puts ARGV.resolved_formulae.map { |f|
 | 
			
		||||
 | 
			
		||||
@ -13,14 +13,13 @@ module Homebrew
 | 
			
		||||
        Print the version numbers of Homebrew, Homebrew/homebrew-core and Homebrew/homebrew-cask
 | 
			
		||||
        (if tapped) to standard output.
 | 
			
		||||
      EOS
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def __version
 | 
			
		||||
    __version_args.parse
 | 
			
		||||
 | 
			
		||||
    odie "This command does not take arguments." if ARGV.any?
 | 
			
		||||
 | 
			
		||||
    puts "Homebrew #{HOMEBREW_VERSION}"
 | 
			
		||||
    puts "#{CoreTap.instance.full_name} #{CoreTap.instance.version_string}"
 | 
			
		||||
    puts "#{Tap.default_cask_tap.full_name} #{Tap.default_cask_tap.version_string}" if Tap.default_cask_tap.installed?
 | 
			
		||||
 | 
			
		||||
@ -19,14 +19,13 @@ module Homebrew
 | 
			
		||||
      EOS
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def analytics
 | 
			
		||||
    analytics_args.parse
 | 
			
		||||
 | 
			
		||||
    raise UsageError if args.remaining.size > 1
 | 
			
		||||
 | 
			
		||||
    case args.remaining.first
 | 
			
		||||
    when nil, "state"
 | 
			
		||||
      if Utils::Analytics.disabled?
 | 
			
		||||
@ -42,7 +41,7 @@ module Homebrew
 | 
			
		||||
    when "regenerate-uuid"
 | 
			
		||||
      Utils::Analytics.regenerate_uuid!
 | 
			
		||||
    else
 | 
			
		||||
      raise UsageError
 | 
			
		||||
      raise UsageError, "Unknown subcommand."
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -12,17 +12,17 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
        Display the source of <formula>.
 | 
			
		||||
      EOS
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def cat
 | 
			
		||||
    cat_args.parse
 | 
			
		||||
    # do not "fix" this to support multiple arguments, the output would be
 | 
			
		||||
    # unparsable, if the user wants to cat multiple formula they can call
 | 
			
		||||
    # brew cat multiple times.
 | 
			
		||||
    formulae = ARGV.formulae
 | 
			
		||||
    # unparsable; if the user wants to cat multiple formula they can call
 | 
			
		||||
    # `brew cat` multiple times.
 | 
			
		||||
    formulae = Homebrew.args.formulae
 | 
			
		||||
    raise FormulaUnspecifiedError if formulae.empty?
 | 
			
		||||
    raise "`brew cat` doesn't support multiple arguments" if args.remaining.size > 1
 | 
			
		||||
 | 
			
		||||
    cd HOMEBREW_REPOSITORY
 | 
			
		||||
    pager = if ENV["HOMEBREW_BAT"].nil?
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ module Homebrew
 | 
			
		||||
             description: "Show what would be removed, but do not actually remove anything."
 | 
			
		||||
      switch "-s",
 | 
			
		||||
             description: "Scrub the cache, including downloads for even the latest versions. "\
 | 
			
		||||
                          "Note downloads for any installed formula or cask will still not be deleted. "\
 | 
			
		||||
                          "Note downloads for any installed formulae or casks will still not be deleted. "\
 | 
			
		||||
                          "If you want to delete those too: `rm -rf \"$(brew --cache)\"`"
 | 
			
		||||
      switch "--prune-prefix",
 | 
			
		||||
             description: "Only prune the symlinks and directories from the prefix and remove no other files."
 | 
			
		||||
 | 
			
		||||
@ -20,17 +20,18 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
  def command
 | 
			
		||||
    command_args.parse
 | 
			
		||||
    abort "This command requires a command argument" if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    cmd = HOMEBREW_INTERNAL_COMMAND_ALIASES.fetch(args.remaining.first, args.remaining.first)
 | 
			
		||||
    raise UsageError, "This command requires a command argument" if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    path = Commands.path(cmd)
 | 
			
		||||
    args.remaining.each do |c|
 | 
			
		||||
      cmd = HOMEBREW_INTERNAL_COMMAND_ALIASES.fetch(c, c)
 | 
			
		||||
      path = Commands.path(cmd)
 | 
			
		||||
      cmd_paths = PATH.new(ENV["PATH"]).append(Tap.cmd_directories) unless path
 | 
			
		||||
      path ||= which("brew-#{cmd}", cmd_paths)
 | 
			
		||||
      path ||= which("brew-#{cmd}.rb", cmd_paths)
 | 
			
		||||
 | 
			
		||||
    cmd_paths = PATH.new(ENV["PATH"]).append(Tap.cmd_directories) unless path
 | 
			
		||||
    path ||= which("brew-#{cmd}", cmd_paths)
 | 
			
		||||
    path ||= which("brew-#{cmd}.rb", cmd_paths)
 | 
			
		||||
 | 
			
		||||
    odie "Unknown command: #{cmd}" unless path
 | 
			
		||||
    puts path
 | 
			
		||||
      odie "Unknown command: #{cmd}" unless path
 | 
			
		||||
      puts path
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ module Homebrew
 | 
			
		||||
             description: "Include aliases of internal commands."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -35,21 +36,18 @@ module Homebrew
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Find commands in Homebrew/cmd
 | 
			
		||||
    puts "Built-in commands"
 | 
			
		||||
    puts Formatter.columns(internal_commands.sort)
 | 
			
		||||
    ohai "Built-in commands", Formatter.columns(internal_commands.sort)
 | 
			
		||||
 | 
			
		||||
    # Find commands in Homebrew/dev-cmd
 | 
			
		||||
    puts
 | 
			
		||||
    puts "Built-in developer commands"
 | 
			
		||||
    puts Formatter.columns(internal_developer_commands.sort)
 | 
			
		||||
    ohai "Built-in developer commands", Formatter.columns(internal_developer_commands.sort)
 | 
			
		||||
 | 
			
		||||
    exts = external_commands
 | 
			
		||||
    return if exts.empty?
 | 
			
		||||
 | 
			
		||||
    # Find commands in the PATH
 | 
			
		||||
    puts
 | 
			
		||||
    puts "External commands"
 | 
			
		||||
    puts Formatter.columns(exts)
 | 
			
		||||
    ohai "External commands", Formatter.columns(exts)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def internal_commands
 | 
			
		||||
 | 
			
		||||
@ -16,12 +16,12 @@ module Homebrew
 | 
			
		||||
      EOS
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def config
 | 
			
		||||
    config_args.parse
 | 
			
		||||
    raise UsageError unless args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    SystemConfig.dump_verbose_config
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -67,16 +67,16 @@ module Homebrew
 | 
			
		||||
      if args.installed?
 | 
			
		||||
        puts_deps_tree Formula.installed.sort, recursive
 | 
			
		||||
      else
 | 
			
		||||
        raise FormulaUnspecifiedError if args.remaining.empty?
 | 
			
		||||
        raise FormulaUnspecifiedError if Homebrew.args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
        puts_deps_tree ARGV.formulae, recursive
 | 
			
		||||
        puts_deps_tree Homebrew.args.formulae, recursive
 | 
			
		||||
      end
 | 
			
		||||
      return
 | 
			
		||||
    elsif args.all?
 | 
			
		||||
      puts_deps Formula.sort, recursive
 | 
			
		||||
      return
 | 
			
		||||
    elsif !args.remaining.empty? && args.for_each?
 | 
			
		||||
      puts_deps ARGV.formulae, recursive
 | 
			
		||||
    elsif !Homebrew.args.remaining.empty? && args.for_each?
 | 
			
		||||
      puts_deps Homebrew.args.formulae, recursive
 | 
			
		||||
      return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -88,14 +88,14 @@ module Homebrew
 | 
			
		||||
                                !args.include_optional? &&
 | 
			
		||||
                                !args.skip_recommended?
 | 
			
		||||
 | 
			
		||||
    if args.remaining.empty?
 | 
			
		||||
    if Homebrew.args.remaining.empty?
 | 
			
		||||
      raise FormulaUnspecifiedError unless args.installed?
 | 
			
		||||
 | 
			
		||||
      puts_deps Formula.installed.sort, recursive
 | 
			
		||||
      return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    all_deps = deps_for_formulae(ARGV.formulae, recursive, &(args.union? ? :| : :&))
 | 
			
		||||
    all_deps = deps_for_formulae(Homebrew.args.formulae, recursive, &(args.union? ? :| : :&))
 | 
			
		||||
    all_deps = condense_requirements(all_deps)
 | 
			
		||||
    all_deps.select!(&:installed?) if args.installed?
 | 
			
		||||
    all_deps.map!(&method(:dep_display_name))
 | 
			
		||||
@ -175,13 +175,11 @@ module Homebrew
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def recursive_deps_tree(f, prefix, recursive)
 | 
			
		||||
    reqs = f.requirements
 | 
			
		||||
    deps = f.deps
 | 
			
		||||
    includes, ignores = argv_includes_ignores(ARGV)
 | 
			
		||||
    deps = reject_ignores(f.deps, ignores, includes)
 | 
			
		||||
    reqs = reject_ignores(f.requirements, ignores, includes)
 | 
			
		||||
    dependables = reqs + deps
 | 
			
		||||
    dependables.reject!(&:optional?) unless args.include_optional?
 | 
			
		||||
    dependables.reject!(&:build?) unless args.include_build?
 | 
			
		||||
    dependables.reject!(&:test?) unless args.include_test?
 | 
			
		||||
    dependables.reject!(&:recommended?) if args.skip_recommended?
 | 
			
		||||
 | 
			
		||||
    max = dependables.length - 1
 | 
			
		||||
    @dep_stack.push f.name
 | 
			
		||||
    dependables.each_with_index do |dep, i|
 | 
			
		||||
 | 
			
		||||
@ -40,17 +40,13 @@ module Homebrew
 | 
			
		||||
    search_type << :either if args.search
 | 
			
		||||
    search_type << :name   if args.name
 | 
			
		||||
    search_type << :desc   if args.description
 | 
			
		||||
    if search_type.size > 1
 | 
			
		||||
      odie "Pick one, and only one, of -s/--search, -n/--name, or -d/--description."
 | 
			
		||||
    elsif search_type.present? && ARGV.named.empty?
 | 
			
		||||
      odie "You must provide a search term."
 | 
			
		||||
    end
 | 
			
		||||
    odie "You must provide a search term." if search_type.present? && ARGV.named.empty?
 | 
			
		||||
 | 
			
		||||
    results = if search_type.empty?
 | 
			
		||||
      raise FormulaUnspecifiedError if ARGV.named.empty?
 | 
			
		||||
 | 
			
		||||
      desc = {}
 | 
			
		||||
      ARGV.formulae.each { |f| desc[f.full_name] = f.desc }
 | 
			
		||||
      Homebrew.args.formulae.each { |f| desc[f.full_name] = f.desc }
 | 
			
		||||
      Descriptions.new(desc)
 | 
			
		||||
    else
 | 
			
		||||
      arg = ARGV.named.join(" ")
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ module Homebrew
 | 
			
		||||
             description: "Explicitly set the <version> of the package being installed."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -47,7 +48,6 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
  def detect_version(path)
 | 
			
		||||
    version = path.version.to_s
 | 
			
		||||
 | 
			
		||||
    raise "Couldn't determine version, set it with --version=<version>" if version.empty?
 | 
			
		||||
 | 
			
		||||
    version
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,8 @@ module Homebrew
 | 
			
		||||
        an issue; just ignore this.
 | 
			
		||||
      EOS
 | 
			
		||||
      switch "--list-checks",
 | 
			
		||||
             description: "List all audit methods."
 | 
			
		||||
             description: "List all audit methods, which can be run individually "\
 | 
			
		||||
                          "if provided as arguments."
 | 
			
		||||
      switch "-D", "--audit-debug",
 | 
			
		||||
             description: "Enable debugging and profiling of audit methods."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
@ -50,7 +51,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    first_warning = true
 | 
			
		||||
    methods.each do |method|
 | 
			
		||||
      $stderr.puts "Checking #{method}" if args.debug?
 | 
			
		||||
      $stderr.puts Formatter.headline("Checking #{method}", color: :magenta) if args.debug?
 | 
			
		||||
      unless checks.respond_to?(method)
 | 
			
		||||
        Homebrew.failed = true
 | 
			
		||||
        puts "No check available by the name: #{method}"
 | 
			
		||||
 | 
			
		||||
@ -49,13 +49,13 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    if args.deps?
 | 
			
		||||
      bucket = []
 | 
			
		||||
      ARGV.formulae.each do |f|
 | 
			
		||||
      Homebrew.args.formulae.each do |f|
 | 
			
		||||
        bucket << f
 | 
			
		||||
        bucket.concat f.recursive_dependencies.map(&:to_formula)
 | 
			
		||||
      end
 | 
			
		||||
      bucket.uniq!
 | 
			
		||||
    else
 | 
			
		||||
      bucket = ARGV.formulae
 | 
			
		||||
      bucket = Homebrew.args.formulae
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    puts "Fetching: #{bucket * ", "}" if bucket.size > 1
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,7 @@ module Homebrew
 | 
			
		||||
                          "be accessible with its link."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ module Homebrew
 | 
			
		||||
    if args.remaining.empty?
 | 
			
		||||
      exec_browser HOMEBREW_WWW
 | 
			
		||||
    else
 | 
			
		||||
      exec_browser(*ARGV.formulae.map(&:homepage))
 | 
			
		||||
      exec_browser(*Homebrew.args.formulae.map(&:homepage))
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -61,33 +61,39 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
  def info
 | 
			
		||||
    info_args.parse
 | 
			
		||||
 | 
			
		||||
    if args.days.present?
 | 
			
		||||
      raise UsageError, "days must be one of #{VALID_DAYS.join(", ")}" unless VALID_DAYS.include?(args.days)
 | 
			
		||||
      raise UsageError, "--days must be one of #{VALID_DAYS.join(", ")}" unless VALID_DAYS.include?(args.days)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if args.category.present?
 | 
			
		||||
      if ARGV.named.present? && !VALID_FORMULA_CATEGORIES.include?(args.category)
 | 
			
		||||
        raise UsageError, "category must be one of #{VALID_FORMULA_CATEGORIES.join(", ")} when querying formulae"
 | 
			
		||||
      if Homebrew.args.named.present? && !VALID_FORMULA_CATEGORIES.include?(args.category)
 | 
			
		||||
        raise UsageError, "--category must be one of #{VALID_FORMULA_CATEGORIES.join(", ")} when querying formulae"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      unless VALID_CATEGORIES.include?(args.category)
 | 
			
		||||
        raise UsageError, "category must be one of #{VALID_CATEGORIES.join(", ")}"
 | 
			
		||||
        raise UsageError, "--category must be one of #{VALID_CATEGORIES.join(", ")}"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if args.json
 | 
			
		||||
      raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
 | 
			
		||||
      raise UsageError, "Invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
 | 
			
		||||
      if !(args.all? || args.installed?) && Homebrew.args.named.blank?
 | 
			
		||||
        raise UsageError, "This command's option requires a formula argument"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      print_json
 | 
			
		||||
    elsif args.github?
 | 
			
		||||
      exec_browser(*ARGV.formulae.map { |f| github_info(f) })
 | 
			
		||||
      raise UsageError, "This command's option requires a formula argument" if Homebrew.args.named.blank?
 | 
			
		||||
 | 
			
		||||
      exec_browser(*Homebrew.args.formulae.map { |f| github_info(f) })
 | 
			
		||||
    else
 | 
			
		||||
      print_info
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def print_info
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
    if Homebrew.args.named.blank?
 | 
			
		||||
      if args.analytics?
 | 
			
		||||
        Utils::Analytics.output
 | 
			
		||||
      elsif HOMEBREW_CELLAR.exist?
 | 
			
		||||
@ -95,7 +101,7 @@ module Homebrew
 | 
			
		||||
        puts "#{count} #{"keg".pluralize(count)}, #{HOMEBREW_CELLAR.dup.abv}"
 | 
			
		||||
      end
 | 
			
		||||
    else
 | 
			
		||||
      ARGV.named.each_with_index do |f, i|
 | 
			
		||||
      Homebrew.args.named.each_with_index do |f, i|
 | 
			
		||||
        puts unless i.zero?
 | 
			
		||||
        begin
 | 
			
		||||
          formula = if f.include?("/") || File.exist?(f)
 | 
			
		||||
@ -129,7 +135,7 @@ module Homebrew
 | 
			
		||||
    elsif args.installed?
 | 
			
		||||
      Formula.installed.sort
 | 
			
		||||
    else
 | 
			
		||||
      ARGV.formulae
 | 
			
		||||
      Homebrew.args.formulae
 | 
			
		||||
    end
 | 
			
		||||
    json = ff.map(&:to_hash)
 | 
			
		||||
    puts JSON.generate(json)
 | 
			
		||||
 | 
			
		||||
@ -92,7 +92,9 @@ module Homebrew
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def install
 | 
			
		||||
    ARGV.named.each do |name|
 | 
			
		||||
    install_args.parse
 | 
			
		||||
 | 
			
		||||
    Homebrew.args.named.each do |name|
 | 
			
		||||
      next if File.exist?(name)
 | 
			
		||||
      next if name !~ HOMEBREW_TAP_FORMULA_REGEX && name !~ HOMEBREW_CASK_TAP_CASK_REGEX
 | 
			
		||||
 | 
			
		||||
@ -100,7 +102,6 @@ module Homebrew
 | 
			
		||||
      tap.install unless tap.installed?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    install_args.parse
 | 
			
		||||
    raise FormulaUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    if args.ignore_dependencies?
 | 
			
		||||
@ -130,7 +131,7 @@ module Homebrew
 | 
			
		||||
    # developer tools are available, we need to stop them early on
 | 
			
		||||
    FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
 | 
			
		||||
 | 
			
		||||
    ARGV.formulae.each do |f|
 | 
			
		||||
    Homebrew.args.formulae.each do |f|
 | 
			
		||||
      # head-only without --HEAD is an error
 | 
			
		||||
      if !Homebrew.args.HEAD? && f.stable.nil? && f.devel.nil?
 | 
			
		||||
        raise <<~EOS
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ module Homebrew
 | 
			
		||||
        List installed formulae that are not dependencies of another installed formula.
 | 
			
		||||
      EOS
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -22,16 +23,8 @@ module Homebrew
 | 
			
		||||
    leaves_args.parse
 | 
			
		||||
 | 
			
		||||
    installed = Formula.installed.sort
 | 
			
		||||
 | 
			
		||||
    deps_of_installed = installed.flat_map do |f|
 | 
			
		||||
      f.runtime_dependencies.map do |dep|
 | 
			
		||||
        dep.to_formula.full_name
 | 
			
		||||
      rescue FormulaUnavailableError
 | 
			
		||||
        dep.name
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    leaves = installed.map(&:full_name) - deps_of_installed
 | 
			
		||||
    deps_of_installed = installed.flat_map(&:runtime_formula_dependencies)
 | 
			
		||||
    leaves = installed.map(&:full_name) - deps_of_installed.map(&:full_name)
 | 
			
		||||
    leaves.each(&method(:puts))
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,10 @@ module Homebrew
 | 
			
		||||
        else
 | 
			
		||||
          keg.name
 | 
			
		||||
        end
 | 
			
		||||
        puts "To relink: brew unlink #{keg.name} && brew link #{name_and_flag}"
 | 
			
		||||
        puts <<~EOS
 | 
			
		||||
          To relink:
 | 
			
		||||
            brew unlink #{keg.name} && brew link #{name_and_flag}
 | 
			
		||||
        EOS
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -55,14 +55,14 @@ module Homebrew
 | 
			
		||||
    # Unbrewed uses the PREFIX, which will exist
 | 
			
		||||
    # Things below use the CELLAR, which doesn't until the first formula is installed.
 | 
			
		||||
    unless HOMEBREW_CELLAR.exist?
 | 
			
		||||
      raise NoSuchKegError, ARGV.named.first unless ARGV.named.empty?
 | 
			
		||||
      raise NoSuchKegError, Hombrew.args.named.first if Homebrew.args.named.present?
 | 
			
		||||
 | 
			
		||||
      return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if args.pinned? || args.versions?
 | 
			
		||||
      filtered_list
 | 
			
		||||
    elsif ARGV.named.empty?
 | 
			
		||||
    elsif Homebrew.args.named.blank?
 | 
			
		||||
      if args.full_name?
 | 
			
		||||
        full_names = Formula.installed.map(&:full_name).sort(&tap_and_name_comparison)
 | 
			
		||||
        return if full_names.empty?
 | 
			
		||||
@ -123,10 +123,10 @@ module Homebrew
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def filtered_list
 | 
			
		||||
    names = if ARGV.named.empty?
 | 
			
		||||
    names = if Homebrew.args.named.blank?
 | 
			
		||||
      Formula.racks
 | 
			
		||||
    else
 | 
			
		||||
      racks = ARGV.named.map { |n| Formulary.to_rack(n) }
 | 
			
		||||
      racks = Homebrew.args.named.map { |n| Formulary.to_rack(n) }
 | 
			
		||||
      racks.select do |rack|
 | 
			
		||||
        Homebrew.failed = true unless rack.exist?
 | 
			
		||||
        rack.exist?
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@ module Homebrew
 | 
			
		||||
             description: "Print only one line per commit."
 | 
			
		||||
      flag   "-1", "--max-count",
 | 
			
		||||
             description: "Print only one or a specified number of commits."
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ module Homebrew
 | 
			
		||||
  def migrate
 | 
			
		||||
    migrate_args.parse
 | 
			
		||||
 | 
			
		||||
    raise FormulaUnspecifiedError if ARGV.named.empty?
 | 
			
		||||
    raise FormulaUnspecifiedError if Homebrew.args.named.blank?
 | 
			
		||||
 | 
			
		||||
    ARGV.resolved_formulae.each do |f|
 | 
			
		||||
      if f.oldname
 | 
			
		||||
 | 
			
		||||
@ -27,9 +27,10 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
  def missing
 | 
			
		||||
    missing_args.parse
 | 
			
		||||
 | 
			
		||||
    return unless HOMEBREW_CELLAR.exist?
 | 
			
		||||
 | 
			
		||||
    ff = if ARGV.named.empty?
 | 
			
		||||
    ff = if Homebrew.args.named.blank?
 | 
			
		||||
      Formula.installed.sort
 | 
			
		||||
    else
 | 
			
		||||
      ARGV.resolved_formulae.sort
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@ module Homebrew
 | 
			
		||||
    else
 | 
			
		||||
      raise FormulaUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
      puts_options ARGV.formulae
 | 
			
		||||
      puts_options Homebrew.args.formulae
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@ module Homebrew
 | 
			
		||||
  def outdated_args
 | 
			
		||||
    Homebrew::CLI::Parser.new do
 | 
			
		||||
      usage_banner <<~EOS
 | 
			
		||||
        `outdated` [<options>]
 | 
			
		||||
        `outdated` [<options>] [<formula>]
 | 
			
		||||
 | 
			
		||||
        List installed formulae that have an updated version available. By default, version
 | 
			
		||||
        information is displayed in interactive shells, and suppressed otherwise.
 | 
			
		||||
@ -41,7 +41,7 @@ module Homebrew
 | 
			
		||||
      ARGV.resolved_formulae
 | 
			
		||||
    end
 | 
			
		||||
    if args.json
 | 
			
		||||
      raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
 | 
			
		||||
      raise UsageError, "Invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
 | 
			
		||||
 | 
			
		||||
      outdated = print_outdated_json(formulae)
 | 
			
		||||
    else
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,8 @@ module Homebrew
 | 
			
		||||
  def postinstall
 | 
			
		||||
    postinstall_args.parse
 | 
			
		||||
 | 
			
		||||
    raise KegUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    ARGV.resolved_formulae.each do |f|
 | 
			
		||||
      ohai "Postinstalling #{f}"
 | 
			
		||||
      fi = FormulaInstaller.new(f)
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ module Homebrew
 | 
			
		||||
        Import all formulae from the specified <tap>, or from all installed taps if none is provided.
 | 
			
		||||
        This can be useful for debugging issues across all formulae when making
 | 
			
		||||
        significant changes to `formula.rb`, testing the performance of loading
 | 
			
		||||
        all formulae or to determine if any current formulae have Ruby issues.
 | 
			
		||||
        all formulae or checking if any current formulae have Ruby issues.
 | 
			
		||||
      EOS
 | 
			
		||||
      switch "--aliases",
 | 
			
		||||
             description: "Verify any alias symlinks in each tap."
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,8 @@ module Homebrew
 | 
			
		||||
  def reinstall
 | 
			
		||||
    reinstall_args.parse
 | 
			
		||||
 | 
			
		||||
    raise FormulaUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
 | 
			
		||||
 | 
			
		||||
    Install.perform_preinstall_checks
 | 
			
		||||
 | 
			
		||||
@ -22,11 +22,13 @@ module Homebrew
 | 
			
		||||
             description: "Use the standard `PATH` instead of superenv's when `std` is passed."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sh
 | 
			
		||||
    sh_args.parse
 | 
			
		||||
 | 
			
		||||
    ENV.activate_extensions!
 | 
			
		||||
 | 
			
		||||
    if superenv?
 | 
			
		||||
 | 
			
		||||
@ -38,14 +38,14 @@ module Homebrew
 | 
			
		||||
  def style
 | 
			
		||||
    style_args.parse
 | 
			
		||||
 | 
			
		||||
    target = if ARGV.named.empty?
 | 
			
		||||
    target = if Homebrew.args.named.blank?
 | 
			
		||||
      nil
 | 
			
		||||
    elsif ARGV.named.any? { |file| File.exist? file }
 | 
			
		||||
      ARGV.named
 | 
			
		||||
    elsif ARGV.named.any? { |tap| tap.count("/") == 1 }
 | 
			
		||||
      ARGV.named.map { |tap| Tap.fetch(tap).path }
 | 
			
		||||
    elsif Homebrew.args.named.any? { |file| File.exist? file }
 | 
			
		||||
      Homebrew.args.named
 | 
			
		||||
    elsif Homebrew.args.named.any? { |tap| tap.count("/") == 1 }
 | 
			
		||||
      Homebrew.args.named.map { |tap| Tap.fetch(tap).path }
 | 
			
		||||
    else
 | 
			
		||||
      ARGV.formulae.map(&:path)
 | 
			
		||||
      Homebrew.args.formulae.map(&:path)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    only_cops = args.only_cops
 | 
			
		||||
 | 
			
		||||
@ -14,46 +14,33 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
        Symlink all of the specified <version> of <formula>'s installation into Homebrew's prefix.
 | 
			
		||||
      EOS
 | 
			
		||||
      switch_option :verbose
 | 
			
		||||
      switch_option :debug
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 2
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def switch
 | 
			
		||||
    switch_args.parse
 | 
			
		||||
 | 
			
		||||
    raise FormulaUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    name = args.remaining.first
 | 
			
		||||
 | 
			
		||||
    usage = "Usage: brew switch <formula> <version>"
 | 
			
		||||
 | 
			
		||||
    unless name
 | 
			
		||||
      onoe usage
 | 
			
		||||
      exit 1
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    rack = Formulary.to_rack(name)
 | 
			
		||||
 | 
			
		||||
    unless rack.directory?
 | 
			
		||||
      onoe "#{name} not found in the Cellar."
 | 
			
		||||
      exit 2
 | 
			
		||||
    end
 | 
			
		||||
    odie "#{name} not found in the Cellar." unless rack.directory?
 | 
			
		||||
 | 
			
		||||
    versions = rack.subdirs
 | 
			
		||||
                   .map { |d| Keg.new(d).version }
 | 
			
		||||
                   .sort
 | 
			
		||||
                   .join(", ")
 | 
			
		||||
    version = args.remaining.second
 | 
			
		||||
    raise UsageError, "Specify one of #{name}'s installed versions: #{versions}" unless version
 | 
			
		||||
 | 
			
		||||
    if !version || args.remaining.length > 2
 | 
			
		||||
      onoe usage
 | 
			
		||||
      puts "#{name} installed versions: #{versions}"
 | 
			
		||||
      exit 1
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    unless (rack/version).directory?
 | 
			
		||||
      onoe "#{name} does not have a version \"#{version}\" in the Cellar."
 | 
			
		||||
      puts "#{name} installed versions: #{versions}"
 | 
			
		||||
      exit 3
 | 
			
		||||
    end
 | 
			
		||||
    odie <<~EOS unless (rack/version).directory?
 | 
			
		||||
      #{name} does not have a version \"#{version}\" in the Cellar.
 | 
			
		||||
      #{name}'s installed versions: #{versions}
 | 
			
		||||
    EOS
 | 
			
		||||
 | 
			
		||||
    # Unlink all existing versions
 | 
			
		||||
    rack.subdirs.each do |v|
 | 
			
		||||
 | 
			
		||||
@ -30,13 +30,13 @@ module Homebrew
 | 
			
		||||
    if args.installed?
 | 
			
		||||
      taps = Tap
 | 
			
		||||
    else
 | 
			
		||||
      taps = ARGV.named.sort.map do |name|
 | 
			
		||||
      taps = Homebrew.args.named.sort.map do |name|
 | 
			
		||||
        Tap.fetch(name)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if args.json
 | 
			
		||||
      raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
 | 
			
		||||
      raise UsageError, "Invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
 | 
			
		||||
 | 
			
		||||
      print_tap_json(taps.sort_by(&:to_s))
 | 
			
		||||
    else
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,7 @@ module Homebrew
 | 
			
		||||
      switch "-q", "--quieter",
 | 
			
		||||
             description: "Suppress any warnings."
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 2
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -79,7 +79,7 @@ module Homebrew
 | 
			
		||||
            if rack.directory?
 | 
			
		||||
              versions = rack.subdirs.map(&:basename)
 | 
			
		||||
              puts "#{keg.name} #{versions.to_sentence} #{"is".pluralize(versions.count)} still installed."
 | 
			
		||||
              puts "Remove all versions with `brew uninstall --force #{keg.name}`."
 | 
			
		||||
              puts "Run `brew uninstall --force #{keg.name}` to remove all versions."
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
@ -87,7 +87,7 @@ module Homebrew
 | 
			
		||||
    end
 | 
			
		||||
  rescue MultipleVersionsInstalledError => e
 | 
			
		||||
    ofail e
 | 
			
		||||
    puts "Use `brew uninstall --force #{e.name}` to remove all versions."
 | 
			
		||||
    puts "Run `brew uninstall --force #{e.name}` to remove all versions."
 | 
			
		||||
  ensure
 | 
			
		||||
    # If we delete Cellar/newname, then Cellar/oldname symlink
 | 
			
		||||
    # can become broken and we have to remove it.
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@ module Homebrew
 | 
			
		||||
  def unpack
 | 
			
		||||
    unpack_args.parse
 | 
			
		||||
 | 
			
		||||
    formulae = ARGV.formulae
 | 
			
		||||
    formulae = Homebrew.args.formulae
 | 
			
		||||
    raise FormulaUnspecifiedError if formulae.empty?
 | 
			
		||||
 | 
			
		||||
    if dir = args.destdir
 | 
			
		||||
 | 
			
		||||
@ -19,11 +19,11 @@ module Homebrew
 | 
			
		||||
  def untap
 | 
			
		||||
    untap_args.parse
 | 
			
		||||
 | 
			
		||||
    raise "Usage is `brew untap <tap-name>`" if args.remaining.empty?
 | 
			
		||||
    raise UsageError, "This command requires a tap argument from `brew tap`'s list" if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    ARGV.named.each do |tapname|
 | 
			
		||||
      tap = Tap.fetch(tapname)
 | 
			
		||||
      raise "untapping #{tap} is not allowed" if tap.core_tap?
 | 
			
		||||
      odie "Untapping #{tap} is not allowed" if tap.core_tap?
 | 
			
		||||
 | 
			
		||||
      tap.uninstall
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -306,7 +306,7 @@ homebrew-update() {
 | 
			
		||||
      *)
 | 
			
		||||
        odie <<EOS
 | 
			
		||||
This command updates brew itself, and does not take formula names.
 | 
			
		||||
Use 'brew upgrade $@' instead.
 | 
			
		||||
Use \`brew upgrade $@\` instead.
 | 
			
		||||
EOS
 | 
			
		||||
        ;;
 | 
			
		||||
    esac
 | 
			
		||||
@ -521,7 +521,7 @@ EOS
 | 
			
		||||
          if [[ "$UPSTREAM_SHA_HTTP_CODE" = "404" ]]
 | 
			
		||||
          then
 | 
			
		||||
            TAP="${DIR#$HOMEBREW_LIBRARY/Taps/}"
 | 
			
		||||
            echo "$TAP does not exist! Run 'brew untap $TAP'" >>"$update_failed_file"
 | 
			
		||||
            echo "$TAP does not exist! Run \`brew untap $TAP\` to remove it." >>"$update_failed_file"
 | 
			
		||||
          else
 | 
			
		||||
            echo "Fetching $DIR failed!" >>"$update_failed_file"
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
@ -61,7 +61,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    Install.perform_preinstall_checks
 | 
			
		||||
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
    if Homebrew.args.named.blank?
 | 
			
		||||
      outdated = Formula.installed.select do |f|
 | 
			
		||||
        f.outdated?(fetch_head: args.fetch_HEAD?)
 | 
			
		||||
      end
 | 
			
		||||
@ -170,7 +170,7 @@ module Homebrew
 | 
			
		||||
    fi = FormulaInstaller.new(f)
 | 
			
		||||
    fi.options = options
 | 
			
		||||
    fi.build_bottle = args.build_bottle?
 | 
			
		||||
    fi.installed_on_request = !ARGV.named.empty?
 | 
			
		||||
    fi.installed_on_request = Homebrew.args.named.present?
 | 
			
		||||
    fi.link_keg           ||= keg_was_linked if keg_had_linked_opt
 | 
			
		||||
    if tab
 | 
			
		||||
      fi.build_bottle          ||= tab.built_bottle?
 | 
			
		||||
@ -239,9 +239,9 @@ module Homebrew
 | 
			
		||||
    if pinned_dependents.present?
 | 
			
		||||
      plural = "dependent".pluralize(pinned_dependents.count)
 | 
			
		||||
      ohai "Not upgrading #{pinned_dependents.count} pinned #{plural}:"
 | 
			
		||||
      puts pinned_dependents.map do |f|
 | 
			
		||||
      puts(pinned_dependents.map do |f|
 | 
			
		||||
        "#{f.full_specified_name} #{f.pkg_version}"
 | 
			
		||||
      end.join(", ")
 | 
			
		||||
      end.join(", "))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Print the upgradable dependents.
 | 
			
		||||
@ -292,9 +292,9 @@ module Homebrew
 | 
			
		||||
      count = pinned_broken_dependents.count
 | 
			
		||||
      plural = "dependent".pluralize(pinned_broken_dependents.count)
 | 
			
		||||
      onoe "Not reinstalling #{count} broken and outdated, but pinned #{plural}:"
 | 
			
		||||
      $stderr.puts pinned_broken_dependents.map do |f|
 | 
			
		||||
      $stderr.puts(pinned_broken_dependents.map do |f|
 | 
			
		||||
        "#{f.full_specified_name} #{f.pkg_version}"
 | 
			
		||||
      end.join(", ")
 | 
			
		||||
      end.join(", "))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Print the broken dependents.
 | 
			
		||||
 | 
			
		||||
@ -50,12 +50,12 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    used_formulae_missing = false
 | 
			
		||||
    used_formulae = begin
 | 
			
		||||
      ARGV.formulae
 | 
			
		||||
      Homebrew.args.formulae
 | 
			
		||||
    rescue FormulaUnavailableError => e
 | 
			
		||||
      opoo e
 | 
			
		||||
      used_formulae_missing = true
 | 
			
		||||
      # If the formula doesn't exist: fake the needed formula object name.
 | 
			
		||||
      ARGV.named.map { |name| OpenStruct.new name: name, full_name: name }
 | 
			
		||||
      Homebrew.args.named.map { |name| OpenStruct.new name: name, full_name: name }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    use_runtime_dependents = args.installed? &&
 | 
			
		||||
 | 
			
		||||
@ -2,3 +2,4 @@
 | 
			
		||||
 | 
			
		||||
require "compat/cask/dsl/version"
 | 
			
		||||
require "compat/requirements/macos_requirement"
 | 
			
		||||
require "compat/formula"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								Library/Homebrew/compat/formula.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Library/Homebrew/compat/formula.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class Formula
 | 
			
		||||
  module Compat
 | 
			
		||||
    def installed?
 | 
			
		||||
      # odeprecated "Formula#installed?",
 | 
			
		||||
      #             "Formula#latest_version_installed? (or Formula#any_version_installed? )"
 | 
			
		||||
      latest_version_installed?
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  prepend Compat
 | 
			
		||||
end
 | 
			
		||||
@ -98,19 +98,21 @@ module Homebrew
 | 
			
		||||
    formula.send("recursive_#{type}") do |dependent, dep|
 | 
			
		||||
      if dep.recommended?
 | 
			
		||||
        klass.prune if ignores.include?("recommended?") || dependent.build.without?(dep)
 | 
			
		||||
      elsif dep.optional?
 | 
			
		||||
        klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep)
 | 
			
		||||
      elsif dep.test?
 | 
			
		||||
        if includes.include?("test?")
 | 
			
		||||
          Dependency.keep_but_prune_recursive_deps if type == :dependencies
 | 
			
		||||
        elsif dep.build?
 | 
			
		||||
          klass.prune unless includes.include?("build?")
 | 
			
		||||
        else
 | 
			
		||||
          klass.prune
 | 
			
		||||
        end
 | 
			
		||||
      elsif dep.optional?
 | 
			
		||||
        klass.prune if !includes.include?("optional?") && !dependent.build.with?(dep)
 | 
			
		||||
      elsif dep.build?
 | 
			
		||||
        klass.prune unless includes.include?("build?")
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      # If a tap isn't installed, we can't find the dependencies of one
 | 
			
		||||
      # If a tap isn't installed, we can't find the dependencies of one of
 | 
			
		||||
      # its formulae, and an exception will be thrown if we try.
 | 
			
		||||
      if type == :dependencies &&
 | 
			
		||||
         dep.is_a?(TapDependency) &&
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,9 @@ class Dependency
 | 
			
		||||
    formula
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  delegate installed?: :to_formula
 | 
			
		||||
  def installed?
 | 
			
		||||
    to_formula.latest_version_installed?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def satisfied?(inherited_options)
 | 
			
		||||
    installed? && missing_options(inherited_options).empty?
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,8 @@ module Homebrew
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      conflicts "--only", "--except"
 | 
			
		||||
      conflicts "--only-cops", "--except-cops"
 | 
			
		||||
      conflicts "--only-cops", "--except-cops", "--strict"
 | 
			
		||||
      conflicts "--only-cops", "--except-cops", "--only"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -78,7 +79,7 @@ module Homebrew
 | 
			
		||||
    ENV.activate_extensions!
 | 
			
		||||
    ENV.setup_build_environment
 | 
			
		||||
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
    if Homebrew.args.named.blank?
 | 
			
		||||
      ff = Formula
 | 
			
		||||
      files = Tap.map(&:formula_dir)
 | 
			
		||||
    else
 | 
			
		||||
@ -88,13 +89,6 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    only_cops = args.only_cops
 | 
			
		||||
    except_cops = args.except_cops
 | 
			
		||||
 | 
			
		||||
    if only_cops && except_cops
 | 
			
		||||
      odie "--only-cops and --except-cops cannot be used simultaneously!"
 | 
			
		||||
    elsif (only_cops || except_cops) && (strict || args.only)
 | 
			
		||||
      odie "--only-cops/--except-cops and --strict/--only cannot be used simultaneously!"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    options = { fix: args.fix? }
 | 
			
		||||
 | 
			
		||||
    if only_cops
 | 
			
		||||
@ -995,7 +989,6 @@ module Homebrew
 | 
			
		||||
    def audit
 | 
			
		||||
      only_audits = @only
 | 
			
		||||
      except_audits = @except
 | 
			
		||||
      odie "--only and --except cannot be used simultaneously!" if only_audits && except_audits
 | 
			
		||||
 | 
			
		||||
      methods.map(&:to_s).grep(/^audit_/).each do |audit_method_name|
 | 
			
		||||
        name = audit_method_name.gsub(/^audit_/, "")
 | 
			
		||||
 | 
			
		||||
@ -86,6 +86,7 @@ module Homebrew
 | 
			
		||||
    bottle_args.parse
 | 
			
		||||
 | 
			
		||||
    return merge if args.merge?
 | 
			
		||||
    raise KegUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    ensure_relocation_formulae_installed! unless args.skip_relocation?
 | 
			
		||||
    ARGV.resolved_formulae.each do |f|
 | 
			
		||||
@ -95,7 +96,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
  def ensure_relocation_formulae_installed!
 | 
			
		||||
    Keg.relocation_formulae.each do |f|
 | 
			
		||||
      next if Formula[f].installed?
 | 
			
		||||
      next if Formula[f].latest_version_installed?
 | 
			
		||||
 | 
			
		||||
      ohai "Installing #{f}..."
 | 
			
		||||
      safe_system HOMEBREW_BREW_FILE, "install", f
 | 
			
		||||
@ -172,7 +173,7 @@ module Homebrew
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      if text_matches.size > MAXIMUM_STRING_MATCHES
 | 
			
		||||
        puts "Only the first #{MAXIMUM_STRING_MATCHES} matches were output"
 | 
			
		||||
        puts "Only the first #{MAXIMUM_STRING_MATCHES} matches were output."
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@ -205,7 +206,7 @@ module Homebrew
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def bottle_formula(f)
 | 
			
		||||
    return ofail "Formula not installed or up-to-date: #{f.full_name}" unless f.installed?
 | 
			
		||||
    return ofail "Formula not installed or up-to-date: #{f.full_name}" unless f.latest_version_installed?
 | 
			
		||||
 | 
			
		||||
    unless tap = f.tap
 | 
			
		||||
      return ofail "Formula not from core or any installed taps: #{f.full_name}" unless args.force_core_tap?
 | 
			
		||||
@ -219,7 +220,7 @@ module Homebrew
 | 
			
		||||
      return
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    return ofail "Formula not installed with '--build-bottle': #{f.full_name}" unless Utils::Bottles.built_as? f
 | 
			
		||||
    return ofail "Formula was not installed with --build-bottle: #{f.full_name}" unless Utils::Bottles.built_as? f
 | 
			
		||||
 | 
			
		||||
    return ofail "Formula has no stable version: #{f.full_name}" unless f.stable
 | 
			
		||||
 | 
			
		||||
@ -426,8 +427,9 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
  def merge
 | 
			
		||||
    write = args.write?
 | 
			
		||||
    raise UsageError, "--merge requires a JSON file path argument" if Homebrew.args.named.blank?
 | 
			
		||||
 | 
			
		||||
    bottles_hash = ARGV.named.reduce({}) do |hash, json_file|
 | 
			
		||||
    bottles_hash = Homebrew.args.named.reduce({}) do |hash, json_file|
 | 
			
		||||
      hash.deep_merge(JSON.parse(IO.read(json_file)))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -65,6 +65,7 @@ module Homebrew
 | 
			
		||||
      switch :debug
 | 
			
		||||
      conflicts "--no-audit", "--strict"
 | 
			
		||||
      conflicts "--url", "--tag"
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -101,7 +102,7 @@ module Homebrew
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    [formula.tap.full_name, "origin/master", "-"]
 | 
			
		||||
    [formula.tap&.full_name, "origin/master", "-"]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def bump_formula_pr
 | 
			
		||||
@ -114,7 +115,7 @@ module Homebrew
 | 
			
		||||
    # Use the user's browser, too.
 | 
			
		||||
    ENV["BROWSER"] = ENV["HOMEBREW_BROWSER"]
 | 
			
		||||
 | 
			
		||||
    formula = ARGV.formulae.first
 | 
			
		||||
    formula = Homebrew.args.formulae.first
 | 
			
		||||
 | 
			
		||||
    if formula
 | 
			
		||||
      tap_full_name, origin_branch, previous_branch = use_correct_linux_tap(formula)
 | 
			
		||||
@ -504,6 +505,6 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    formula.path.atomic_write(backup_file)
 | 
			
		||||
    FileUtils.mv alias_rename.last, alias_rename.first if alias_rename.present?
 | 
			
		||||
    odie "brew audit failed!"
 | 
			
		||||
    odie "`brew audit` failed!"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@ module Homebrew
 | 
			
		||||
      switch :quiet
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -32,10 +33,10 @@ module Homebrew
 | 
			
		||||
    # user path, too.
 | 
			
		||||
    ENV["PATH"] = ENV["HOMEBREW_PATH"]
 | 
			
		||||
 | 
			
		||||
    raise FormulaUnspecifiedError if ARGV.formulae.empty?
 | 
			
		||||
    raise "Multiple formulae given, only one is allowed." if ARGV.formulae.length > 1
 | 
			
		||||
    formulae = Homebrew.args.formulae
 | 
			
		||||
    raise FormulaUnspecifiedError if formulae.empty?
 | 
			
		||||
 | 
			
		||||
    formula = ARGV.formulae.first
 | 
			
		||||
    formula = formulae.first
 | 
			
		||||
    current_revision = formula.revision
 | 
			
		||||
 | 
			
		||||
    if current_revision.zero?
 | 
			
		||||
 | 
			
		||||
@ -49,6 +49,7 @@ module Homebrew
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      conflicts "--autotools", "--cmake", "--go", "--meson", "--perl", "--python", "--rust"
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -121,7 +122,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    fc.generate!
 | 
			
		||||
 | 
			
		||||
    puts "Please `brew audit --new-formula #{fc.name}` before submitting, thanks."
 | 
			
		||||
    puts "Please run `brew audit --new-formula #{fc.name}` before submitting, thanks."
 | 
			
		||||
    exec_editor fc.path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -91,6 +91,7 @@ module Homebrew
 | 
			
		||||
             description: "Extract the specified <version> of <formula> instead of the most recent."
 | 
			
		||||
      switch :force
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 2
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -98,7 +99,7 @@ module Homebrew
 | 
			
		||||
    extract_args.parse
 | 
			
		||||
 | 
			
		||||
    # Expect exactly two named arguments: formula and tap
 | 
			
		||||
    raise UsageError if args.remaining.length != 2
 | 
			
		||||
    raise UsageError, "This command requires formula and tap arguments" if args.remaining.length != 2
 | 
			
		||||
 | 
			
		||||
    if args.remaining.first !~ HOMEBREW_TAP_FORMULA_REGEX
 | 
			
		||||
      name = args.remaining.first.downcase
 | 
			
		||||
@ -125,24 +126,34 @@ module Homebrew
 | 
			
		||||
    if args.version
 | 
			
		||||
      ohai "Searching repository history"
 | 
			
		||||
      version = args.version
 | 
			
		||||
      rev = "HEAD"
 | 
			
		||||
      version_segments = Gem::Version.new(version).segments if Gem::Version.correct?(version)
 | 
			
		||||
      rev = nil
 | 
			
		||||
      test_formula = nil
 | 
			
		||||
      result = ""
 | 
			
		||||
      loop do
 | 
			
		||||
        rev, (path,) = Git.last_revision_commit_of_files(repo, pattern, before_commit: "#{rev}~1")
 | 
			
		||||
        rev = rev.nil? ? "HEAD" : "#{rev}~1"
 | 
			
		||||
        rev, (path,) = Git.last_revision_commit_of_files(repo, pattern, before_commit: rev)
 | 
			
		||||
        odie "Could not find #{name}! The formula or version may not have existed." if rev.nil?
 | 
			
		||||
 | 
			
		||||
        file = repo/path
 | 
			
		||||
        result = Git.last_revision_of_file(repo, file, before_commit: rev)
 | 
			
		||||
        if result.empty?
 | 
			
		||||
          ohai "Skipping revision #{rev} - file is empty at this revision" if ARGV.debug?
 | 
			
		||||
          odebug "Skipping revision #{rev} - file is empty at this revision"
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        test_formula = formula_at_revision(repo, name, file, rev)
 | 
			
		||||
        break if test_formula.nil? || test_formula.version == version
 | 
			
		||||
 | 
			
		||||
        ohai "Trying #{test_formula.version} from revision #{rev} against desired #{version}" if ARGV.debug?
 | 
			
		||||
        if version_segments && Gem::Version.correct?(test_formula.version)
 | 
			
		||||
          test_formula_version_segments = Gem::Version.new(test_formula.version).segments
 | 
			
		||||
          if version_segments.length < test_formula_version_segments.length
 | 
			
		||||
            odebug "Apply semantic versioning with #{test_formual_version_segments}"
 | 
			
		||||
            break if version_segments == test_formula_version_segments.first(version_segments.length)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        odebug "Trying #{test_formula.version} from revision #{rev} against desired #{version}"
 | 
			
		||||
      end
 | 
			
		||||
      odie "Could not find #{name}! The formula or version may not have existed." if test_formula.nil?
 | 
			
		||||
    else
 | 
			
		||||
@ -181,7 +192,7 @@ module Homebrew
 | 
			
		||||
            brew extract --force --version=#{version} #{name} #{destination_tap.name}
 | 
			
		||||
        EOS
 | 
			
		||||
      end
 | 
			
		||||
      ohai "Overwriting existing formula at #{path}" if ARGV.debug?
 | 
			
		||||
      odebug "Overwriting existing formula at #{path}"
 | 
			
		||||
      path.delete
 | 
			
		||||
    end
 | 
			
		||||
    ohai "Writing formula for #{name} from revision #{rev} to #{path}"
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,7 @@ module Homebrew
 | 
			
		||||
  def formula
 | 
			
		||||
    formula_args.parse
 | 
			
		||||
 | 
			
		||||
    raise FormulaUnspecifiedError if ARGV.named.empty?
 | 
			
		||||
    raise FormulaUnspecifiedError if Homebrew.args.named.blank?
 | 
			
		||||
 | 
			
		||||
    ARGV.resolved_formulae.each { |f| puts f.path }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ module Homebrew
 | 
			
		||||
        Install Homebrew's Bundler gems.
 | 
			
		||||
      EOS
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ require "erb"
 | 
			
		||||
require "ostruct"
 | 
			
		||||
require "cli/parser"
 | 
			
		||||
# Require all commands
 | 
			
		||||
Dir.glob("#{HOMEBREW_LIBRARY_PATH}/{dev-,}cmd/*.rb").each { |cmd| require cmd }
 | 
			
		||||
Dir.glob("#{HOMEBREW_LIBRARY_PATH}/{dev-,}cmd/*.rb").sort.each { |cmd| require cmd }
 | 
			
		||||
 | 
			
		||||
module Homebrew
 | 
			
		||||
  module_function
 | 
			
		||||
@ -28,14 +28,13 @@ module Homebrew
 | 
			
		||||
                          "comparison without factoring in the date)."
 | 
			
		||||
      switch "--link",
 | 
			
		||||
             description: "This is now done automatically by `brew update`."
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def man
 | 
			
		||||
    man_args.parse
 | 
			
		||||
 | 
			
		||||
    raise UsageError unless ARGV.named.empty?
 | 
			
		||||
 | 
			
		||||
    odie "`brew man --link` is now done automatically by `brew update`." if args.link?
 | 
			
		||||
 | 
			
		||||
    regenerate_man_pages
 | 
			
		||||
 | 
			
		||||
@ -21,13 +21,13 @@ module Homebrew
 | 
			
		||||
  def mirror
 | 
			
		||||
    mirror_args.parse
 | 
			
		||||
 | 
			
		||||
    odie "This command requires at least one formula argument!" if ARGV.named.empty?
 | 
			
		||||
    raise FormulaUnspecifiedError if args.remaining.empty?
 | 
			
		||||
 | 
			
		||||
    bintray_user = ENV["HOMEBREW_BINTRAY_USER"]
 | 
			
		||||
    bintray_key = ENV["HOMEBREW_BINTRAY_KEY"]
 | 
			
		||||
    raise "Missing HOMEBREW_BINTRAY_USER or HOMEBREW_BINTRAY_KEY variables!" if !bintray_user || !bintray_key
 | 
			
		||||
 | 
			
		||||
    ARGV.formulae.each do |f|
 | 
			
		||||
    Homebrew.args.formulae.each do |f|
 | 
			
		||||
      bintray_package = Utils::Bottles::Bintray.package f.name
 | 
			
		||||
      bintray_repo_url = "https://api.bintray.com/packages/homebrew/mirror"
 | 
			
		||||
      package_url = "#{bintray_repo_url}/#{bintray_package}"
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,9 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    pull_args.parse
 | 
			
		||||
 | 
			
		||||
    odie "This command requires at least one argument containing a URL or pull request number" if ARGV.named.empty?
 | 
			
		||||
    if ARGV.named.empty?
 | 
			
		||||
      raise UsageError, "This command requires at least one argument containing a URL or pull request number"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Passthrough Git environment variables for e.g. git am
 | 
			
		||||
    ENV["GIT_COMMITTER_NAME"] = ENV["HOMEBREW_GIT_NAME"] if ENV["HOMEBREW_GIT_NAME"]
 | 
			
		||||
@ -107,7 +109,7 @@ module Homebrew
 | 
			
		||||
        end
 | 
			
		||||
        _, testing_job = *testing_match
 | 
			
		||||
        url = "https://github.com/Homebrew/homebrew-#{tap.repo}/compare/master...BrewTestBot:testing-#{testing_job}"
 | 
			
		||||
        odie "Testing URLs require `--bottle`!" unless args.bottle?
 | 
			
		||||
        odie "--bottle is required for testing job URLs!" unless args.bottle?
 | 
			
		||||
      elsif (api_match = arg.match HOMEBREW_PULL_API_REGEX)
 | 
			
		||||
        _, user, repo, issue = *api_match
 | 
			
		||||
        url = "https://github.com/#{user}/#{repo}/pull/#{issue}"
 | 
			
		||||
@ -277,7 +279,7 @@ module Homebrew
 | 
			
		||||
    elsif patch_changes[:formulae].length > 1
 | 
			
		||||
      odie "Can only bump one changed formula; bumped #{patch_changes[:formulae]}"
 | 
			
		||||
    elsif !patch_changes[:others].empty?
 | 
			
		||||
      odie "Can not bump if non-formula files are changed"
 | 
			
		||||
      odie "Cannot bump if non-formula files are changed"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,7 @@ module Homebrew
 | 
			
		||||
      EOS
 | 
			
		||||
      switch "--markdown",
 | 
			
		||||
             description: "Print as a Markdown list."
 | 
			
		||||
      max_named 2
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -15,13 +15,14 @@ module Homebrew
 | 
			
		||||
      EOS
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 1
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def tap_new
 | 
			
		||||
    tap_new_args.parse
 | 
			
		||||
 | 
			
		||||
    raise "A tap argument is required" if ARGV.named.empty?
 | 
			
		||||
    raise UsageError, "This command requires a tap argument" if ARGV.named.empty?
 | 
			
		||||
 | 
			
		||||
    tap = Tap.fetch(ARGV.named.first)
 | 
			
		||||
    titleized_user = tap.user.dup
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    ARGV.resolved_formulae.each do |f|
 | 
			
		||||
      # Cannot test uninstalled formulae
 | 
			
		||||
      unless f.installed?
 | 
			
		||||
      unless f.latest_version_installed?
 | 
			
		||||
        ofail "Testing requires the latest version of #{f.full_name}"
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,7 @@ module Homebrew
 | 
			
		||||
             description: "Randomise tests with the specified <value> instead of a random seed."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@ module Homebrew
 | 
			
		||||
             description: "Use the commit at the specified <date> as the start commit."
 | 
			
		||||
      switch :verbose
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -88,7 +89,7 @@ module Homebrew
 | 
			
		||||
    chdir "update-test" do
 | 
			
		||||
      curdir = Pathname.new(Dir.pwd)
 | 
			
		||||
 | 
			
		||||
      oh1 "Setup test environment..."
 | 
			
		||||
      oh1 "Preparing test environment..."
 | 
			
		||||
      # copy Homebrew installation
 | 
			
		||||
      safe_system "git", "clone", "#{HOMEBREW_REPOSITORY}/.git", ".",
 | 
			
		||||
                  "--branch", "master", "--single-branch"
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ module Homebrew
 | 
			
		||||
        Install and commit Homebrew's vendored gems.
 | 
			
		||||
      EOS
 | 
			
		||||
      switch :debug
 | 
			
		||||
      max_named 0
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -33,7 +34,7 @@ module Homebrew
 | 
			
		||||
      ohai "git add vendor/bundle"
 | 
			
		||||
      system "git", "add", "vendor/bundle"
 | 
			
		||||
 | 
			
		||||
      if Formula["gpg"].installed?
 | 
			
		||||
      if Formula["gpg"].optlinked?
 | 
			
		||||
        ENV["PATH"] = PATH.new(ENV["PATH"])
 | 
			
		||||
                          .prepend(Formula["gpg"].opt_bin)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -1122,7 +1122,7 @@ class DownloadStrategyDetector
 | 
			
		||||
    when :post                   then CurlPostDownloadStrategy
 | 
			
		||||
    when :fossil                 then FossilDownloadStrategy
 | 
			
		||||
    else
 | 
			
		||||
      raise "Unknown download strategy #{symbol} was requested."
 | 
			
		||||
      raise TypeError, "Unknown download strategy #{symbol} was requested."
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ class LinkageChecker
 | 
			
		||||
    libpthread.so.0
 | 
			
		||||
    libresolv.so.2
 | 
			
		||||
    librt.so.1
 | 
			
		||||
    libthread_db.so.1
 | 
			
		||||
    libutil.so.1
 | 
			
		||||
 | 
			
		||||
    libgcc_s.so.1
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ class OsxfuseRequirement < Requirement
 | 
			
		||||
  download "https://github.com/libfuse/libfuse"
 | 
			
		||||
 | 
			
		||||
  satisfy(build_env: false) do
 | 
			
		||||
    next true if libfuse_formula_exists? && Formula["libfuse"].installed?
 | 
			
		||||
    next true if libfuse_formula_exists? && Formula["libfuse"].latest_version_installed?
 | 
			
		||||
 | 
			
		||||
    includedirs = %w[
 | 
			
		||||
      /usr/include
 | 
			
		||||
 | 
			
		||||
@ -3,30 +3,8 @@
 | 
			
		||||
class SoftwareSpec
 | 
			
		||||
  undef uses_from_macos
 | 
			
		||||
 | 
			
		||||
  def uses_from_macos(deps, **args)
 | 
			
		||||
  def uses_from_macos(deps)
 | 
			
		||||
    @uses_from_macos_elements ||= []
 | 
			
		||||
 | 
			
		||||
    if deps.is_a?(Hash)
 | 
			
		||||
      args = deps
 | 
			
		||||
      deps = Hash[*args.shift]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if add_mac_dependency?(args)
 | 
			
		||||
      depends_on(deps)
 | 
			
		||||
    else
 | 
			
		||||
      @uses_from_macos_elements << deps
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def add_mac_dependency?(args)
 | 
			
		||||
    args.each { |key, version| args[key] = OS::Mac::Version.from_symbol(version) }
 | 
			
		||||
 | 
			
		||||
    return false if args[:after] && OS::Mac.version >= args[:after]
 | 
			
		||||
 | 
			
		||||
    return false if args[:before] && OS::Mac.version < args[:before]
 | 
			
		||||
 | 
			
		||||
    args.present?
 | 
			
		||||
    @uses_from_macos_elements << deps
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -41,10 +41,6 @@ class SystemConfig
 | 
			
		||||
      @clt ||= MacOS::CLT.version if MacOS::CLT.installed?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def clt_headers
 | 
			
		||||
      @clt_headers ||= MacOS::CLT.headers_version if MacOS::CLT.headers_installed?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def xquartz
 | 
			
		||||
      @xquartz ||= "#{MacOS::XQuartz.version} => #{describe_path(MacOS::XQuartz.prefix)}" if MacOS::XQuartz.installed?
 | 
			
		||||
    end
 | 
			
		||||
@ -54,7 +50,6 @@ class SystemConfig
 | 
			
		||||
      f.puts "macOS: #{MacOS.full_version}-#{kernel}"
 | 
			
		||||
      f.puts "CLT: #{clt || "N/A"}"
 | 
			
		||||
      f.puts "Xcode: #{xcode || "N/A"}"
 | 
			
		||||
      f.puts "CLT headers: #{clt_headers}" if MacOS::CLT.separate_header_package? && clt_headers
 | 
			
		||||
      f.puts "XQuartz: #{xquartz}" if xquartz
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -463,7 +463,7 @@ class Formula
 | 
			
		||||
  # This is actually just a check for if the {#installed_prefix} directory
 | 
			
		||||
  # exists and is not empty.
 | 
			
		||||
  # @private
 | 
			
		||||
  def installed?
 | 
			
		||||
  def latest_version_installed?
 | 
			
		||||
    (dir = installed_prefix).directory? && !dir.children.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -1211,7 +1211,7 @@ class Formula
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def new_formula_available?
 | 
			
		||||
    installed_alias_target_changed? && !latest_formula.installed?
 | 
			
		||||
    installed_alias_target_changed? && !latest_formula.latest_version_installed?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def current_installed_alias_target
 | 
			
		||||
@ -1546,8 +1546,13 @@ class Formula
 | 
			
		||||
        Dependency.new full_name
 | 
			
		||||
      end.compact
 | 
			
		||||
    end
 | 
			
		||||
    deps ||= declared_runtime_dependencies unless undeclared
 | 
			
		||||
    deps ||= (declared_runtime_dependencies | undeclared_runtime_dependencies)
 | 
			
		||||
    begin
 | 
			
		||||
      deps ||= declared_runtime_dependencies unless undeclared
 | 
			
		||||
      deps ||= (declared_runtime_dependencies | undeclared_runtime_dependencies)
 | 
			
		||||
    rescue FormulaUnavailableError
 | 
			
		||||
      onoe "could not get runtime dependencies from #{path}!"
 | 
			
		||||
      deps ||= []
 | 
			
		||||
    end
 | 
			
		||||
    deps
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -1932,7 +1937,7 @@ class Formula
 | 
			
		||||
  # @private
 | 
			
		||||
  def eligible_kegs_for_cleanup(quiet: false)
 | 
			
		||||
    eligible_for_cleanup = []
 | 
			
		||||
    if installed?
 | 
			
		||||
    if latest_version_installed?
 | 
			
		||||
      eligible_kegs = if head? && (head_prefix = latest_head_prefix)
 | 
			
		||||
        installed_kegs - [Keg.new(head_prefix)]
 | 
			
		||||
      else
 | 
			
		||||
@ -2370,8 +2375,8 @@ class Formula
 | 
			
		||||
      specs.each { |spec| spec.depends_on(dep) }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def uses_from_macos(dep, **args)
 | 
			
		||||
      specs.each { |spec| spec.uses_from_macos(dep, args) }
 | 
			
		||||
    def uses_from_macos(dep)
 | 
			
		||||
      specs.each { |spec| spec.uses_from_macos(dep) }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # @!attribute [w] option
 | 
			
		||||
 | 
			
		||||
@ -100,7 +100,7 @@ module FormulaCellarChecks
 | 
			
		||||
  def check_generic_executables(bin)
 | 
			
		||||
    return unless bin.directory?
 | 
			
		||||
 | 
			
		||||
    generic_names = %w[run service start stop]
 | 
			
		||||
    generic_names = %w[service start stop]
 | 
			
		||||
    generics = bin.children.select { |g| generic_names.include? g.basename.to_s }
 | 
			
		||||
    return if generics.empty?
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -343,7 +343,7 @@ class FormulaInstaller
 | 
			
		||||
 | 
			
		||||
    build_bottle_postinstall if build_bottle?
 | 
			
		||||
 | 
			
		||||
    opoo "Nothing was installed to #{formula.prefix}" unless formula.installed?
 | 
			
		||||
    opoo "Nothing was installed to #{formula.prefix}" unless formula.latest_version_installed?
 | 
			
		||||
    end_time = Time.now
 | 
			
		||||
    Homebrew.messages.formula_installed(formula, end_time - start_time)
 | 
			
		||||
  end
 | 
			
		||||
@ -598,6 +598,10 @@ class FormulaInstaller
 | 
			
		||||
    oh1 "Installing #{formula.full_name} dependency: #{Formatter.identifier(dep.name)}"
 | 
			
		||||
    fi.install
 | 
			
		||||
    fi.finish
 | 
			
		||||
  rescue FormulaInstallationAlreadyAttemptedError
 | 
			
		||||
    # We already attempted to install f as part of the dependency tree of
 | 
			
		||||
    # another formula. In that case, don't generate an error, just move on.
 | 
			
		||||
    nil
 | 
			
		||||
  rescue Exception # rubocop:disable Lint/RescueException
 | 
			
		||||
    ignore_interrupts do
 | 
			
		||||
      tmp_keg.rename(installed_keg) if tmp_keg && !installed_keg.directory?
 | 
			
		||||
@ -910,13 +914,7 @@ class FormulaInstaller
 | 
			
		||||
      --
 | 
			
		||||
      #{HOMEBREW_LIBRARY_PATH}/postinstall.rb
 | 
			
		||||
      #{formula.path}
 | 
			
		||||
    ].concat(ARGV.options_only) - ["--HEAD", "--devel"]
 | 
			
		||||
 | 
			
		||||
    if formula.head?
 | 
			
		||||
      args << "--HEAD"
 | 
			
		||||
    elsif formula.devel?
 | 
			
		||||
      args << "--devel"
 | 
			
		||||
    end
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    Utils.safe_fork do
 | 
			
		||||
      if Sandbox.formula?(formula)
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,7 @@ class FormulaVersions
 | 
			
		||||
  rescue *IGNORED_EXCEPTIONS => e
 | 
			
		||||
    # We rescue these so that we can skip bad versions and
 | 
			
		||||
    # continue walking the history
 | 
			
		||||
    ohai "#{e} in #{name} at revision #{rev}", e.backtrace if ARGV.debug?
 | 
			
		||||
    odebug "#{e} in #{name} at revision #{rev}", e.backtrace if ARGV.debug?
 | 
			
		||||
  rescue FormulaUnavailableError
 | 
			
		||||
    nil
 | 
			
		||||
  ensure
 | 
			
		||||
 | 
			
		||||
@ -153,7 +153,8 @@ module Language
 | 
			
		||||
      def virtualenv_install_with_resources(options = {})
 | 
			
		||||
        python = options[:using]
 | 
			
		||||
        if python.nil?
 | 
			
		||||
          wanted = %w[python python@2 python2 python3 python@3 pypy pypy3].select { |py| needs_python?(py) }
 | 
			
		||||
          pythons = %w[python python@2 python2 python3 python@3 python@3.8 pypy pypy3]
 | 
			
		||||
          wanted = pythons.select { |py| needs_python?(py) }
 | 
			
		||||
          raise FormulaAmbiguousPythonError, self if wanted.size > 1
 | 
			
		||||
 | 
			
		||||
          python = wanted.first || "python2.7"
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@
 | 
			
		||||
#
 | 
			
		||||
# When done, regenerate the man page and its HTML version by running `brew man`.
 | 
			
		||||
%>
 | 
			
		||||
brew(1) -- The missing package manager for macOS
 | 
			
		||||
brew(1) -- The Missing Package Manager for macOS
 | 
			
		||||
================================================
 | 
			
		||||
 | 
			
		||||
## SYNOPSIS
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ class Keg
 | 
			
		||||
    return if file.dylib_id == id
 | 
			
		||||
 | 
			
		||||
    @require_relocation = true
 | 
			
		||||
    puts "Changing dylib ID of #{file}\n  from #{file.dylib_id}\n    to #{id}" if ARGV.debug?
 | 
			
		||||
    odebug "Changing dylib ID of #{file}\n  from #{file.dylib_id}\n    to #{id}" if ARGV.debug?
 | 
			
		||||
    MachO::Tools.change_dylib_id(file, id, strict: false)
 | 
			
		||||
  rescue MachO::MachOError
 | 
			
		||||
    onoe <<~EOS
 | 
			
		||||
@ -20,7 +20,7 @@ class Keg
 | 
			
		||||
    return if old == new
 | 
			
		||||
 | 
			
		||||
    @require_relocation = true
 | 
			
		||||
    puts "Changing install name in #{file}\n  from #{old}\n    to #{new}" if ARGV.debug?
 | 
			
		||||
    odebug "Changing install name in #{file}\n  from #{old}\n    to #{new}" if ARGV.debug?
 | 
			
		||||
    MachO::Tools.change_install_name(file, old, new, strict: false)
 | 
			
		||||
  rescue MachO::MachOError
 | 
			
		||||
    onoe <<~EOS
 | 
			
		||||
 | 
			
		||||
@ -16,13 +16,13 @@ module OS
 | 
			
		||||
        when "10.11" then "8.2.1"
 | 
			
		||||
        when "10.12" then "9.2"
 | 
			
		||||
        when "10.13" then "10.1"
 | 
			
		||||
        when "10.14" then "10.2.1"
 | 
			
		||||
        when "10.15" then "11.2.1"
 | 
			
		||||
        when "10.14" then "11.3"
 | 
			
		||||
        when "10.15" then "11.3"
 | 
			
		||||
        else
 | 
			
		||||
          raise "macOS '#{MacOS.version}' is invalid" unless OS::Mac.prerelease?
 | 
			
		||||
 | 
			
		||||
          # Default to newest known version of Xcode for unreleased macOS versions.
 | 
			
		||||
          "11.2.1"
 | 
			
		||||
          "11.3"
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -176,8 +176,8 @@ module OS
 | 
			
		||||
        when 90      then "9.2"
 | 
			
		||||
        when 91      then "9.4"
 | 
			
		||||
        when 100     then "10.2.1"
 | 
			
		||||
        when 110     then "11.2.1"
 | 
			
		||||
        else              "11.2.1"
 | 
			
		||||
        when 110     then "11.3"
 | 
			
		||||
        else              "11.3"
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@ -193,9 +193,6 @@ module OS
 | 
			
		||||
      EXECUTABLE_PKG_ID = "com.apple.pkg.CLTools_Executables"
 | 
			
		||||
      MAVERICKS_NEW_PKG_ID = "com.apple.pkg.CLTools_Base" # obsolete
 | 
			
		||||
      PKG_PATH = "/Library/Developer/CommandLineTools"
 | 
			
		||||
      HEADER_PKG_PATH =
 | 
			
		||||
        "/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_:macos_version.pkg"
 | 
			
		||||
      HEADER_PKG_ID = "com.apple.pkg.macOS_SDK_headers_for_macOS_10.14"
 | 
			
		||||
 | 
			
		||||
      # Returns true even if outdated tools are installed
 | 
			
		||||
      def installed?
 | 
			
		||||
@ -210,14 +207,6 @@ module OS
 | 
			
		||||
        version >= "8"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def headers_installed?
 | 
			
		||||
        if !separate_header_package?
 | 
			
		||||
          installed?
 | 
			
		||||
        else
 | 
			
		||||
          headers_version == version
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def sdk(v = nil)
 | 
			
		||||
        @locator ||= CLTSDKLocator.new
 | 
			
		||||
 | 
			
		||||
@ -236,18 +225,18 @@ module OS
 | 
			
		||||
          EOS
 | 
			
		||||
        else
 | 
			
		||||
          <<~EOS
 | 
			
		||||
            Update them from Software Update in the App Store
 | 
			
		||||
            Update them from Software Update in the App Store or
 | 
			
		||||
            #{Formatter.url("https://developer.apple.com/download/more/")}.
 | 
			
		||||
          EOS
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def latest_version
 | 
			
		||||
      def latest_clang_version
 | 
			
		||||
        # As of Xcode 8 CLT releases are no longer in sync with Xcode releases
 | 
			
		||||
        # on the older supported platform for that Xcode release, i.e there's no
 | 
			
		||||
        # CLT package for 10.11 that contains the Clang version from Xcode 8.
 | 
			
		||||
        case MacOS.version
 | 
			
		||||
        when "10.15" then "1100.0.33.12"
 | 
			
		||||
        when "10.15" then "1100.0.33.16"
 | 
			
		||||
        when "10.14" then "1001.0.46.4"
 | 
			
		||||
        when "10.13" then "1000.10.44.2"
 | 
			
		||||
        when "10.12" then "900.0.39.2"
 | 
			
		||||
@ -277,7 +266,7 @@ module OS
 | 
			
		||||
        clang_version = detect_clang_version
 | 
			
		||||
        return false unless clang_version
 | 
			
		||||
 | 
			
		||||
        ::Version.new(clang_version) < latest_version
 | 
			
		||||
        ::Version.new(clang_version) < latest_clang_version
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def detect_clang_version
 | 
			
		||||
@ -291,6 +280,10 @@ module OS
 | 
			
		||||
        version_output[/clang-(\d+\.\d+\.\d+(\.\d+)?)/, 1]
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def detect_version_from_clang_version
 | 
			
		||||
        detect_clang_version&.sub(/^(\d+)00\./, "\\1.")
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      # Version string (a pretty long one) of the CLT package.
 | 
			
		||||
      # Note, that different ways to install the CLTs lead to different
 | 
			
		||||
      # version numbers.
 | 
			
		||||
@ -302,19 +295,6 @@ module OS
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      # Version string of the header package, which is a
 | 
			
		||||
      # separate package as of macOS 10.14.
 | 
			
		||||
      def headers_version
 | 
			
		||||
        if !separate_header_package?
 | 
			
		||||
          version
 | 
			
		||||
        else
 | 
			
		||||
          @header_version ||= MacOS.pkgutil_info(HEADER_PKG_ID)[/version: (.+)$/, 1]
 | 
			
		||||
          return ::Version::NULL unless @header_version
 | 
			
		||||
 | 
			
		||||
          ::Version.new(@header_version)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def detect_version
 | 
			
		||||
        version = nil
 | 
			
		||||
        [EXECUTABLE_PKG_ID, MAVERICKS_NEW_PKG_ID].each do |id|
 | 
			
		||||
@ -324,7 +304,7 @@ module OS
 | 
			
		||||
          return version if version
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        detect_clang_version
 | 
			
		||||
        detect_version_from_clang_version
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -6,15 +6,24 @@ require "global"
 | 
			
		||||
require "debrew"
 | 
			
		||||
require "fcntl"
 | 
			
		||||
require "socket"
 | 
			
		||||
require "cli/parser"
 | 
			
		||||
 | 
			
		||||
def postinstall_args
 | 
			
		||||
  Homebrew::CLI::Parser.new do
 | 
			
		||||
    switch :force
 | 
			
		||||
    switch :verbose
 | 
			
		||||
    switch :debug
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  postinstall_args.parse
 | 
			
		||||
  error_pipe = UNIXSocket.open(ENV["HOMEBREW_ERROR_PIPE"], &:recv_io)
 | 
			
		||||
  error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
 | 
			
		||||
 | 
			
		||||
  trap("INT", old_trap)
 | 
			
		||||
 | 
			
		||||
  formula = ARGV.resolved_formulae.first
 | 
			
		||||
  formula.extend(Debrew::Formula) if ARGV.debug?
 | 
			
		||||
  formula = Homebrew.args.resolved_formulae.first
 | 
			
		||||
  formula.run_post_install
 | 
			
		||||
rescue Exception => e # rubocop:disable Lint/RescueException
 | 
			
		||||
  error_pipe.puts e.to_json
 | 
			
		||||
 | 
			
		||||
@ -132,7 +132,7 @@ class Resource
 | 
			
		||||
    end
 | 
			
		||||
  rescue ChecksumMissingError
 | 
			
		||||
    opoo "Cannot verify integrity of #{fn.basename}"
 | 
			
		||||
    puts "A checksum was not provided for this resource"
 | 
			
		||||
    puts "A checksum was not provided for this resource."
 | 
			
		||||
    puts "For your reference the SHA-256 is: #{fn.sha256}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -171,10 +171,8 @@ class SoftwareSpec
 | 
			
		||||
    add_dep_option(dep) if dep
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def uses_from_macos(deps, **_args)
 | 
			
		||||
    deps = Hash[*deps.shift] if deps.is_a?(Hash)
 | 
			
		||||
 | 
			
		||||
    depends_on(deps)
 | 
			
		||||
  def uses_from_macos(spec)
 | 
			
		||||
    depends_on(spec)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def deps
 | 
			
		||||
 | 
			
		||||
@ -85,50 +85,50 @@ describe Cask::DSL::Version, :cask do
 | 
			
		||||
  describe "string manipulation helpers" do
 | 
			
		||||
    describe "#major" do
 | 
			
		||||
      include_examples "version expectations hash", :major,
 | 
			
		||||
                       "1"         => "1",
 | 
			
		||||
                       "1.2"       => "1",
 | 
			
		||||
                       "1.2.3"     => "1",
 | 
			
		||||
                       "1.2.3_4-5" => "1"
 | 
			
		||||
                       "1"           => "1",
 | 
			
		||||
                       "1.2"         => "1",
 | 
			
		||||
                       "1.2.3"       => "1",
 | 
			
		||||
                       "1.2.3-4,5:6" => "1"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe "#minor" do
 | 
			
		||||
      include_examples "version expectations hash", :minor,
 | 
			
		||||
                       "1"         => "",
 | 
			
		||||
                       "1.2"       => "2",
 | 
			
		||||
                       "1.2.3"     => "2",
 | 
			
		||||
                       "1.2.3_4-5" => "2"
 | 
			
		||||
                       "1"           => "",
 | 
			
		||||
                       "1.2"         => "2",
 | 
			
		||||
                       "1.2.3"       => "2",
 | 
			
		||||
                       "1.2.3-4,5:6" => "2"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe "#patch" do
 | 
			
		||||
      include_examples "version expectations hash", :patch,
 | 
			
		||||
                       "1"         => "",
 | 
			
		||||
                       "1.2"       => "",
 | 
			
		||||
                       "1.2.3"     => "3",
 | 
			
		||||
                       "1.2.3_4-5" => "3"
 | 
			
		||||
                       "1"           => "",
 | 
			
		||||
                       "1.2"         => "",
 | 
			
		||||
                       "1.2.3"       => "3",
 | 
			
		||||
                       "1.2.3-4,5:6" => "3-4"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe "#major_minor" do
 | 
			
		||||
      include_examples "version expectations hash", :major_minor,
 | 
			
		||||
                       "1"         => "1",
 | 
			
		||||
                       "1.2"       => "1.2",
 | 
			
		||||
                       "1.2.3"     => "1.2",
 | 
			
		||||
                       "1.2.3_4-5" => "1.2"
 | 
			
		||||
                       "1"           => "1",
 | 
			
		||||
                       "1.2"         => "1.2",
 | 
			
		||||
                       "1.2.3"       => "1.2",
 | 
			
		||||
                       "1.2.3-4,5:6" => "1.2"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe "#major_minor_patch" do
 | 
			
		||||
      include_examples "version expectations hash", :major_minor_patch,
 | 
			
		||||
                       "1"         => "1",
 | 
			
		||||
                       "1.2"       => "1.2",
 | 
			
		||||
                       "1.2.3"     => "1.2.3",
 | 
			
		||||
                       "1.2.3_4-5" => "1.2.3"
 | 
			
		||||
                       "1"           => "1",
 | 
			
		||||
                       "1.2"         => "1.2",
 | 
			
		||||
                       "1.2.3"       => "1.2.3",
 | 
			
		||||
                       "1.2.3-4,5:6" => "1.2.3-4"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe "#minor_patch" do
 | 
			
		||||
      include_examples "version expectations hash", :minor_patch,
 | 
			
		||||
                       "1"         => "",
 | 
			
		||||
                       "1.2"       => "2",
 | 
			
		||||
                       "1.2.3"     => "2.3",
 | 
			
		||||
                       "1.2.3_4-5" => "2.3"
 | 
			
		||||
                       "1"           => "",
 | 
			
		||||
                       "1.2"         => "2",
 | 
			
		||||
                       "1.2.3"       => "2.3",
 | 
			
		||||
                       "1.2.3-4,5:6" => "2.3-4"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe "#before_comma" do
 | 
			
		||||
 | 
			
		||||
@ -124,17 +124,17 @@ describe Homebrew::Cleanup do
 | 
			
		||||
      Tab.create(f, DevelopmentTools.default_compiler, :libcxx).write
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expect(f1).to be_installed
 | 
			
		||||
    expect(f2).to be_installed
 | 
			
		||||
    expect(f3).to be_installed
 | 
			
		||||
    expect(f4).to be_installed
 | 
			
		||||
    expect(f1).to be_latest_version_installed
 | 
			
		||||
    expect(f2).to be_latest_version_installed
 | 
			
		||||
    expect(f3).to be_latest_version_installed
 | 
			
		||||
    expect(f4).to be_latest_version_installed
 | 
			
		||||
 | 
			
		||||
    subject.cleanup_formula f3
 | 
			
		||||
 | 
			
		||||
    expect(f1).not_to be_installed
 | 
			
		||||
    expect(f2).not_to be_installed
 | 
			
		||||
    expect(f3).to be_installed
 | 
			
		||||
    expect(f4).to be_installed
 | 
			
		||||
    expect(f1).not_to be_latest_version_installed
 | 
			
		||||
    expect(f2).not_to be_latest_version_installed
 | 
			
		||||
    expect(f3).to be_latest_version_installed
 | 
			
		||||
    expect(f4).to be_latest_version_installed
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe "#cleanup_cask", :cask do
 | 
			
		||||
 | 
			
		||||
@ -236,6 +236,21 @@ describe Homebrew::CLI::Parser do
 | 
			
		||||
      expect(Homebrew.args.passthrough).to eq %w[--foo --bar=value -s]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "#formulae raises an error when a Formula is unavailable" do
 | 
			
		||||
      parser.parse(["mxcl"])
 | 
			
		||||
      expect { Homebrew.args.formulae }.to raise_error FormulaUnavailableError
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "#formulae returns an empty array when there are no Formulae" do
 | 
			
		||||
      parser.parse([])
 | 
			
		||||
      expect(Homebrew.args.formulae).to be_empty
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "#casks returns an empty array when there are no matching casks" do
 | 
			
		||||
      parser.parse([])
 | 
			
		||||
      expect(Homebrew.args.casks).to eq []
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context "kegs" do
 | 
			
		||||
      before do
 | 
			
		||||
        keg = HOMEBREW_CELLAR + "mxcl/10.0"
 | 
			
		||||
@ -252,5 +267,15 @@ describe Homebrew::CLI::Parser do
 | 
			
		||||
        expect(Homebrew.args.kegs).to be_empty
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "#named returns an array of non-option arguments" do
 | 
			
		||||
      parser.parse(["foo", "-v", "-s"])
 | 
			
		||||
      expect(Homebrew.args.named).to eq ["foo"]
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "#named returns an empty array when there are no named arguments" do
 | 
			
		||||
      parser.parse([])
 | 
			
		||||
      expect(Homebrew.args.named).to be_empty
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ describe "Homebrew.extract_args" do
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
describe "brew extract", :integration_test do
 | 
			
		||||
  it "retrieves the specified version of formula, defaulting to most recent" do
 | 
			
		||||
  let!(:target) do
 | 
			
		||||
    path = Tap::TAP_DIRECTORY/"homebrew/homebrew-foo"
 | 
			
		||||
    (path/"Formula").mkpath
 | 
			
		||||
    target = Tap.from_path(path)
 | 
			
		||||
@ -23,12 +23,27 @@ describe "brew extract", :integration_test do
 | 
			
		||||
      system "git", "add", "--all"
 | 
			
		||||
      system "git", "commit", "-m", "testball 0.2"
 | 
			
		||||
    end
 | 
			
		||||
    { name: target.name, path: path }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
    expect { brew "extract", "testball", target.name, "--version=0.1" }
 | 
			
		||||
  it "retrieves the most recent version of formula" do
 | 
			
		||||
    expect { brew "extract", "testball", target[:name] }
 | 
			
		||||
      .to be_a_success
 | 
			
		||||
    expect(target[:path]/"Formula/testball@0.2.rb").to exist
 | 
			
		||||
    expect(Formulary.factory(target[:path]/"Formula/testball@0.2.rb").version).to be == "0.2"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
    expect(path/"Formula/testball@0.1.rb").to exist
 | 
			
		||||
  it "retrieves the specified version of formula" do
 | 
			
		||||
    expect { brew "extract", "testball", target[:name], "--version=0.1" }
 | 
			
		||||
      .to be_a_success
 | 
			
		||||
    expect(target[:path]/"Formula/testball@0.1.rb").to exist
 | 
			
		||||
    expect(Formulary.factory(target[:path]/"Formula/testball@0.1.rb").version).to be == "0.1"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
    expect(Formulary.factory(path/"Formula/testball@0.1.rb").version).to be == "0.1"
 | 
			
		||||
  it "retrieves the compatible version of formula" do
 | 
			
		||||
    expect { brew "extract", "testball", target[:name], "--version=0", "--debug" }
 | 
			
		||||
      .to be_a_success
 | 
			
		||||
    expect(target[:path]/"Formula/testball@0.rb").to exist
 | 
			
		||||
    expect(Formulary.factory(target[:path]/"Formula/testball@0.rb").version).to be == "0.2"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,8 @@ describe "Homebrew.test_args" do
 | 
			
		||||
  it_behaves_like "parseable arguments"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
describe "brew test", :integration_test do
 | 
			
		||||
# randomly segfaults on Linux with portable-ruby.
 | 
			
		||||
describe "brew test", :integration_test, :needs_macos do
 | 
			
		||||
  it "tests a given Formula" do
 | 
			
		||||
    install_test_formula "testball", <<~'RUBY'
 | 
			
		||||
      test do
 | 
			
		||||
 | 
			
		||||
@ -15,19 +15,19 @@ describe FormulaInstaller do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def temporarily_install_bottle(formula)
 | 
			
		||||
    expect(formula).not_to be_installed
 | 
			
		||||
    expect(formula).not_to be_latest_version_installed
 | 
			
		||||
    expect(formula).to be_bottled
 | 
			
		||||
    expect(formula).to pour_bottle
 | 
			
		||||
 | 
			
		||||
    stub_formula_loader formula
 | 
			
		||||
    stub_formula_loader formula("gcc") { url "gcc-1.0" }
 | 
			
		||||
    stub_formula_loader formula("patchelf") { url "patchelf-1.0" }
 | 
			
		||||
    allow(Formula["patchelf"]).to receive(:installed?).and_return(true)
 | 
			
		||||
    allow(Formula["patchelf"]).to receive(:latest_version_installed?).and_return(true)
 | 
			
		||||
    described_class.new(formula).install
 | 
			
		||||
 | 
			
		||||
    keg = Keg.new(formula.prefix)
 | 
			
		||||
 | 
			
		||||
    expect(formula).to be_installed
 | 
			
		||||
    expect(formula).to be_latest_version_installed
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
      expect(Tab.for_keg(keg)).to be_poured_from_bottle
 | 
			
		||||
@ -41,7 +41,7 @@ describe FormulaInstaller do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expect(keg).not_to exist
 | 
			
		||||
    expect(formula).not_to be_installed
 | 
			
		||||
    expect(formula).not_to be_latest_version_installed
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  specify "basic bottle install" do
 | 
			
		||||
@ -73,13 +73,13 @@ describe FormulaInstaller do
 | 
			
		||||
    # Testball doesn't have a bottle block, so use it to test this behavior
 | 
			
		||||
    formula = Testball.new
 | 
			
		||||
 | 
			
		||||
    expect(formula).not_to be_installed
 | 
			
		||||
    expect(formula).not_to be_latest_version_installed
 | 
			
		||||
    expect(formula).not_to be_bottled
 | 
			
		||||
 | 
			
		||||
    expect {
 | 
			
		||||
      described_class.new(formula).install
 | 
			
		||||
    }.to raise_error(BuildToolsError)
 | 
			
		||||
 | 
			
		||||
    expect(formula).not_to be_installed
 | 
			
		||||
    expect(formula).not_to be_latest_version_installed
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ describe FormulaInstaller do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def temporary_install(formula)
 | 
			
		||||
    expect(formula).not_to be_installed
 | 
			
		||||
    expect(formula).not_to be_latest_version_installed
 | 
			
		||||
 | 
			
		||||
    installer = described_class.new(formula)
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@ describe FormulaInstaller do
 | 
			
		||||
 | 
			
		||||
    keg = Keg.new(formula.prefix)
 | 
			
		||||
 | 
			
		||||
    expect(formula).to be_installed
 | 
			
		||||
    expect(formula).to be_latest_version_installed
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
      Tab.clear_cache
 | 
			
		||||
@ -42,7 +42,7 @@ describe FormulaInstaller do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expect(keg).not_to exist
 | 
			
		||||
    expect(formula).not_to be_installed
 | 
			
		||||
    expect(formula).not_to be_latest_version_installed
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  specify "basic installation" do
 | 
			
		||||
@ -84,7 +84,7 @@ describe FormulaInstaller do
 | 
			
		||||
    expect(formula).to have_disabled_bottle
 | 
			
		||||
 | 
			
		||||
    temporary_install(formula) do |f|
 | 
			
		||||
      expect(f).to be_installed
 | 
			
		||||
      expect(f).to be_latest_version_installed
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user