Merge pull request #16115 from apainintheneck/add-lost-option-to-unbottled
dev-cmd/unbottled: add --lost option
This commit is contained in:
		
						commit
						e7be31dcbc
					
				@ -21,11 +21,13 @@ module Homebrew
 | 
			
		||||
             description: "Skip getting analytics data and sort by number of dependents instead."
 | 
			
		||||
      switch "--total",
 | 
			
		||||
             description: "Print the number of unbottled and total formulae."
 | 
			
		||||
      switch "--lost",
 | 
			
		||||
             description: "Print the `homebrew/core` commits where bottles were lost in the last week."
 | 
			
		||||
      switch "--eval-all",
 | 
			
		||||
             description: "Evaluate all available formulae and casks, whether installed or not, to check them. " \
 | 
			
		||||
                          "Implied if `HOMEBREW_EVAL_ALL` is set."
 | 
			
		||||
 | 
			
		||||
      conflicts "--dependents", "--total"
 | 
			
		||||
      conflicts "--dependents", "--total", "--lost"
 | 
			
		||||
 | 
			
		||||
      named_args :formula
 | 
			
		||||
    end
 | 
			
		||||
@ -43,6 +45,17 @@ module Homebrew
 | 
			
		||||
      Utils::Bottles.tag
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if args.lost?
 | 
			
		||||
      if args.named.present?
 | 
			
		||||
        raise UsageError, "`brew unbottled --lost` cannot be used with formula arguments!"
 | 
			
		||||
      elsif !CoreTap.instance.installed?
 | 
			
		||||
        raise UsageError, "`brew unbottled --lost` requires `homebrew/core` to be tapped locally!"
 | 
			
		||||
      else
 | 
			
		||||
        output_lost_bottles
 | 
			
		||||
        return
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    os = @bottle_tag.system
 | 
			
		||||
    arch = if Hardware::CPU::INTEL_ARCHS.include?(@bottle_tag.arch)
 | 
			
		||||
      :intel
 | 
			
		||||
@ -243,4 +256,59 @@ module Homebrew
 | 
			
		||||
 | 
			
		||||
    puts "No unbottled dependencies found!"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def output_lost_bottles
 | 
			
		||||
    ohai ":#{@bottle_tag} lost bottles"
 | 
			
		||||
 | 
			
		||||
    bottle_tag_regex_fragment = " +sha256.* #{@bottle_tag}: "
 | 
			
		||||
 | 
			
		||||
    # $ git log --patch --no-ext-diff -G'^ +sha256.* sonoma:' --since=@{'1 week ago'}
 | 
			
		||||
    git_log = %w[git log --patch --no-ext-diff]
 | 
			
		||||
    git_log << "-G^#{bottle_tag_regex_fragment}"
 | 
			
		||||
    git_log << "--since=@{'1 week ago'}"
 | 
			
		||||
 | 
			
		||||
    bottle_tag_sha_regex = /^[+-]#{bottle_tag_regex_fragment}/
 | 
			
		||||
 | 
			
		||||
    processed_formulae = Set.new
 | 
			
		||||
    commit = T.let(nil, T.nilable(String))
 | 
			
		||||
    formula = T.let(nil, T.nilable(String))
 | 
			
		||||
    lost_bottles = 0
 | 
			
		||||
 | 
			
		||||
    CoreTap.instance.path.cd do
 | 
			
		||||
      Utils.safe_popen_read(*git_log) do |io|
 | 
			
		||||
        io.each_line do |line|
 | 
			
		||||
          case line
 | 
			
		||||
          when /^commit [0-9a-f]{40}$/
 | 
			
		||||
            # Example match: `commit 7289b409b96a752540befef1a56b8a818baf1db7`
 | 
			
		||||
            if commit && formula && lost_bottles.positive? && processed_formulae.exclude?(formula)
 | 
			
		||||
              puts "#{commit}: bottle lost for #{formula}"
 | 
			
		||||
            end
 | 
			
		||||
            processed_formulae << formula
 | 
			
		||||
            commit = line.split.last
 | 
			
		||||
            formula = nil
 | 
			
		||||
          when %r{^diff --git a/Formula/}
 | 
			
		||||
            # Example match: `diff --git a/Formula/a/aws-cdk.rb b/Formula/a/aws-cdk.rb`
 | 
			
		||||
            formula = line.split("/").last.chomp(".rb\n")
 | 
			
		||||
            formula = CoreTap.instance.formula_renames.fetch(formula, formula)
 | 
			
		||||
            lost_bottles = 0
 | 
			
		||||
          when bottle_tag_sha_regex
 | 
			
		||||
            # Example match: `-    sha256 cellar: :any_skip_relocation, sonoma: "f0a4..."`
 | 
			
		||||
            next if processed_formulae.include?(formula)
 | 
			
		||||
 | 
			
		||||
            case line.chr
 | 
			
		||||
            when "+" then lost_bottles -= 1
 | 
			
		||||
            when "-" then lost_bottles += 1
 | 
			
		||||
            end
 | 
			
		||||
          when /^[+] +sha256.* all: /
 | 
			
		||||
            # Example match: `+    sha256 cellar: :any_skip_relocation, all: "9e35..."`
 | 
			
		||||
            lost_bottles -= 1
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    return if !commit || !formula || !lost_bottles.positive? || processed_formulae.include?(formula)
 | 
			
		||||
 | 
			
		||||
    puts "#{commit}: bottle lost for #{formula}"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -2258,6 +2258,7 @@ _brew_unbottled() {
 | 
			
		||||
      --dependents
 | 
			
		||||
      --eval-all
 | 
			
		||||
      --help
 | 
			
		||||
      --lost
 | 
			
		||||
      --quiet
 | 
			
		||||
      --tag
 | 
			
		||||
      --total
 | 
			
		||||
 | 
			
		||||
@ -1500,6 +1500,7 @@ __fish_brew_complete_arg 'unbottled' -l debug -d 'Display any debugging informat
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l dependents -d 'Skip getting analytics data and sort by number of dependents instead'
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l eval-all -d 'Evaluate all available formulae and casks, whether installed or not, to check them. Implied if `HOMEBREW_EVAL_ALL` is set'
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l help -d 'Show this message'
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l lost -d 'Print the `homebrew/core` commits where bottles were lost in the last week'
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l quiet -d 'Make some output more quiet'
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l tag -d 'Use the specified bottle tag (e.g. `big_sur`) instead of the current OS'
 | 
			
		||||
__fish_brew_complete_arg 'unbottled' -l total -d 'Print the number of unbottled and total formulae'
 | 
			
		||||
 | 
			
		||||
@ -1846,12 +1846,13 @@ _brew_typecheck() {
 | 
			
		||||
_brew_unbottled() {
 | 
			
		||||
  _arguments \
 | 
			
		||||
    '--debug[Display any debugging information]' \
 | 
			
		||||
    '(--total)--dependents[Skip getting analytics data and sort by number of dependents instead]' \
 | 
			
		||||
    '(--total --lost)--dependents[Skip getting analytics data and sort by number of dependents instead]' \
 | 
			
		||||
    '--eval-all[Evaluate all available formulae and casks, whether installed or not, to check them. Implied if `HOMEBREW_EVAL_ALL` is set]' \
 | 
			
		||||
    '--help[Show this message]' \
 | 
			
		||||
    '(--dependents --total)--lost[Print the `homebrew/core` commits where bottles were lost in the last week]' \
 | 
			
		||||
    '--quiet[Make some output more quiet]' \
 | 
			
		||||
    '--tag[Use the specified bottle tag (e.g. `big_sur`) instead of the current OS]' \
 | 
			
		||||
    '(--dependents)--total[Print the number of unbottled and total formulae]' \
 | 
			
		||||
    '(--dependents --lost)--total[Print the number of unbottled and total formulae]' \
 | 
			
		||||
    '--verbose[Make some output more verbose]' \
 | 
			
		||||
    - formula \
 | 
			
		||||
    '*::formula:__brew_formulae'
 | 
			
		||||
 | 
			
		||||
@ -1626,6 +1626,8 @@ Show the unbottled dependents of formulae.
 | 
			
		||||
  Skip getting analytics data and sort by number of dependents instead.
 | 
			
		||||
* `--total`:
 | 
			
		||||
  Print the number of unbottled and total formulae.
 | 
			
		||||
* `--lost`:
 | 
			
		||||
  Print the `homebrew/core` commits where bottles were lost in the last week.
 | 
			
		||||
* `--eval-all`:
 | 
			
		||||
  Evaluate all available formulae and casks, whether installed or not, to check them. Implied if `HOMEBREW_EVAL_ALL` is set.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2339,6 +2339,10 @@ Skip getting analytics data and sort by number of dependents instead\.
 | 
			
		||||
Print the number of unbottled and total formulae\.
 | 
			
		||||
.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-\-lost\fR
 | 
			
		||||
Print the \fBhomebrew/core\fR commits where bottles were lost in the last week\.
 | 
			
		||||
.
 | 
			
		||||
.TP
 | 
			
		||||
\fB\-\-eval\-all\fR
 | 
			
		||||
Evaluate all available formulae and casks, whether installed or not, to check them\. Implied if \fBHOMEBREW_EVAL_ALL\fR is set\.
 | 
			
		||||
.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user