Merge branch 'master' into feature/homebrew_install_cleanup
This commit is contained in:
commit
452d1db109
15
.gitignore
vendored
15
.gitignore
vendored
@ -23,7 +23,9 @@
|
||||
**/.bundle/cache
|
||||
**/vendor/bundle
|
||||
**/vendor/ruby
|
||||
**/vendor/bundle-standalone/ruby/*/bin
|
||||
**/vendor/bundle-standalone/ruby/*/cache
|
||||
**/vendor/bundle-standalone/ruby/*/extensions
|
||||
**/vendor/bundle-standalone/ruby/*/gems/*/*
|
||||
**/vendor/bundle-standalone/ruby/*/specifications
|
||||
|
||||
@ -39,6 +41,17 @@
|
||||
**/vendor/bundle-standalone/ruby/*/gems/thread_safe-*/lib
|
||||
**/vendor/bundle-standalone/ruby/*/gems/tzinfo-*/lib
|
||||
|
||||
# Ignore rubocop dependencies we don't wish to vendor
|
||||
**/vendor/bundle-standalone/ruby/*/gems/ast-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/jaro_winkler-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/parallel-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/parser-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/powerpack-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/rainbow-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/rubocop-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/ruby-progressbar-*/
|
||||
**/vendor/bundle-standalone/ruby/*/gems/unicode-display_width-*/
|
||||
|
||||
# Ignore `bin` contents (again).
|
||||
/bin
|
||||
|
||||
@ -64,6 +77,8 @@
|
||||
!/CHANGELOG.md
|
||||
!/CODE_OF_CONDUCT.md
|
||||
!/CONTRIBUTING.md
|
||||
!/Dockerfile
|
||||
!/Dockerfile.test.yml
|
||||
!/LICENSE.txt
|
||||
!/README.md
|
||||
|
||||
|
||||
35
.travis.yml
35
.travis.yml
@ -1,5 +1,7 @@
|
||||
language: ruby
|
||||
rvm: system
|
||||
os: osx
|
||||
osx_image: xcode10
|
||||
|
||||
cache:
|
||||
directories:
|
||||
@ -11,38 +13,21 @@ branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- os: osx
|
||||
osx_image: xcode10
|
||||
- os: linux
|
||||
sudo: false
|
||||
env:
|
||||
- HOMEBREW_FORCE_HOMEBREW_ON_LINUX=1
|
||||
|
||||
before_install:
|
||||
- if [ "${TRAVIS_OS_NAME}" = "osx" ]; then
|
||||
MACOS="1";
|
||||
HOMEBREW_REPOSITORY="$(brew --repo)";
|
||||
sudo chown -R "$USER" "$HOMEBREW_REPOSITORY";
|
||||
else
|
||||
LINUX="1";
|
||||
export PATH="$PWD/bin:/usr/bin:/bin:/usr/local/bin";
|
||||
fi
|
||||
# umask 022 fixes Linux `brew tests` failures;
|
||||
- if [ "$LINUX" ]; then
|
||||
umask 022;
|
||||
fi
|
||||
- HOMEBREW_REPOSITORY="$(brew --repo)"
|
||||
- sudo chown -R "$USER" "$HOMEBREW_REPOSITORY"
|
||||
# trigger vendored ruby installation
|
||||
- brew help
|
||||
- if [ "$MACOS" ]; then
|
||||
mv "$HOMEBREW_REPOSITORY/Library/Taps" "$PWD/Library";
|
||||
sudo rm -rf "$HOMEBREW_REPOSITORY";
|
||||
sudo ln -s "$PWD" "$HOMEBREW_REPOSITORY";
|
||||
fi
|
||||
- mv "$HOMEBREW_REPOSITORY/Library/Taps" "$PWD/Library"
|
||||
- sudo rm -rf "$HOMEBREW_REPOSITORY"
|
||||
- sudo ln -s "$PWD" "$HOMEBREW_REPOSITORY"
|
||||
- travis_retry git clone --depth=1 https://github.com/Homebrew/homebrew-test-bot Library/Taps/homebrew/homebrew-test-bot
|
||||
|
||||
script:
|
||||
- brew test-bot
|
||||
- travis_wait 60 brew test-bot
|
||||
|
||||
notifications:
|
||||
slack: machomebrew:1XNF7p1JRCdBUuKaeSwsWEc1
|
||||
|
||||
43
Dockerfile
Normal file
43
Dockerfile
Normal file
@ -0,0 +1,43 @@
|
||||
FROM ubuntu:xenial
|
||||
LABEL maintainer="Shaun Jackman <sjackman@gmail.com>"
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends software-properties-common \
|
||||
&& add-apt-repository -y ppa:git-core/ppa \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
bzip2 \
|
||||
ca-certificates \
|
||||
curl \
|
||||
file \
|
||||
fonts-dejavu-core \
|
||||
g++ \
|
||||
git \
|
||||
locales \
|
||||
make \
|
||||
openssh-client \
|
||||
patch \
|
||||
sudo \
|
||||
uuid-runtime \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN localedef -i en_US -f UTF-8 en_US.UTF-8 \
|
||||
&& useradd -m -s /bin/bash linuxbrew \
|
||||
&& echo 'linuxbrew ALL=(ALL) NOPASSWD:ALL' >>/etc/sudoers
|
||||
ADD . /home/linuxbrew/.linuxbrew/Homebrew
|
||||
RUN cd /home/linuxbrew/.linuxbrew \
|
||||
&& mkdir -p bin etc include lib opt sbin share var/homebrew/linked Cellar \
|
||||
&& ln -s ../Homebrew/bin/brew /home/linuxbrew/.linuxbrew/bin/ \
|
||||
&& chown -R linuxbrew: /home/linuxbrew/.linuxbrew \
|
||||
&& cd /home/linuxbrew/.linuxbrew/Homebrew \
|
||||
&& git remote set-url origin https://github.com/Homebrew/brew
|
||||
|
||||
USER linuxbrew
|
||||
WORKDIR /home/linuxbrew
|
||||
ENV PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH \
|
||||
SHELL=/bin/bash \
|
||||
USER=linuxbrew
|
||||
|
||||
# Install portable-ruby and tap homebrew/core.
|
||||
RUN HOMEBREW_NO_ANALYTICS=1 HOMEBREW_NO_AUTO_UPDATE=1 brew tap homebrew/core \
|
||||
&& rm -rf ~/.cache
|
||||
3
Dockerfile.test.yml
Normal file
3
Dockerfile.test.yml
Normal file
@ -0,0 +1,3 @@
|
||||
sut:
|
||||
build: .
|
||||
command: brew test-bot
|
||||
@ -5,9 +5,7 @@ AllCops:
|
||||
- '**/vendor/**/*'
|
||||
DisplayCopNames: false
|
||||
|
||||
require:
|
||||
- ./Homebrew/rubocops.rb
|
||||
- rubocop-rspec
|
||||
require: ./Homebrew/rubocops.rb
|
||||
|
||||
# enable all formulae audits
|
||||
FormulaAudit:
|
||||
|
||||
@ -37,8 +37,8 @@ begin
|
||||
homebrew_path = PATH.new(ENV["HOMEBREW_PATH"])
|
||||
|
||||
# Add SCM wrappers.
|
||||
path.append(HOMEBREW_SHIMS_PATH/"scm")
|
||||
homebrew_path.append(HOMEBREW_SHIMS_PATH/"scm")
|
||||
path.prepend(HOMEBREW_SHIMS_PATH/"scm")
|
||||
homebrew_path.prepend(HOMEBREW_SHIMS_PATH/"scm")
|
||||
|
||||
ENV["PATH"] = path
|
||||
|
||||
|
||||
@ -55,6 +55,12 @@ git() {
|
||||
"$HOMEBREW_LIBRARY/Homebrew/shims/scm/git" "$@"
|
||||
}
|
||||
|
||||
numeric() {
|
||||
# Condense the exploded argument into a single return value.
|
||||
# shellcheck disable=SC2086,SC2183
|
||||
printf "%01d%02d%02d%02d" ${1//./ }
|
||||
}
|
||||
|
||||
HOMEBREW_VERSION="$(git -C "$HOMEBREW_REPOSITORY" describe --tags --dirty --abbrev=7 2>/dev/null)"
|
||||
HOMEBREW_USER_AGENT_VERSION="$HOMEBREW_VERSION"
|
||||
if [[ -z "$HOMEBREW_VERSION" ]]
|
||||
@ -86,7 +92,6 @@ then
|
||||
HOMEBREW_OS_VERSION="macOS $HOMEBREW_MACOS_VERSION"
|
||||
# Don't change this from Mac OS X to match what macOS itself does in Safari on 10.12
|
||||
HOMEBREW_OS_USER_AGENT_VERSION="Mac OS X $HOMEBREW_MACOS_VERSION"
|
||||
HOMEBREW_BOTTLE_DEFAULT_DOMAIN="https://homebrew.bintray.com"
|
||||
|
||||
# The system Curl is too old for some modern HTTPS certificates on
|
||||
# older macOS versions.
|
||||
@ -100,7 +105,8 @@ then
|
||||
HOMEBREW_FORCE_BREWED_CURL="1"
|
||||
fi
|
||||
|
||||
# The system Git is too old for some Homebrew functionality we rely on.
|
||||
# The system Git on macOS versions before Sierra is too old for some Homebrew functionality we rely on.
|
||||
HOMEBREW_MINIMUM_GIT_VERSION="2.14.3"
|
||||
if [[ "$HOMEBREW_MACOS_VERSION_NUMERIC" -lt "101200" ]]
|
||||
then
|
||||
HOMEBREW_FORCE_BREWED_GIT="1"
|
||||
@ -114,13 +120,38 @@ else
|
||||
[[ -n "$HOMEBREW_LINUX" ]] && HOMEBREW_OS_VERSION="$(lsb_release -sd 2>/dev/null)"
|
||||
: "${HOMEBREW_OS_VERSION:=$(uname -r)}"
|
||||
HOMEBREW_OS_USER_AGENT_VERSION="$HOMEBREW_OS_VERSION"
|
||||
HOMEBREW_BOTTLE_DEFAULT_DOMAIN="https://linuxbrew.bintray.com"
|
||||
|
||||
# Ensure the system Curl is a version that supports modern HTTPS certificates.
|
||||
HOMEBREW_MINIMUM_CURL_VERSION="7.41.0"
|
||||
system_curl_version_output="$($(command -v curl) --version 2>/dev/null)"
|
||||
system_curl_name_and_version="${system_curl_version_output%% (*}"
|
||||
if [[ $(numeric "${system_curl_name_and_version##* }") -lt $(numeric "$HOMEBREW_MINIMUM_CURL_VERSION") ]]
|
||||
then
|
||||
HOMEBREW_SYSTEM_CURL_TOO_OLD="1"
|
||||
HOMEBREW_FORCE_BREWED_CURL="1"
|
||||
fi
|
||||
|
||||
# Ensure the system Git is at or newer than the minimum required version.
|
||||
# Git 2.7.4 is the version of git on Ubuntu 16.04 LTS (Xenial Xerus).
|
||||
HOMEBREW_MINIMUM_GIT_VERSION="2.7.0"
|
||||
system_git_version_output="$($(command -v git) --version 2>/dev/null)"
|
||||
if [[ $(numeric "${system_git_version_output##* }") -lt $(numeric "$HOMEBREW_MINIMUM_GIT_VERSION") ]]
|
||||
then
|
||||
HOMEBREW_FORCE_BREWED_GIT="1"
|
||||
fi
|
||||
|
||||
CACHE_HOME="${XDG_CACHE_HOME:-${HOME}/.cache}"
|
||||
HOMEBREW_CACHE="${HOMEBREW_CACHE:-${CACHE_HOME}/Homebrew}"
|
||||
HOMEBREW_SYSTEM_TEMP="/tmp"
|
||||
fi
|
||||
|
||||
if [[ -n "$HOMEBREW_MACOS" || -n "$HOMEBREW_FORCE_HOMEBREW_ON_LINUX" ]]
|
||||
then
|
||||
HOMEBREW_BOTTLE_DEFAULT_DOMAIN="https://homebrew.bintray.com"
|
||||
else
|
||||
HOMEBREW_BOTTLE_DEFAULT_DOMAIN="https://linuxbrew.bintray.com"
|
||||
fi
|
||||
|
||||
HOMEBREW_TEMP="${HOMEBREW_TEMP:-${HOMEBREW_SYSTEM_TEMP}}"
|
||||
|
||||
if [[ -n "$HOMEBREW_FORCE_BREWED_CURL" &&
|
||||
@ -148,8 +179,9 @@ else
|
||||
fi
|
||||
|
||||
HOMEBREW_USER_AGENT="$HOMEBREW_PRODUCT/$HOMEBREW_USER_AGENT_VERSION ($HOMEBREW_SYSTEM; $HOMEBREW_PROCESSOR $HOMEBREW_OS_USER_AGENT_VERSION)"
|
||||
HOMEBREW_CURL_VERSION="$("$HOMEBREW_CURL" --version 2>/dev/null | head -n1 | awk '{print $1"/"$2}')"
|
||||
HOMEBREW_USER_AGENT_CURL="$HOMEBREW_USER_AGENT $HOMEBREW_CURL_VERSION"
|
||||
curl_version_output="$("$HOMEBREW_CURL" --version 2>/dev/null)"
|
||||
curl_name_and_version="${curl_version_output%% (*}"
|
||||
HOMEBREW_USER_AGENT_CURL="$HOMEBREW_USER_AGENT ${curl_name_and_version// //}"
|
||||
|
||||
# Declared in bin/brew
|
||||
export HOMEBREW_BREW_FILE
|
||||
@ -167,6 +199,7 @@ export HOMEBREW_SYSTEM
|
||||
export HOMEBREW_CURL
|
||||
export HOMEBREW_SYSTEM_CURL_TOO_OLD
|
||||
export HOMEBREW_GIT
|
||||
export HOMEBREW_MINIMUM_GIT_VERSION
|
||||
export HOMEBREW_PROCESSOR
|
||||
export HOMEBREW_PRODUCT
|
||||
export HOMEBREW_OS_VERSION
|
||||
|
||||
@ -169,7 +169,9 @@ module Cask
|
||||
end
|
||||
end
|
||||
|
||||
def uninstall_login_item(*login_items, command: nil, **_)
|
||||
def uninstall_login_item(*login_items, command: nil, upgrade: false, **_)
|
||||
return if upgrade
|
||||
|
||||
login_items.each do |name|
|
||||
ohai "Removing login item #{name}"
|
||||
command.run!(
|
||||
|
||||
@ -424,7 +424,7 @@ module Cask
|
||||
next unless artifact.respond_to?(:uninstall_phase)
|
||||
|
||||
odebug "Un-installing artifact of class #{artifact.class}"
|
||||
artifact.uninstall_phase(command: @command, verbose: verbose?, skip: clear, force: force?)
|
||||
artifact.uninstall_phase(command: @command, verbose: verbose?, skip: clear, force: force?, upgrade: upgrade?)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -42,8 +42,12 @@ module Homebrew
|
||||
|
||||
def switch(*names, description: nil, env: nil, required_for: nil, depends_on: nil)
|
||||
global_switch = names.first.is_a?(Symbol)
|
||||
names, env, description = common_switch(*names) if global_switch
|
||||
description = option_to_description(*names) if description.nil?
|
||||
names, env, default_description = common_switch(*names) if global_switch
|
||||
if description.nil? && global_switch
|
||||
description = default_description
|
||||
elsif description.nil?
|
||||
description = option_to_description(*names)
|
||||
end
|
||||
process_option(*names, description)
|
||||
@parser.on(*names, *wrap_option_desc(description)) do
|
||||
enable_switch(*names)
|
||||
@ -72,20 +76,24 @@ module Homebrew
|
||||
end
|
||||
end
|
||||
|
||||
def flag(name, description: nil, required_for: nil, depends_on: nil)
|
||||
if name.end_with? "="
|
||||
def flag(*names, description: nil, required_for: nil, depends_on: nil)
|
||||
if names.any? { |name| name.end_with? "=" }
|
||||
required = OptionParser::REQUIRED_ARGUMENT
|
||||
name.chomp! "="
|
||||
else
|
||||
required = OptionParser::OPTIONAL_ARGUMENT
|
||||
end
|
||||
description = option_to_description(name) if description.nil?
|
||||
process_option(name, description)
|
||||
@parser.on(name, *wrap_option_desc(description), required) do |option_value|
|
||||
Homebrew.args[option_to_name(name)] = option_value
|
||||
names.map! { |name| name.chomp "=" }
|
||||
description = option_to_description(*names) if description.nil?
|
||||
process_option(*names, description)
|
||||
@parser.on(*names, *wrap_option_desc(description), required) do |option_value|
|
||||
names.each do |name|
|
||||
Homebrew.args[option_to_name(name)] = option_value
|
||||
end
|
||||
end
|
||||
|
||||
set_constraints(name, required_for: required_for, depends_on: depends_on)
|
||||
names.each do |name|
|
||||
set_constraints(name, required_for: required_for, depends_on: depends_on)
|
||||
end
|
||||
end
|
||||
|
||||
def conflicts(*options)
|
||||
@ -118,6 +126,7 @@ module Homebrew
|
||||
remaining_args = @parser.parse(cmdline_args)
|
||||
check_constraint_violations
|
||||
Homebrew.args[:remaining] = remaining_args
|
||||
Homebrew.args.freeze
|
||||
@parser
|
||||
end
|
||||
|
||||
|
||||
@ -25,8 +25,10 @@ module Homebrew
|
||||
puts "-DCMAKE_INSTALL_PREFIX=#{prefix}"
|
||||
elsif File.file? "configure"
|
||||
puts "--prefix=#{prefix}"
|
||||
elsif File.file? "meson.build"
|
||||
puts "-Dprefix=#{prefix}"
|
||||
else
|
||||
raise "Couldn't determine build system"
|
||||
raise "Couldn't determine build system. You can manually put files into #{prefix}"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -10,16 +10,39 @@
|
||||
# `--list-checks` lists all audit methods
|
||||
|
||||
require "diagnostic"
|
||||
require "cli_parser"
|
||||
|
||||
module Homebrew
|
||||
module_function
|
||||
|
||||
def doctor_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`doctor` [<options>]
|
||||
|
||||
Check your system for potential problems. Doctor exits with a non-zero status
|
||||
if any potential problems are found. Please note that these warnings are just
|
||||
used to help the Homebrew maintainers with debugging if you file an issue. If
|
||||
everything you use Homebrew for is working fine: please don't worry or file
|
||||
an issue; just ignore this.
|
||||
EOS
|
||||
switch "--list-checks",
|
||||
description: "List all audit methods."
|
||||
switch "-D", "--audit-debug",
|
||||
description: "Enable debugging and profiling of audit methods."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
def doctor
|
||||
inject_dump_stats!(Diagnostic::Checks, /^check_*/) if ARGV.switch? "D"
|
||||
doctor_args.parse
|
||||
|
||||
inject_dump_stats!(Diagnostic::Checks, /^check_*/) if args.audit_debug?
|
||||
|
||||
checks = Diagnostic::Checks.new
|
||||
|
||||
if ARGV.include? "--list-checks"
|
||||
if args.list_checks?
|
||||
puts checks.all.sort
|
||||
exit
|
||||
end
|
||||
@ -36,7 +59,7 @@ module Homebrew
|
||||
|
||||
first_warning = true
|
||||
methods.each do |method|
|
||||
$stderr.puts "Checking #{method}" if ARGV.debug?
|
||||
$stderr.puts "Checking #{method}" if args.debug?
|
||||
unless checks.respond_to?(method)
|
||||
Homebrew.failed = true
|
||||
puts "No check available by the name: #{method}"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#: * `gist-logs` [`--new-issue`|`-n`] <formula>:
|
||||
#: * `gist-logs` [`--new-issue`|`-n`] [`--private`|`-p`] <formula>:
|
||||
#: Upload logs for a failed build of <formula> to a new Gist.
|
||||
#:
|
||||
#: <formula> is usually the name of the formula to install, but it can be specified
|
||||
@ -9,6 +9,9 @@
|
||||
#: If `--new-issue` is passed, automatically create a new issue in the appropriate
|
||||
#: GitHub repository as well as creating the Gist.
|
||||
#:
|
||||
#: If `--private` is passed, the Gist will be marked private and will not
|
||||
#: appear in listings but will be accessible with the link.
|
||||
#:
|
||||
#: If no logs are found, an error message is presented.
|
||||
|
||||
require "formula"
|
||||
@ -42,8 +45,8 @@ module Homebrew
|
||||
if GitHub.api_credentials_type == :none
|
||||
puts <<~EOS
|
||||
You can create a new personal access token:
|
||||
#{GitHub::ALL_SCOPES_URL}
|
||||
and then set the new HOMEBREW_GITHUB_API_TOKEN as the authentication method.
|
||||
#{GitHub::ALL_SCOPES_URL}
|
||||
#{Utils::Shell.set_variable_in_profile("HOMEBREW_GITHUB_API_TOKEN", "your_token_here")}
|
||||
|
||||
EOS
|
||||
login!
|
||||
@ -77,7 +80,7 @@ module Homebrew
|
||||
s
|
||||
end
|
||||
|
||||
# Hack for ruby < 1.9.3
|
||||
# Causes some terminals to display secure password entry indicators
|
||||
def noecho_gets
|
||||
system "stty -echo"
|
||||
result = $stdin.gets
|
||||
@ -110,9 +113,13 @@ module Homebrew
|
||||
logs
|
||||
end
|
||||
|
||||
def create_private?
|
||||
ARGV.include?("--private") || ARGV.switch?("p")
|
||||
end
|
||||
|
||||
def create_gist(files, description)
|
||||
url = "https://api.github.com/gists"
|
||||
data = { "public" => true, "files" => files, "description" => description }
|
||||
data = { "public" => !create_private?, "files" => files, "description" => description }
|
||||
scopes = GitHub::CREATE_GIST_SCOPES
|
||||
GitHub.open_api(url, data: data, scopes: scopes)["html_url"]
|
||||
end
|
||||
|
||||
@ -1,11 +1,23 @@
|
||||
#: * `info`:
|
||||
#: Display brief statistics for your Homebrew installation.
|
||||
#:
|
||||
#: * `info` <formula> [`--verbose`]:
|
||||
#: * `info` `--analytics` [`--days=`<days>] [`--category=`<category>]:
|
||||
#: Display Homebrew analytics data (provided neither `HOMEBREW_NO_ANALYTICS`
|
||||
#: or `HOMEBREW_NO_GITHUB_API` are set)
|
||||
#:
|
||||
#: The value for `days` must be `30`, `90` or `365`. The default is `30`.
|
||||
#:
|
||||
#: The value for `category` must be `install`, `install-on-request`,
|
||||
#: `build-error` or `os-version`. The default is `install`.
|
||||
#:
|
||||
#: * `info` <formula> [`--analytics`]:
|
||||
#: Display information about <formula> and analytics data (provided neither
|
||||
#: `HOMEBREW_NO_ANALYTICS` or `HOMEBREW_NO_GITHUB_API` are set)
|
||||
#:
|
||||
#: Pass `--verbose` to see more detailed analytics data.
|
||||
#: Pass `--verbose` to see more verbose analytics data.
|
||||
#:
|
||||
#: Pass `--analytics` to see only more verbose analytics data instead of
|
||||
#: formula information.
|
||||
#:
|
||||
#: * `info` `--github` <formula>:
|
||||
#: Open a browser to the GitHub History page for <formula>.
|
||||
@ -47,7 +59,9 @@ module Homebrew
|
||||
|
||||
def print_info
|
||||
if ARGV.named.empty?
|
||||
if HOMEBREW_CELLAR.exist?
|
||||
if ARGV.include?("--analytics")
|
||||
output_analytics
|
||||
elsif HOMEBREW_CELLAR.exist?
|
||||
count = Formula.racks.length
|
||||
puts "#{count} #{"keg".pluralize(count)}, #{HOMEBREW_CELLAR.abv}"
|
||||
end
|
||||
@ -55,12 +69,21 @@ module Homebrew
|
||||
ARGV.named.each_with_index do |f, i|
|
||||
puts unless i.zero?
|
||||
begin
|
||||
if f.include?("/") || File.exist?(f)
|
||||
info_formula Formulary.factory(f)
|
||||
formula = if f.include?("/") || File.exist?(f)
|
||||
Formulary.factory(f)
|
||||
else
|
||||
info_formula Formulary.find_with_priority(f)
|
||||
Formulary.find_with_priority(f)
|
||||
end
|
||||
if ARGV.include?("--analytics")
|
||||
output_formula_analytics(formula)
|
||||
else
|
||||
info_formula(formula)
|
||||
end
|
||||
rescue FormulaUnavailableError => e
|
||||
if ARGV.include?("--analytics")
|
||||
output_analytics(filter: f)
|
||||
next
|
||||
end
|
||||
ofail e.message
|
||||
# No formula with this name, try a missing formula lookup
|
||||
if (reason = MissingFormula.reason(f))
|
||||
@ -184,42 +207,165 @@ module Homebrew
|
||||
caveats = Caveats.new(f)
|
||||
ohai "Caveats", caveats.to_s unless caveats.empty?
|
||||
|
||||
output_analytics(f)
|
||||
output_formula_analytics(f)
|
||||
end
|
||||
|
||||
def output_analytics(f)
|
||||
return if ENV["HOMEBREW_NO_ANALYTICS"]
|
||||
return if ENV["HOMEBREW_NO_GITHUB_API"]
|
||||
def formulae_api_json(endpoint)
|
||||
return if ENV["HOMEBREW_NO_ANALYTICS"] || ENV["HOMEBREW_NO_GITHUB_API"]
|
||||
|
||||
formulae_json_url = "https://formulae.brew.sh/api/formula/#{f}.json"
|
||||
output, = curl_output("--max-time", "3", formulae_json_url)
|
||||
return if output.empty?
|
||||
output, = curl_output("--max-time", "3",
|
||||
"https://formulae.brew.sh/api/#{endpoint}")
|
||||
return if output.blank?
|
||||
|
||||
json = begin
|
||||
JSON.parse(output)
|
||||
rescue JSON::ParserError
|
||||
nil
|
||||
JSON.parse(output)
|
||||
rescue JSON::ParserError
|
||||
nil
|
||||
end
|
||||
|
||||
def analytics_table(category, days, results, os_version: false)
|
||||
oh1 "#{category} (#{days} days)"
|
||||
total_count = results.values.inject("+")
|
||||
formatted_total_count = format_count(total_count)
|
||||
formatted_total_percent = format_percent(100)
|
||||
|
||||
index_header = "Index"
|
||||
count_header = "Count"
|
||||
percent_header = "Percent"
|
||||
name_with_options_header = if os_version
|
||||
"macOS Version"
|
||||
else
|
||||
"Name (with options)"
|
||||
end
|
||||
return if json.nil? || json.empty? || json["analytics"].empty?
|
||||
|
||||
ohai "Analytics"
|
||||
if ARGV.verbose?
|
||||
json["analytics"].each do |category, value|
|
||||
value.each do |range, results|
|
||||
oh1 "#{category} (#{range})"
|
||||
results.each do |name_with_options, count|
|
||||
puts "#{name_with_options}: #{number_readable(count)}"
|
||||
end
|
||||
end
|
||||
total_index_footer = "Total"
|
||||
max_index_width = results.length.to_s.length
|
||||
index_width = [
|
||||
index_header.length,
|
||||
total_index_footer.length,
|
||||
max_index_width,
|
||||
].max
|
||||
count_width = [
|
||||
count_header.length,
|
||||
formatted_total_count.length,
|
||||
].max
|
||||
percent_width = [
|
||||
percent_header.length,
|
||||
formatted_total_percent.length,
|
||||
].max
|
||||
name_with_options_width = Tty.width -
|
||||
index_width -
|
||||
count_width -
|
||||
percent_width -
|
||||
10 # spacing and lines
|
||||
|
||||
formatted_index_header =
|
||||
format "%#{index_width}s", index_header
|
||||
formatted_name_with_options_header =
|
||||
format "%-#{name_with_options_width}s",
|
||||
name_with_options_header[0..name_with_options_width-1]
|
||||
formatted_count_header =
|
||||
format "%#{count_width}s", count_header
|
||||
formatted_percent_header =
|
||||
format "%#{percent_width}s", percent_header
|
||||
puts "#{formatted_index_header} | #{formatted_name_with_options_header} | "\
|
||||
"#{formatted_count_header} | #{formatted_percent_header}"
|
||||
|
||||
columns_line = "#{"-"*index_width}:|-#{"-"*name_with_options_width}-|-"\
|
||||
"#{"-"*count_width}:|-#{"-"*percent_width}:"
|
||||
puts columns_line
|
||||
|
||||
index = 0
|
||||
results.each do |name_with_options, count|
|
||||
index += 1
|
||||
formatted_index = format "%0#{max_index_width}d", index
|
||||
formatted_index = format "%-#{index_width}s", formatted_index
|
||||
formatted_name_with_options =
|
||||
format "%-#{name_with_options_width}s",
|
||||
name_with_options[0..name_with_options_width-1]
|
||||
formatted_count = format "%#{count_width}s", format_count(count)
|
||||
formatted_percent = if total_count.zero?
|
||||
format "%#{percent_width}s", format_percent(0)
|
||||
else
|
||||
format "%#{percent_width}s",
|
||||
format_percent((count.to_i * 100) / total_count.to_f)
|
||||
end
|
||||
puts "#{formatted_index} | #{formatted_name_with_options} | " \
|
||||
"#{formatted_count} | #{formatted_percent}%"
|
||||
next if index > 10
|
||||
end
|
||||
return unless results.length > 1
|
||||
|
||||
formatted_total_footer =
|
||||
format "%-#{index_width}s", total_index_footer
|
||||
formatted_blank_footer =
|
||||
format "%-#{name_with_options_width}s", ""
|
||||
formatted_total_count_footer =
|
||||
format "%#{count_width}s", formatted_total_count
|
||||
formatted_total_percent_footer =
|
||||
format "%#{percent_width}s", formatted_total_percent
|
||||
puts "#{formatted_total_footer} | #{formatted_blank_footer} | "\
|
||||
"#{formatted_total_count_footer} | #{formatted_total_percent_footer}%"
|
||||
end
|
||||
|
||||
def output_analytics(filter: nil)
|
||||
days = ARGV.value("days") || "30"
|
||||
valid_days = %w[30 90 365]
|
||||
unless valid_days.include?(days)
|
||||
raise ArgumentError("Days must be one of #{valid_days.join(", ")}!")
|
||||
end
|
||||
|
||||
category = ARGV.value("category") || "install"
|
||||
valid_categories = %w[install install-on-request build-error os-version]
|
||||
unless valid_categories.include?(category)
|
||||
raise ArgumentError("Categories must be one of #{valid_categories.join(", ")}")
|
||||
end
|
||||
|
||||
json = formulae_api_json("analytics/#{category}/#{days}d.json")
|
||||
return if json.blank? || json["items"].blank?
|
||||
|
||||
os_version = category == "os-version"
|
||||
results = {}
|
||||
json["items"].each do |item|
|
||||
key = if os_version
|
||||
item["os_version"]
|
||||
else
|
||||
item["formula"]
|
||||
end
|
||||
if filter.present?
|
||||
next if key != filter && !key.start_with?("#{filter} ")
|
||||
end
|
||||
results[key] = item["count"].tr(",", "").to_i
|
||||
end
|
||||
|
||||
if filter.present? && results.blank?
|
||||
onoe "No results matching `#{filter}` found!"
|
||||
return
|
||||
end
|
||||
|
||||
analytics_table(category, days, results, os_version: os_version)
|
||||
end
|
||||
|
||||
def output_formula_analytics(f)
|
||||
json = formulae_api_json("formula/#{f}.json")
|
||||
return if json.blank? || json["analytics"].blank?
|
||||
|
||||
full_analytics = ARGV.include?("--analytics") || ARGV.verbose?
|
||||
|
||||
ohai "Analytics"
|
||||
json["analytics"].each do |category, value|
|
||||
analytics = value.map do |range, results|
|
||||
"#{number_readable(results.values.inject("+"))} (#{range})"
|
||||
analytics = []
|
||||
|
||||
value.each do |days, results|
|
||||
days = days.to_i
|
||||
if full_analytics
|
||||
analytics_table(category, days, results)
|
||||
else
|
||||
total_count = results.values.inject("+")
|
||||
analytics << "#{number_readable(total_count)} (#{days} days)"
|
||||
end
|
||||
end
|
||||
puts "#{category}: #{analytics.join(", ")}"
|
||||
|
||||
puts "#{category}: #{analytics.join(", ")}" unless full_analytics
|
||||
end
|
||||
end
|
||||
|
||||
@ -247,4 +393,12 @@ module Homebrew
|
||||
|
||||
"#{dep.name} #{dep.option_tags.map { |o| "--#{o}" }.join(" ")}"
|
||||
end
|
||||
|
||||
def format_count(count)
|
||||
count.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
|
||||
end
|
||||
|
||||
def format_percent(percent)
|
||||
format "%.2f", percent
|
||||
end
|
||||
end
|
||||
|
||||
@ -38,8 +38,6 @@ module Homebrew
|
||||
def tap
|
||||
if ARGV.include? "--repair"
|
||||
Tap.each(&:link_completions_and_manpages)
|
||||
elsif ARGV.include? "--list-official"
|
||||
odisabled("brew tap --list-official")
|
||||
elsif ARGV.include? "--list-pinned"
|
||||
puts Tap.select(&:pinned?).map(&:name)
|
||||
elsif ARGV.named.empty?
|
||||
|
||||
@ -24,7 +24,7 @@ git() {
|
||||
|
||||
git_init_if_necessary() {
|
||||
BREW_OFFICIAL_REMOTE="https://github.com/Homebrew/brew"
|
||||
if [[ -n "$HOMEBREW_MACOS" ]] || [[ -n "$HOMEBREW_FORCE_HOMEBREW_ORG" ]]
|
||||
if [[ -n "$HOMEBREW_MACOS" ]] || [[ -n "$HOMEBREW_FORCE_HOMEBREW_ON_LINUX" ]]
|
||||
then
|
||||
CORE_OFFICIAL_REMOTE="https://github.com/Homebrew/homebrew-core"
|
||||
else
|
||||
|
||||
@ -1,8 +1,7 @@
|
||||
require "compat/os/mac"
|
||||
require "compat/dependable"
|
||||
require "compat/dependency_collector"
|
||||
require "compat/extend/os/mac/utils/bottles"
|
||||
require "compat/requirements/x11_requirement"
|
||||
require "compat/requirements/xcode_requirement"
|
||||
require "compat/cask"
|
||||
require "compat/download_strategy"
|
||||
require "compat/fileutils"
|
||||
require "compat/formula_support"
|
||||
require "compat/cask"
|
||||
require "compat/tap"
|
||||
|
||||
@ -6,6 +6,8 @@ module Cask
|
||||
module Compat
|
||||
private
|
||||
|
||||
# TODO: can't delete this code until the merge of
|
||||
# https://github.com/Homebrew/brew/pull/4730 or an equivalent.
|
||||
def cask(header_token, **options, &block)
|
||||
if header_token.is_a?(Hash) && header_token.key?(:v1)
|
||||
odisabled %q("cask :v1 => 'token'"), %q("cask 'token'")
|
||||
|
||||
@ -16,9 +16,7 @@ module Cask
|
||||
end
|
||||
|
||||
def run
|
||||
odeprecated "`brew cask --version`", "`brew --version`", disable_on: Time.new(2018, 10, 31)
|
||||
ARGV.clear
|
||||
Homebrew.__version
|
||||
odisabled "`brew cask --version`", "`brew --version`"
|
||||
end
|
||||
|
||||
def self.help
|
||||
|
||||
@ -22,18 +22,7 @@ module Cask
|
||||
end
|
||||
|
||||
def run
|
||||
odeprecated "`brew cask cleanup`", "`brew cleanup`", disable_on: Time.new(2018, 9, 30)
|
||||
|
||||
cleanup = Homebrew::Cleanup.new
|
||||
|
||||
casks(alternative: -> { Cask.to_a }).each do |cask|
|
||||
cleanup.cleanup_cask(cask)
|
||||
end
|
||||
|
||||
return if cleanup.disk_cleanup_size.zero?
|
||||
|
||||
disk_space = disk_usage_readable(cleanup.disk_cleanup_size)
|
||||
ohai "This operation has freed approximately #{disk_space} of disk space."
|
||||
odisabled "`brew cask cleanup`", "`brew cleanup`"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -6,8 +6,7 @@ module Cask
|
||||
module Compat
|
||||
class Search < AbstractCommand
|
||||
def run
|
||||
odeprecated "`brew cask search`", "`brew search`", disable_on: Time.new(2018, 9, 30)
|
||||
Homebrew.search(args.empty? ? "--casks" : args)
|
||||
odisabled "`brew cask search`", "`brew search`"
|
||||
end
|
||||
|
||||
def self.visible
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
module Cask
|
||||
class DSL
|
||||
module Compat
|
||||
# TODO: can't delete this code until the merge of
|
||||
# https://github.com/Homebrew/brew/pull/4730 or an equivalent.
|
||||
|
||||
def gpg(*)
|
||||
odeprecated "the `gpg` stanza", disable_on: Time.new(2018, 12, 31)
|
||||
odisabled "the `gpg` stanza"
|
||||
end
|
||||
|
||||
def license(*)
|
||||
@ -10,7 +13,7 @@ module Cask
|
||||
end
|
||||
|
||||
def accessibility_access(*)
|
||||
odeprecated "the `accessibility_access` stanza"
|
||||
odisabled "the `accessibility_access` stanza"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
module Dependable
|
||||
module Compat
|
||||
def run?
|
||||
odisabled "Dependable#run?"
|
||||
tags.include? :run
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
@ -1,12 +0,0 @@
|
||||
require "dependency_collector"
|
||||
|
||||
class DependencyCollector
|
||||
module Compat
|
||||
def parse_string_spec(spec, tags)
|
||||
odisabled "'depends_on ... => :run'" if tags.include?(:run)
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
@ -10,7 +10,7 @@ require "download_strategy"
|
||||
class S3DownloadStrategy < CurlDownloadStrategy
|
||||
def initialize(url, name, version, **meta)
|
||||
odeprecated("S3DownloadStrategy",
|
||||
"maintaining S3DownloadStrategy in your own formula or tap")
|
||||
"a vendored S3DownloadStrategy in your own formula or tap (using require_relative)")
|
||||
super
|
||||
end
|
||||
|
||||
@ -26,6 +26,13 @@ class S3DownloadStrategy < CurlDownloadStrategy
|
||||
ENV["AWS_ACCESS_KEY_ID"] = ENV["HOMEBREW_AWS_ACCESS_KEY_ID"]
|
||||
ENV["AWS_SECRET_ACCESS_KEY"] = ENV["HOMEBREW_AWS_SECRET_ACCESS_KEY"]
|
||||
|
||||
begin
|
||||
require "aws-sdk-s3"
|
||||
rescue LoadError
|
||||
Homebrew.install_gem! "aws-sdk-s3", "~> 1.8"
|
||||
require "aws-sdk-s3"
|
||||
end
|
||||
|
||||
begin
|
||||
signer = Aws::S3::Presigner.new
|
||||
s3url = signer.presigned_url :get_object, bucket: bucket, key: key
|
||||
@ -52,7 +59,7 @@ class GitHubPrivateRepositoryDownloadStrategy < CurlDownloadStrategy
|
||||
|
||||
def initialize(url, name, version, **meta)
|
||||
odeprecated("GitHubPrivateRepositoryDownloadStrategy",
|
||||
"maintaining GitHubPrivateRepositoryDownloadStrategy in your own formula or tap")
|
||||
"a vendored GitHubPrivateRepositoryDownloadStrategy in your own formula or tap (using require_relative)")
|
||||
super
|
||||
parse_url_pattern
|
||||
set_github_token
|
||||
@ -106,7 +113,7 @@ end
|
||||
class GitHubPrivateRepositoryReleaseDownloadStrategy < GitHubPrivateRepositoryDownloadStrategy
|
||||
def initialize(url, name, version, **meta)
|
||||
odeprecated("GitHubPrivateRepositoryReleaseDownloadStrategy",
|
||||
"maintaining GitHubPrivateRepositoryReleaseDownloadStrategy in your own formula or tap")
|
||||
"a vendored GitHubPrivateRepositoryReleaseDownloadStrategy in your own formula or tap (using require_relative)")
|
||||
super
|
||||
end
|
||||
|
||||
@ -162,7 +169,7 @@ end
|
||||
class ScpDownloadStrategy < AbstractFileDownloadStrategy
|
||||
def initialize(url, name, version, **meta)
|
||||
odeprecated("ScpDownloadStrategy",
|
||||
"maintaining ScpDownloadStrategy in your own formula or tap")
|
||||
"a vendored ScpDownloadStrategy in your own formula or tap (using require_relative)")
|
||||
super
|
||||
parse_url_pattern
|
||||
end
|
||||
@ -204,21 +211,15 @@ end
|
||||
class DownloadStrategyDetector
|
||||
class << self
|
||||
module Compat
|
||||
def detect(url, using = nil)
|
||||
strategy = super
|
||||
require_aws_sdk if strategy == S3DownloadStrategy
|
||||
strategy
|
||||
end
|
||||
|
||||
def detect_from_url(url)
|
||||
case url
|
||||
when %r{^s3://}
|
||||
odeprecated("s3://",
|
||||
"maintaining S3DownloadStrategy in your own formula or tap")
|
||||
"a vendored S3DownloadStrategy in your own formula or tap (using require_relative)")
|
||||
S3DownloadStrategy
|
||||
when %r{^scp://}
|
||||
odeprecated("scp://",
|
||||
"maintaining ScpDownloadStrategy in your own formula or tap")
|
||||
"a vendored ScpDownloadStrategy in your own formula or tap (using require_relative)")
|
||||
ScpDownloadStrategy
|
||||
else
|
||||
super(url)
|
||||
@ -229,19 +230,20 @@ class DownloadStrategyDetector
|
||||
case symbol
|
||||
when :github_private_repo
|
||||
odeprecated(":github_private_repo",
|
||||
"maintaining GitHubPrivateRepositoryDownloadStrategy in your own formula or tap")
|
||||
"a vendored GitHubPrivateRepositoryDownloadStrategy in your own formula or tap (using require_relative)")
|
||||
GitHubPrivateRepositoryDownloadStrategy
|
||||
when :github_private_release
|
||||
odeprecated(":github_private_repo",
|
||||
"maintaining GitHubPrivateRepositoryReleaseDownloadStrategy in your own formula or tap")
|
||||
"a vendored GitHubPrivateRepositoryReleaseDownloadStrategy in your own formula or tap "\
|
||||
"(using require_relative)")
|
||||
GitHubPrivateRepositoryReleaseDownloadStrategy
|
||||
when :s3
|
||||
odeprecated(":s3",
|
||||
"maintaining S3DownloadStrategy in your own formula or tap")
|
||||
"a vendored S3DownloadStrategy in your own formula or tap (using require_relative)")
|
||||
S3DownloadStrategy
|
||||
when :scp
|
||||
odeprecated(":scp",
|
||||
"maintaining ScpDownloadStrategy in your own formula or tap")
|
||||
"a vendored ScpDownloadStrategy in your own formula or tap (using require_relative)")
|
||||
ScpDownloadStrategy
|
||||
else
|
||||
super(symbol)
|
||||
|
||||
19
Library/Homebrew/compat/extend/os/mac/utils/bottles.rb
Normal file
19
Library/Homebrew/compat/extend/os/mac/utils/bottles.rb
Normal file
@ -0,0 +1,19 @@
|
||||
module Utils
|
||||
class Bottles
|
||||
class Collector
|
||||
module Compat
|
||||
private
|
||||
|
||||
def tag_without_or_later(tag)
|
||||
return super unless tag.to_s.end_with?("_or_later")
|
||||
|
||||
odeprecated "`or_later` bottles",
|
||||
"bottles without `or_later` (or_later is implied now)"
|
||||
tag.to_s[/(\w+)_or_later$/, 1].to_sym
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -2,16 +2,12 @@ require "fileutils"
|
||||
|
||||
module FileUtils
|
||||
module Compat
|
||||
def ruby(*args)
|
||||
odeprecated "ruby", 'system "ruby"'
|
||||
system RUBY_PATH, *args
|
||||
def ruby(*)
|
||||
odisabled "ruby", 'system "ruby"'
|
||||
end
|
||||
|
||||
def mktemp(prefix = name, opts = {})
|
||||
odeprecated("FileUtils.mktemp", "mktemp")
|
||||
Mktemp.new(prefix, opts).run do |staging|
|
||||
yield staging
|
||||
end
|
||||
def mktemp(*)
|
||||
odisabled("FileUtils.mktemp", "mktemp")
|
||||
end
|
||||
module_function :mktemp
|
||||
end
|
||||
|
||||
@ -1,75 +0,0 @@
|
||||
require "formula_support"
|
||||
|
||||
class KegOnlyReason
|
||||
module Compat
|
||||
def valid?
|
||||
case @reason
|
||||
when :provided_pre_mountain_lion
|
||||
odisabled "keg_only :provided_pre_mountain_lion"
|
||||
MacOS.version < :mountain_lion
|
||||
when :provided_pre_mavericks
|
||||
odisabled "keg_only :provided_pre_mavericks"
|
||||
MacOS.version < :mavericks
|
||||
when :provided_pre_el_capitan
|
||||
odisabled "keg_only :provided_pre_el_capitan"
|
||||
MacOS.version < :el_capitan
|
||||
when :provided_pre_high_sierra
|
||||
odisabled "keg_only :provided_pre_high_sierra"
|
||||
MacOS.version < :high_sierra
|
||||
when :provided_until_xcode43
|
||||
odisabled "keg_only :provided_until_xcode43"
|
||||
MacOS::Xcode.version < "4.3"
|
||||
when :provided_until_xcode5
|
||||
odisabled "keg_only :provided_until_xcode5"
|
||||
MacOS::Xcode.version < "5.0"
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def to_s
|
||||
case @reason
|
||||
when :provided_pre_mountain_lion
|
||||
odisabled "keg_only :provided_pre_mountain_lion"
|
||||
|
||||
<<~EOS
|
||||
macOS already provides this software in versions before Mountain Lion
|
||||
EOS
|
||||
when :provided_pre_mavericks
|
||||
odisabled "keg_only :provided_pre_mavericks"
|
||||
|
||||
<<~EOS
|
||||
macOS already provides this software in versions before Mavericks
|
||||
EOS
|
||||
when :provided_pre_el_capitan
|
||||
odisabled "keg_only :provided_pre_el_capitan"
|
||||
|
||||
<<~EOS
|
||||
macOS already provides this software in versions before El Capitan
|
||||
EOS
|
||||
when :provided_pre_high_sierra
|
||||
odisabled "keg_only :provided_pre_high_sierra"
|
||||
|
||||
<<~EOS
|
||||
macOS already provides this software in versions before High Sierra
|
||||
EOS
|
||||
when :provided_until_xcode43
|
||||
odisabled "keg_only :provided_until_xcode43"
|
||||
|
||||
<<~EOS
|
||||
Xcode provides this software prior to version 4.3
|
||||
EOS
|
||||
when :provided_until_xcode5
|
||||
odisabled "keg_only :provided_until_xcode5"
|
||||
|
||||
<<~EOS
|
||||
Xcode provides this software prior to version 5
|
||||
EOS
|
||||
else
|
||||
super
|
||||
end.to_s.strip
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
@ -1,14 +0,0 @@
|
||||
module OS
|
||||
module Mac
|
||||
class << self
|
||||
module Compat
|
||||
def release
|
||||
odisabled "MacOS.release", "MacOS.version"
|
||||
version
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
end
|
||||
end
|
||||
16
Library/Homebrew/compat/requirements/x11_requirement.rb
Normal file
16
Library/Homebrew/compat/requirements/x11_requirement.rb
Normal file
@ -0,0 +1,16 @@
|
||||
require "requirement"
|
||||
|
||||
class X11Requirement < Requirement
|
||||
module Compat
|
||||
def initialize(tags = [])
|
||||
if tags.first.to_s.match?(/(\d\.)+\d/)
|
||||
odeprecated('depends_on :x11 => "X.Y.Z"')
|
||||
tags.shift
|
||||
end
|
||||
|
||||
super(tags)
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
21
Library/Homebrew/compat/requirements/xcode_requirement.rb
Normal file
21
Library/Homebrew/compat/requirements/xcode_requirement.rb
Normal file
@ -0,0 +1,21 @@
|
||||
require "requirement"
|
||||
|
||||
class XcodeRequirement < Requirement
|
||||
module Compat
|
||||
def initialize(tags = [])
|
||||
@version = if tags.first.to_s.match?(/(\d\.)+\d/)
|
||||
tags.shift
|
||||
else
|
||||
tags.find do |tag|
|
||||
next unless tag.to_s.match?(/(\d\.)+\d/)
|
||||
odeprecated('depends_on :xcode => [..., "X.Y.Z"]')
|
||||
tags.delete(tag)
|
||||
end
|
||||
end
|
||||
|
||||
super(tags)
|
||||
end
|
||||
end
|
||||
|
||||
prepend Compat
|
||||
end
|
||||
@ -116,15 +116,17 @@ class DependencyCollector
|
||||
|
||||
def parse_symbol_spec(spec, tags)
|
||||
case spec
|
||||
when :x11 then X11Requirement.new(spec.to_s, tags)
|
||||
when :xcode then XcodeRequirement.new(tags)
|
||||
when :linux then LinuxRequirement.new(tags)
|
||||
when :macos then MacOSRequirement.new(tags)
|
||||
when :arch then ArchRequirement.new(tags)
|
||||
when :java then JavaRequirement.new(tags)
|
||||
when :osxfuse then OsxfuseRequirement.new(tags)
|
||||
when :tuntap then TuntapRequirement.new(tags)
|
||||
when :ld64 then ld64_dep_if_needed(tags)
|
||||
when :arch then ArchRequirement.new(tags)
|
||||
when :codesign then CodesignRequirement.new(tags)
|
||||
when :java then JavaRequirement.new(tags)
|
||||
when :linux then LinuxRequirement.new(tags)
|
||||
when :macos then MacOSRequirement.new(tags)
|
||||
when :maximum_macos then MaximumMacOSRequirement.new(tags)
|
||||
when :osxfuse then OsxfuseRequirement.new(tags)
|
||||
when :tuntap then TuntapRequirement.new(tags)
|
||||
when :x11 then X11Requirement.new(tags)
|
||||
when :xcode then XcodeRequirement.new(tags)
|
||||
when :ld64 then ld64_dep_if_needed(tags)
|
||||
else
|
||||
raise ArgumentError, "Unsupported special dependency #{spec.inspect}"
|
||||
end
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
#: * `audit` [`--strict`] [`--fix`] [`--online`] [`--new-formula`] [`--display-cop-names`] [`--display-filename`] [`--only=`<method>|`--except=`<method>] [`--only-cops=`<cops>|`--except-cops=`<cops>] [<formulae>]:
|
||||
#: Check <formulae> for Homebrew coding style violations. This should be
|
||||
#: run before submitting a new formula.
|
||||
#: Check <formulae> for Homebrew coding style violations. This should be run
|
||||
#: before submitting a new formula. Will exit with a non-zero status if any errors
|
||||
#: are found, which can be useful for implementing pre-commit hooks.
|
||||
#:
|
||||
#: If no <formulae> are provided, all of them are checked.
|
||||
#:
|
||||
@ -23,16 +24,13 @@
|
||||
#: If `--display-filename` is passed, every line of output is prefixed with the
|
||||
#: name of the file or formula being audited, to make the output easy to grep.
|
||||
#:
|
||||
#: Passing `--only=`<method> will run only the methods named `audit_<method>`,
|
||||
#: while `--except=`<method> will skip the methods named `audit_<method>`.
|
||||
#: Specifying `--only=`<method> will run only the methods named `audit_`<method>,
|
||||
#: while `--except=`<method> will skip the methods named `audit_`<method>.
|
||||
#: For either option <method> should be a comma-separated list.
|
||||
#:
|
||||
#: Passing `--only-cops=`<cops> will check for violations of only the listed
|
||||
#: Specifying `--only-cops=`<cops> will check for violations of only the listed
|
||||
#: RuboCop <cops>, while `--except-cops=`<cops> will skip checking the listed
|
||||
#: <cops>. For either option <cops> should be a comma-separated list of cop names.
|
||||
#:
|
||||
#: `audit` exits with a non-zero status if any errors are found. This is useful,
|
||||
#: for instance, for implementing pre-commit hooks.
|
||||
|
||||
# Undocumented options:
|
||||
# `-D` activates debugging and profiling of the audit methods (not the same as `--debug`)
|
||||
@ -55,14 +53,15 @@ module Homebrew
|
||||
def audit_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`audit` [<options>] <formulae>:
|
||||
`audit` [<options>] <formulae>
|
||||
|
||||
Check <formulae> for Homebrew coding style violations. This should be
|
||||
run before submitting a new formula.
|
||||
Check <formulae> for Homebrew coding style violations. This should be run before
|
||||
submitting a new formula. Will exit with a non-zero status if any errors are
|
||||
found, which can be useful for implementing pre-commit hooks.
|
||||
If no <formulae> are provided, all of them are checked.
|
||||
EOS
|
||||
switch "--strict",
|
||||
description: "Run additional style checks, including Rubocop style checks."
|
||||
description: "Run additional style checks, including RuboCop style checks."
|
||||
switch "--online",
|
||||
description: "Run additional slower style checks that require a network connection."
|
||||
switch "--new-formula",
|
||||
@ -74,24 +73,26 @@ module Homebrew
|
||||
switch "--display-cop-names",
|
||||
description: "Include the RuboCop cop name for each violation in the output."
|
||||
switch "--display-filename",
|
||||
description: "Prefix everyline of output with name of the file or formula being audited, to "\
|
||||
description: "Prefix every line of output with name of the file or formula being audited, to "\
|
||||
"make output easy to grep."
|
||||
switch "-D", "--audit-debug",
|
||||
description: "Activates debugging and profiling"
|
||||
description: "Enable debugging and profiling of audit methods."
|
||||
comma_array "--only",
|
||||
description: "Passing `--only=`<method> will run only the methods named audit_<method>. "\
|
||||
"<method> should be a comma-separated list."
|
||||
description: "Specify a comma-separated <method> list to only run the methods named "\
|
||||
"`audit_`<method>."
|
||||
comma_array "--except",
|
||||
description: "Passing `--except=`<method> will run only the methods named audit_<method>, "\
|
||||
"<method> should be a comma-separated list."
|
||||
description: "Specify a comma-separated <method> list to skip running the methods named "\
|
||||
"`audit_`<method>."
|
||||
comma_array "--only-cops",
|
||||
description: "Passing `--only-cops=`<cops> will check for violations of only the listed "\
|
||||
"RuboCop cops. <cops> should be a comma-separated list of cop names."
|
||||
description: "Specify a comma-separated <cops> list to check for violations of only the listed "\
|
||||
"RuboCop cops."
|
||||
comma_array "--except-cops",
|
||||
description: "Passing `--except-cops=`<cops> will skip checking the listed RuboCop cops "\
|
||||
"violations. <cops> should be a comma-separated list of cop names."
|
||||
description: "Specify a comma-separated <cops> list to skip checking for violations of the listed "\
|
||||
"RuboCop cops."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
conflicts "--only", "--except"
|
||||
conflicts "--only-cops", "--except-cops"
|
||||
end
|
||||
end
|
||||
|
||||
@ -126,7 +127,7 @@ module Homebrew
|
||||
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"
|
||||
odie "--only-cops/--except-cops and --strict/--only cannot be used simultaneously!"
|
||||
end
|
||||
|
||||
options = { fix: args.fix?, realpath: true }
|
||||
@ -252,7 +253,9 @@ module Homebrew
|
||||
|
||||
def initialize(formula, options = {})
|
||||
@formula = formula
|
||||
@new_formula = options[:new_formula] && !formula.versioned_formula?
|
||||
@versioned_formula = formula.versioned_formula?
|
||||
@new_formula_inclusive = options[:new_formula]
|
||||
@new_formula = options[:new_formula] && !@versioned_formula
|
||||
@strict = options[:strict]
|
||||
@online = options[:online]
|
||||
@display_cop_names = options[:display_cop_names]
|
||||
@ -273,7 +276,7 @@ module Homebrew
|
||||
|
||||
@style_offenses.each do |offense|
|
||||
if offense.cop_name.start_with?("NewFormulaAudit")
|
||||
next if formula.versioned_formula?
|
||||
next if @versioned_formula
|
||||
|
||||
new_formula_problem offense.to_s(display_cop_name: @display_cop_names)
|
||||
next
|
||||
@ -307,7 +310,7 @@ module Homebrew
|
||||
|
||||
problem "File should end with a newline" unless text.trailing_newline?
|
||||
|
||||
if formula.versioned_formula?
|
||||
if @versioned_formula
|
||||
unversioned_formula = begin
|
||||
# build this ourselves as we want e.g. homebrew/core to be present
|
||||
full_name = if formula.tap
|
||||
@ -493,7 +496,6 @@ module Homebrew
|
||||
end
|
||||
|
||||
def audit_keg_only_style
|
||||
return unless @strict
|
||||
return unless formula.keg_only?
|
||||
|
||||
whitelist = %w[
|
||||
@ -526,7 +528,7 @@ module Homebrew
|
||||
end
|
||||
|
||||
def audit_versioned_keg_only
|
||||
return unless formula.versioned_formula?
|
||||
return unless @versioned_formula
|
||||
return unless @core_tap
|
||||
|
||||
return if formula.keg_only? && formula.keg_only_reason.reason == :versioned_formula
|
||||
@ -561,6 +563,18 @@ module Homebrew
|
||||
end
|
||||
end
|
||||
|
||||
def audit_bottle_spec
|
||||
# special case: new versioned formulae should be audited
|
||||
return unless @new_formula_inclusive
|
||||
return unless @core_tap
|
||||
|
||||
return if formula.bottle_disabled?
|
||||
|
||||
return unless formula.bottle_defined?
|
||||
|
||||
new_formula_problem "New formulae should not have a `bottle do` block"
|
||||
end
|
||||
|
||||
def audit_bottle_disabled
|
||||
return unless formula.bottle_disabled?
|
||||
return if formula.bottle_unneeded?
|
||||
@ -661,24 +675,27 @@ module Homebrew
|
||||
end
|
||||
end
|
||||
|
||||
if @core_tap && (formula.head || formula.devel)
|
||||
unstable_spec_message = "Formulae should not have a `HEAD` or `devel` spec"
|
||||
if @core_tap && formula.devel
|
||||
problem "Formulae should not have a `devel` spec"
|
||||
end
|
||||
|
||||
if @core_tap && formula.head
|
||||
head_spec_message = "Formulae should not have a `HEAD` spec"
|
||||
if @new_formula
|
||||
new_formula_problem unstable_spec_message
|
||||
elsif formula.versioned_formula?
|
||||
versioned_unstable_spec = %w[
|
||||
new_formula_problem head_spec_message
|
||||
elsif @versioned_formula
|
||||
versioned_head_spec = %w[
|
||||
bash-completion@2
|
||||
imagemagick@6
|
||||
python@2
|
||||
]
|
||||
problem unstable_spec_message unless versioned_unstable_spec.include?(formula.name)
|
||||
problem head_spec_message unless versioned_head_spec.include?(formula.name)
|
||||
end
|
||||
end
|
||||
|
||||
throttled = %w[
|
||||
aws-sdk-cpp 10
|
||||
awscli 10
|
||||
heroku 10
|
||||
quicktype 10
|
||||
vim 50
|
||||
]
|
||||
@ -687,14 +704,13 @@ module Homebrew
|
||||
next if formula.stable.nil?
|
||||
|
||||
version = formula.stable.version.to_s.split(".").last.to_i
|
||||
if @strict && a == formula.name && version.modulo(b.to_i).nonzero?
|
||||
if a == formula.name && version.modulo(b.to_i).nonzero?
|
||||
problem "should only be updated every #{b} releases on multiples of #{b}"
|
||||
end
|
||||
end
|
||||
|
||||
unstable_whitelist = %w[
|
||||
aalib 1.4rc5
|
||||
angolmois 2.0.0alpha2
|
||||
automysqlbackup 3.0-rc6
|
||||
aview 1.3.0rc1
|
||||
distcc 3.2rc1
|
||||
@ -703,10 +719,8 @@ module Homebrew
|
||||
hidapi 0.8.0-rc1
|
||||
libcaca 0.99b19
|
||||
nethack4 4.3.0-beta2
|
||||
opensyobon 1.0rc2
|
||||
premake 4.4-beta5
|
||||
pwnat 0.3-beta
|
||||
pxz 4.999.9
|
||||
recode 3.7-beta2
|
||||
speexdsp 1.2rc3
|
||||
sqoop 1.4.6
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
#: * `bottle` [`--verbose`] [`--no-rebuild`|`--keep-old`] [`--skip-relocation`] [`--or-later`] [`--root-url=`<URL>] [`--force-core-tap`] [`--json`] <formulae>:
|
||||
#: Generate a bottle (binary package) from a formula installed with
|
||||
#: Generate a bottle (binary package) from a formula that was installed with
|
||||
#: `--build-bottle`.
|
||||
#:
|
||||
#: If the formula specifies a rebuild version, it will be incremented in the
|
||||
#: generated DSL. Passing `--keep-old` will attempt to keep it at its
|
||||
#: original value, while `--no-rebuild` will remove it.
|
||||
#: generated DSL. Passing `--keep-old` will attempt to keep it at its original
|
||||
#: value, while `--no-rebuild` will remove it.
|
||||
#:
|
||||
#: If `--verbose` (or `-v`) is passed, print the bottling commands and any warnings
|
||||
#: encountered.
|
||||
@ -15,7 +15,7 @@
|
||||
#: If `--root-url` is passed, use the specified <URL> as the root of the
|
||||
#: bottle's URL instead of Homebrew's default.
|
||||
#:
|
||||
#: If `--or-later` is passed, append _or_later to the bottle tag.
|
||||
#: If `--or-later` is passed, append `_or_later` to the bottle tag.
|
||||
#:
|
||||
#: If `--force-core-tap` is passed, build a bottle even if <formula> is not
|
||||
#: in homebrew/core or any installed taps.
|
||||
@ -72,13 +72,13 @@ module Homebrew
|
||||
def bottle_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`bottle` [<options>] <formulae>:
|
||||
`bottle` [<options>] <formulae>
|
||||
|
||||
Generate a bottle (binary package) from a formula installed with
|
||||
Generate a bottle (binary package) from a formula that was installed with
|
||||
`--build-bottle`.
|
||||
If the formula specifies a rebuild version, it will be incremented in the
|
||||
generated DSL. Passing `--keep-old` will attempt to keep it at its
|
||||
original value, while `--no-rebuild` will remove it.
|
||||
generated DSL. Passing `--keep-old` will attempt to keep it at its original
|
||||
value, while `--no-rebuild` will remove it.
|
||||
EOS
|
||||
switch "--skip-relocation",
|
||||
description: "Do not check if the bottle can be marked as relocatable."
|
||||
@ -87,28 +87,30 @@ module Homebrew
|
||||
switch "--force-core-tap",
|
||||
description: "Build a bottle even if <formula> is not in homebrew/core or any installed taps."
|
||||
switch "--no-rebuild",
|
||||
description: "If the formula specifies a rebuild version, it will be removed in the generated DSL."
|
||||
description: "If the formula specifies a rebuild version, remove it from the generated DSL."
|
||||
switch "--keep-old",
|
||||
description: "If the formula specifies a rebuild version, it will attempted to be kept in the "\
|
||||
" generated DSL."
|
||||
switch "--merge",
|
||||
description: "Generate a bottle from a formula and print the new DSL merged into the "\
|
||||
"existing formula."
|
||||
switch "--write",
|
||||
description: "Changes will be written to the formula file. A new commit will be generated unless "\
|
||||
"`--no-commit` is passed."
|
||||
switch "--no-commit",
|
||||
description: "When passed with `--write`, a new commit will not generated while writing changes "\
|
||||
"to the formula file.",
|
||||
depends_on: "--write"
|
||||
description: "If the formula specifies a rebuild version, attempt to preserve its value in the "\
|
||||
"generated DSL."
|
||||
switch "--json",
|
||||
description: "Write bottle information to a JSON file, which can be used as the argument for "\
|
||||
"`--merge`."
|
||||
switch "--merge",
|
||||
description: "Generate an updated bottle block for a formula and optionally merge it into the "\
|
||||
"formula file. Instead of a formula name, requires a JSON file generated with "\
|
||||
"`brew bottle --json` <formula>."
|
||||
switch "--write",
|
||||
depends_on: "--merge",
|
||||
description: "Write the changes to the formula file. A new commit will be generated unless "\
|
||||
"`--no-commit` is passed."
|
||||
switch "--no-commit",
|
||||
depends_on: "--write",
|
||||
description: "When passed with `--write`, a new commit will not generated after writing changes "\
|
||||
"to the formula file."
|
||||
flag "--root-url",
|
||||
description: "Use the specified <URL> as the root of the bottle's URL instead of Homebrew's "\
|
||||
"default."
|
||||
description: "Use the specified <URL> as the root of the bottle's URL instead of Homebrew's default."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
conflicts "--no-rebuild", "--keep-old"
|
||||
end
|
||||
end
|
||||
|
||||
@ -228,7 +230,7 @@ module Homebrew
|
||||
|
||||
unless tap = f.tap
|
||||
unless args.force_core_tap?
|
||||
return ofail "Formula not from core or any taps: #{f.full_name}"
|
||||
return ofail "Formula not from core or any installed taps: #{f.full_name}"
|
||||
end
|
||||
|
||||
tap = CoreTap.instance
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
#: * `bump-formula-pr` [`--devel`] [`--dry-run` [`--write`]] [`--audit`|`--strict`] [`--mirror=`<URL>] [`--version=`<version>] [`--message=`<message>] (`--url=`<URL> `--sha256=`<sha-256>|`--tag=`<tag> `--revision=`<revision>) <formula>:
|
||||
#: Creates a pull request to update the formula with a new URL or a new tag.
|
||||
#: * `bump-formula-pr` [`--devel`] [`--dry-run` [`--write`]] [`--audit`|`--strict`] [`--no-browse] [`--mirror=`<URL>] [`--version=`<version>] [`--message=`<message>] (`--url=`<URL> `--sha256=`<SHA-256>|`--tag=`<tag> `--revision=`<revision>) [<formula>]:
|
||||
#: Create a pull request to update a formula with a new URL or a new tag.
|
||||
#:
|
||||
#: If a <URL> is specified, the <sha-256> checksum of the new download must
|
||||
#: also be specified. A best effort to determine the <sha-256> and <formula>
|
||||
#: If a <URL> is specified, the <SHA-256> checksum of the new download should
|
||||
#: also be specified. A best effort to determine the <SHA-256> and <formula>
|
||||
#: name will be made if either or both values are not supplied by the user.
|
||||
#:
|
||||
#: If a <tag> is specified, the git commit <revision> corresponding to that
|
||||
#: If a <tag> is specified, the Git commit <revision> corresponding to that
|
||||
#: tag must also be specified.
|
||||
#:
|
||||
#: If `--devel` is passed, bump the development rather than stable version.
|
||||
@ -13,8 +13,8 @@
|
||||
#:
|
||||
#: If `--dry-run` is passed, print what would be done rather than doing it.
|
||||
#:
|
||||
#: If `--write` is passed along with `--dry-run`, perform a not-so-dry run
|
||||
#: making the expected file modifications but not taking any git actions.
|
||||
#: If `--write` is passed along with `--dry-run`, perform a not-so-dry run by
|
||||
#: making the expected file modifications but not taking any Git actions.
|
||||
#:
|
||||
#: If `--audit` is passed, run `brew audit` before opening the PR.
|
||||
#:
|
||||
@ -24,7 +24,7 @@
|
||||
#:
|
||||
#: If `--version=`<version> is passed, use the value to override the value
|
||||
#: parsed from the URL or tag. Note that `--version=0` can be used to delete
|
||||
#: an existing `version` override from a formula if it has become redundant.
|
||||
#: an existing version override from a formula if it has become redundant.
|
||||
#:
|
||||
#: If `--message=`<message> is passed, append <message> to the default PR
|
||||
#: message.
|
||||
@ -36,8 +36,8 @@
|
||||
#: If `--quiet` is passed, don't output replacement messages or warn about
|
||||
#: duplicate pull requests.
|
||||
#:
|
||||
#: Note that this command cannot be used to transition a formula from a
|
||||
#: URL-and-sha256 style specification into a tag-and-revision style
|
||||
#: *Note:* this command cannot be used to transition a formula from a
|
||||
#: URL-and-SHA-256 style specification into a tag-and-revision style
|
||||
#: specification, nor vice versa. It must use whichever style specification
|
||||
#: the preexisting formula already uses.
|
||||
|
||||
@ -50,57 +50,58 @@ module Homebrew
|
||||
def bump_formula_pr_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`bump-formula-pr` [<options>] <formula>:
|
||||
`bump-formula-pr` [<options>] [<formula>]
|
||||
|
||||
Creates a pull request to update the formula with a new URL or a new tag.
|
||||
Create a pull request to update a formula with a new URL or a new tag.
|
||||
|
||||
If a <URL> is specified, the <sha-256> checksum of the new download must
|
||||
also be specified. A best effort to determine the <sha-256> and <formula>
|
||||
name will be made if either or both values are not supplied by the user.
|
||||
If a <URL> is specified, the <SHA-256> checksum of the new download should also
|
||||
be specified. A best effort to determine the <SHA-256> and <formula> name will
|
||||
be made if either or both values are not supplied by the user.
|
||||
|
||||
If a <tag> is specified, the git commit <revision> corresponding to that
|
||||
tag must also be specified.
|
||||
If a <tag> is specified, the Git commit <revision> corresponding to that tag
|
||||
must also be specified.
|
||||
|
||||
Note that this command cannot be used to transition a formula from a
|
||||
URL-and-sha256 style specification into a tag-and-revision style
|
||||
specification, nor vice versa. It must use whichever style specification
|
||||
the preexisting formula already uses.
|
||||
*Note:* this command cannot be used to transition a formula from a
|
||||
URL-and-SHA-256 style specification into a tag-and-revision style specification,
|
||||
nor vice versa. It must use whichever style specification the preexisting
|
||||
formula already uses.
|
||||
EOS
|
||||
switch "--devel",
|
||||
description: "Bump the development rather than stable version. The development spec must already exist."
|
||||
switch "-n", "--dry-run",
|
||||
description: "Print what would be done rather than doing it."
|
||||
switch "--write",
|
||||
description: "When passed along with `--dry-run`, perform a not-so-dry run making the expected "\
|
||||
"file modifications but not taking any git actions."
|
||||
depends_on: "--dry-run",
|
||||
description: "When passed along with `--dry-run`, perform a not-so-dry run by making the expected "\
|
||||
"file modifications but not taking any Git actions."
|
||||
switch "--audit",
|
||||
description: "Run `brew audit` before opening the PR."
|
||||
switch "--strict",
|
||||
description: "Run `brew audit --strict` before opening the PR."
|
||||
switch "--no-browse",
|
||||
description: "Output the pull request URL instead of opening in a browser"
|
||||
flag "--url=",
|
||||
description: "Provide new <URL> for the formula. If a <URL> is specified, the <sha-256> "\
|
||||
"checksum of the new download must also be specified."
|
||||
flag "--revision=",
|
||||
description: "Specify the new git commit <revision> corresponding to a specified <tag>."
|
||||
flag "--tag=",
|
||||
required_for: "--revision=",
|
||||
description: "Specify the new git commit <tag> for the formula."
|
||||
flag "--sha256=",
|
||||
depends_on: "--url=",
|
||||
description: "Specify the <sha-256> checksum of new download."
|
||||
flag "--mirror=",
|
||||
description: "Print the pull request URL instead of opening in a browser."
|
||||
flag "--mirror=",
|
||||
description: "Use the provided <URL> as a mirror URL."
|
||||
flag "--version=",
|
||||
flag "--version=",
|
||||
description: "Use the provided <version> to override the value parsed from the URL or tag. Note "\
|
||||
"that `--version=0` can be used to delete an existing `version` override from a "\
|
||||
"that `--version=0` can be used to delete an existing version override from a "\
|
||||
"formula if it has become redundant."
|
||||
flag "--message=",
|
||||
description: "Append provided <message> to the default PR message."
|
||||
flag "--message=",
|
||||
description: "Append the provided <message> to the default PR message."
|
||||
flag "--url=",
|
||||
description: "Specify the <URL> for the new download. If a <URL> is specified, the <SHA-256> "\
|
||||
"checksum of the new download should also be specified."
|
||||
flag "--sha256=",
|
||||
depends_on: "--url=",
|
||||
description: "Specify the <SHA-256> checksum of the new download."
|
||||
flag "--tag=",
|
||||
description: "Specify the new git commit <tag> for the formula."
|
||||
flag "--revision=",
|
||||
required_for: "--tag=",
|
||||
description: "Specify the new git commit <revision> corresponding to a specified <tag>."
|
||||
|
||||
switch :quiet
|
||||
switch :force
|
||||
switch :quiet
|
||||
switch :verbose
|
||||
switch :debug
|
||||
conflicts "--url", "--tag"
|
||||
@ -352,7 +353,7 @@ module Homebrew
|
||||
"#{new_formula_version}#{devel_message}' -- #{formula.path}"
|
||||
ohai "git push --set-upstream $HUB_REMOTE #{branch}:#{branch}"
|
||||
ohai "create pull request with GitHub API"
|
||||
ohai "git checkout -"
|
||||
ohai "git checkout --quiet -"
|
||||
else
|
||||
|
||||
begin
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
#: * `create` <URL> [`--autotools`|`--cmake`|`--meson`] [`--no-fetch`] [`--set-name` <name>] [`--set-version` <version>] [`--tap` <user>`/`<repo>]:
|
||||
#: * `create` [`--autotools`|`--cmake`|`--meson`] [`--no-fetch`] [`--set-name` <name>] [`--set-version` <version>] [`--tap` <user>`/`<repo>] <URL>:
|
||||
#: Generate a formula for the downloadable file at <URL> and open it in the editor.
|
||||
#: Homebrew will attempt to automatically derive the formula name
|
||||
#: and version, but if it fails, you'll have to make your own template. The `wget`
|
||||
#: formula serves as a simple example. For the complete API have a look at
|
||||
#: <https://www.rubydoc.info/github/Homebrew/brew/master/Formula>.
|
||||
#: formula serves as a simple example. For the complete API, see:
|
||||
#: <https://www.rubydoc.info/github/Homebrew/brew/master/Formula>
|
||||
#:
|
||||
#: If `--autotools` is passed, create a basic template for an Autotools-style build.
|
||||
#: If `--cmake` is passed, create a basic template for a CMake-style build.
|
||||
#: If `--meson` is passed, create a basic template for a Meson-style build.
|
||||
#:
|
||||
#: If `--no-fetch` is passed, Homebrew will not download <URL> to the cache and
|
||||
#: will thus not add the SHA256 to the formula for you. It will also not check
|
||||
#: the GitHub API for GitHub projects (to fill out the description and homepage).
|
||||
#: will thus not add the SHA-256 to the formula for you, nor will it check
|
||||
#: the GitHub API for GitHub projects (to fill out its description and homepage).
|
||||
#:
|
||||
#: The options `--set-name` and `--set-version` each take an argument and allow
|
||||
#: you to explicitly set the name and version of the package you are creating.
|
||||
@ -30,13 +30,13 @@ module Homebrew
|
||||
def create_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`create` <URL> [<options>]:
|
||||
`create` [<options>] <URL>
|
||||
|
||||
Generate a formula for the downloadable file at <URL> and open it in the editor.
|
||||
Homebrew will attempt to automatically derive the formula name
|
||||
and version, but if it fails, you'll have to make your own template. The `wget`
|
||||
formula serves as a simple example. For the complete API have a look at
|
||||
<http://www.rubydoc.info/github/Homebrew/brew/master/Formula>.
|
||||
Homebrew will attempt to automatically derive the formula name and version, but
|
||||
if it fails, you'll have to make your own template. The `wget` formula serves as
|
||||
a simple example. For the complete API, see:
|
||||
<http://www.rubydoc.info/github/Homebrew/brew/master/Formula>
|
||||
EOS
|
||||
switch "--autotools",
|
||||
description: "Create a basic template for an Autotools-style build."
|
||||
@ -45,17 +45,17 @@ module Homebrew
|
||||
switch "--meson",
|
||||
description: "Create a basic template for a Meson-style build."
|
||||
switch "--no-fetch",
|
||||
description: "Homebrew will not download <URL> to the cache and will thus not add the SHA256 to "\
|
||||
"the formula for you. It will also not check the GitHub API for GitHub projects "\
|
||||
"(to fill out the description and homepage)."
|
||||
switch "--HEAD"
|
||||
description: "Homebrew will not download <URL> to the cache and will thus not add the SHA-256 "\
|
||||
"to the formula for you, nor will it check the GitHub API for GitHub projects "\
|
||||
"(to fill out its description and homepage)."
|
||||
switch "--HEAD",
|
||||
description: "Indicate that <URL> points to the package's repository rather than a file."
|
||||
flag "--set-name=",
|
||||
description: "Set the provided name of the package you are creating."
|
||||
description: "Set the name of the new formula to the provided <name>."
|
||||
flag "--set-version=",
|
||||
description: "Set the provided version of the package you are creating."
|
||||
description: "Set the version of the new formula to the provided <version>."
|
||||
flag "--tap=",
|
||||
description: "Takes a tap [<user>`/`<repo>] as argument and generates the formula in the "\
|
||||
"specified tap."
|
||||
description: "Generate the new formula in the provided tap, specified as <user>`/`<repo>."
|
||||
switch :force
|
||||
switch :verbose
|
||||
switch :debug
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
#: * `edit`:
|
||||
#: Open all of Homebrew for editing.
|
||||
#: Open the Homebrew repository for editing.
|
||||
#:
|
||||
#: * `edit` <formula>:
|
||||
#: Open <formula> in the editor.
|
||||
#: Open <formula> in the editor set by `EDITOR` or `HOMEBREW_EDITOR`.
|
||||
|
||||
require "formula"
|
||||
require "cli_parser"
|
||||
@ -13,9 +13,10 @@ module Homebrew
|
||||
def edit_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`edit` <formula>:
|
||||
Open <formula> in the editor. Open all of Homebrew for editing if
|
||||
no <formula> is provided.
|
||||
`edit` [<formulae>]
|
||||
|
||||
Open a formula in the editor set by `EDITOR` or `HOMEBREW_EDITOR`, or open the
|
||||
Homebrew repository for editing if no <formula> is provided.
|
||||
EOS
|
||||
switch :force
|
||||
switch :verbose
|
||||
@ -29,7 +30,7 @@ module Homebrew
|
||||
unless (HOMEBREW_REPOSITORY/".git").directory?
|
||||
raise <<~EOS
|
||||
Changes will be lost!
|
||||
The first time you `brew update', all local changes will be lost, you should
|
||||
The first time you `brew update', all local changes will be lost; you should
|
||||
thus `brew update' before you `brew edit'!
|
||||
EOS
|
||||
end
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
#: * `extract` [`--force`] <formula> <tap> [`--version=`<version>]:
|
||||
#: Looks through repository history to find the <version> of <formula> and
|
||||
#: creates a copy in <tap>/Formula/<formula>@<version>.rb. If the tap is
|
||||
#: not installed yet, attempts to install/clone the tap before continuing.
|
||||
#: Look through repository history to find the most recent version of <formula> and
|
||||
#: create a copy in <tap>`/Formula/`<formula>`@`<version>`.rb`. If the tap is
|
||||
#: not installed yet, attempt to install/clone the tap before continuing.
|
||||
#:
|
||||
#: If `--force` is passed, the file at the destination will be overwritten
|
||||
#: if it already exists. Otherwise, existing files will be preserved.
|
||||
@ -99,18 +99,17 @@ module Homebrew
|
||||
def extract_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`extract` [<options>] <formula> <tap>:
|
||||
`extract` [<options>] <formula> <tap>
|
||||
|
||||
Looks through repository history to find the <version> of <formula> and
|
||||
creates a copy in <tap>/Formula/<formula>@<version>.rb. If the tap is
|
||||
not installed yet, attempts to install/clone the tap before continuing.
|
||||
Look through repository history to find the most recent version of <formula> and
|
||||
create a copy in <tap>`/Formula/`<formula>`@`<version>`.rb`. If the tap is not
|
||||
installed yet, attempt to install/clone the tap before continuing.
|
||||
EOS
|
||||
|
||||
flag "--version=",
|
||||
description: "Provided <version> of <formula> will be extracted and placed in the destination "\
|
||||
"tap. Otherwise, the most recent version that can be found will be used."
|
||||
switch :debug
|
||||
description: "Extract the provided <version> of <formula> instead of the most recent."
|
||||
switch :force
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
@ -128,7 +127,7 @@ module Homebrew
|
||||
repo = CoreTap.instance.path
|
||||
# Formulae can technically live in "<repo>/<formula>.rb" or
|
||||
# "<repo>/Formula/<formula>.rb", but explicitly use the latter for now
|
||||
# since that is now core tap is structured.
|
||||
# since that is how the core tap is structured.
|
||||
file = repo/"Formula/#{name}.rb"
|
||||
|
||||
if args.version
|
||||
@ -175,7 +174,7 @@ module Homebrew
|
||||
odie <<~EOS
|
||||
Destination formula already exists: #{path}
|
||||
To overwrite it and continue anyways, run:
|
||||
`brew extract #{name} --version=#{version} --tap=#{destination_tap.name} --force`
|
||||
brew extract --force --version=#{version} #{name} #{destination_tap.name}
|
||||
EOS
|
||||
end
|
||||
ohai "Overwriting existing formula at #{path}" if ARGV.debug?
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#: * `formula` <formula>:
|
||||
#: Display the path where <formula> is located.
|
||||
#: * `formula` <formulae>:
|
||||
#: Display the path where a formula is located.
|
||||
|
||||
require "formula"
|
||||
require "cli_parser"
|
||||
@ -10,12 +10,12 @@ module Homebrew
|
||||
def formula_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`formula` <formula>:
|
||||
`formula` <formulae>
|
||||
|
||||
Display the path where <formula> is located.
|
||||
Display the path where a formula is located.
|
||||
EOS
|
||||
switch :debug
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -2,8 +2,9 @@
|
||||
#: Enter the interactive Homebrew Ruby shell.
|
||||
#:
|
||||
#: If `--examples` is passed, several examples will be shown.
|
||||
#: If `--pry` is passed or HOMEBREW_PRY is set, pry will be
|
||||
#: used instead of irb.
|
||||
#:
|
||||
#: If `--pry` is passed or `HOMEBREW_PRY` is set, Pry will be
|
||||
#: used instead of IRB.
|
||||
|
||||
require "cli_parser"
|
||||
|
||||
@ -25,7 +26,7 @@ module Homebrew
|
||||
def irb_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`irb` [<options>]:
|
||||
`irb` [<options>]
|
||||
|
||||
Enter the interactive Homebrew Ruby shell.
|
||||
EOS
|
||||
@ -33,7 +34,7 @@ module Homebrew
|
||||
description: "Show several examples."
|
||||
switch "--pry",
|
||||
env: :pry,
|
||||
description: "Pry will be used instead of irb if `--pry` is passed or HOMEBREW_PRY is set."
|
||||
description: "Use Pry instead of IRB. Implied if `HOMEBREW_PRY` is set."
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -1,14 +1,12 @@
|
||||
#: * `linkage` [`--test`] [`--reverse`] [<formulae>]:
|
||||
#: Checks the library links of installed formulae.
|
||||
#:
|
||||
#: Only works on installed formulae. An error is raised if it is run on
|
||||
#: uninstalled formulae.
|
||||
#: Check the library links for kegs of installed formulae.
|
||||
#: Raises an error if run on uninstalled formulae.
|
||||
#:
|
||||
#: If `--test` is passed, only display missing libraries and exit with a
|
||||
#: non-zero exit code if any missing libraries were found.
|
||||
#: non-zero status if any missing libraries are found.
|
||||
#:
|
||||
#: If `--reverse` is passed, print the dylib followed by the binaries
|
||||
#: which link to it for each library the keg references.
|
||||
#: If `--reverse` is passed, for every library that a keg references,
|
||||
#: print its dylib path followed by the binaries that link to it.
|
||||
#:
|
||||
#: If <formulae> are given, check linkage for only the specified brews.
|
||||
|
||||
@ -22,21 +20,19 @@ module Homebrew
|
||||
def linkage_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`linkage` [<options>] <formula>:
|
||||
`linkage` [<options>] [<formulae>]
|
||||
|
||||
Checks the library links of an installed formula.
|
||||
|
||||
Only works on installed formulae. An error is raised if it is run on
|
||||
uninstalled formulae.
|
||||
Check the library links for kegs of installed formulae.
|
||||
Raises an error if run on uninstalled formulae.
|
||||
EOS
|
||||
switch "--test",
|
||||
description: "Display only missing libraries and exit with a non-zero exit code if any missing "\
|
||||
"libraries were found."
|
||||
description: "Display only missing libraries and exit with a non-zero status if any missing "\
|
||||
"libraries are found."
|
||||
switch "--reverse",
|
||||
description: "Print the dylib followed by the binaries which link to it for each library the keg "\
|
||||
"references."
|
||||
description: "For every library that a keg references, print its dylib path followed by the "\
|
||||
"binaries that link to it."
|
||||
switch "--cached",
|
||||
description: "Print the cached linkage values stored in HOMEBREW_CACHE, set from a previous "\
|
||||
description: "Print the cached linkage values stored in `HOMEBREW_CACHE`, set by a previous "\
|
||||
"`brew linkage` run."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
|
||||
@ -16,14 +16,17 @@ require "dev-cmd/bottle"
|
||||
require "dev-cmd/bump-formula-pr"
|
||||
require "dev-cmd/create"
|
||||
require "dev-cmd/edit"
|
||||
require "dev-cmd/extract"
|
||||
require "dev-cmd/formula"
|
||||
require "dev-cmd/irb"
|
||||
require "dev-cmd/linkage"
|
||||
require "dev-cmd/mirror"
|
||||
require "dev-cmd/prof"
|
||||
require "dev-cmd/pull"
|
||||
require "dev-cmd/extract"
|
||||
require "dev-cmd/release-notes"
|
||||
require "dev-cmd/ruby"
|
||||
require "dev-cmd/tap-new"
|
||||
require "dev-cmd/test"
|
||||
require "dev-cmd/tests"
|
||||
require "dev-cmd/update-test"
|
||||
|
||||
@ -37,7 +40,7 @@ module Homebrew
|
||||
def man_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`man` [<options>]:
|
||||
`man` [<options>]
|
||||
|
||||
Generate Homebrew's manpages.
|
||||
EOS
|
||||
@ -47,7 +50,7 @@ module Homebrew
|
||||
"the date used in new manpages will match those in the existing manpages (to allow "\
|
||||
"comparison without factoring in the date)."
|
||||
switch "--link",
|
||||
description: "It is now done automatically by `brew update`."
|
||||
description: "This is now done automatically by `brew update`."
|
||||
end
|
||||
end
|
||||
|
||||
@ -186,6 +189,7 @@ module Homebrew
|
||||
def generate_cmd_manpages(glob)
|
||||
cmd_paths = Pathname.glob(glob).sort
|
||||
man_page_lines = []
|
||||
man_args = Homebrew.args
|
||||
cmd_paths.each do |cmd_path|
|
||||
begin
|
||||
cmd_parser = Homebrew.send(cmd_arg_parser(cmd_path))
|
||||
@ -194,6 +198,7 @@ module Homebrew
|
||||
man_page_lines << path_glob_commands(cmd_path.to_s).first
|
||||
end
|
||||
end
|
||||
Homebrew.args = man_args
|
||||
man_page_lines
|
||||
end
|
||||
|
||||
@ -220,15 +225,16 @@ module Homebrew
|
||||
end
|
||||
|
||||
def generate_option_doc(short, long, desc)
|
||||
"* #{format_short_opt(short)} #{format_long_opt(long)}:" + "\n" + desc + "\n"
|
||||
comma = (short && long) ? ", " : ""
|
||||
"* #{format_short_opt(short)}" + comma + "#{format_long_opt(long)}:" + "\n " + desc + "\n"
|
||||
end
|
||||
|
||||
def format_short_opt(opt)
|
||||
"`#{opt}`, " unless opt.nil?
|
||||
"`#{opt}`" unless opt.nil?
|
||||
end
|
||||
|
||||
def format_long_opt(opt)
|
||||
"`#{opt}`"
|
||||
"`#{opt}`" unless opt.nil?
|
||||
end
|
||||
|
||||
def format_usage_banner(usage_banner)
|
||||
|
||||
@ -10,19 +10,19 @@ module Homebrew
|
||||
def mirror_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`mirror` <formulae>:
|
||||
`mirror` <formulae>
|
||||
|
||||
Reuploads the stable URL for a formula to Bintray to use it as a mirror.
|
||||
EOS
|
||||
switch :debug
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
def mirror
|
||||
mirror_args.parse
|
||||
|
||||
odie "This command requires at least formula argument!" if ARGV.named.empty?
|
||||
odie "This command requires at least one formula argument!" if ARGV.named.empty?
|
||||
|
||||
bintray_user = ENV["HOMEBREW_BINTRAY_USER"]
|
||||
bintray_key = ENV["HOMEBREW_BINTRAY_KEY"]
|
||||
|
||||
@ -1,11 +1,23 @@
|
||||
#: * `prof` [<ruby options>]:
|
||||
#: Run Homebrew with the Ruby profiler.
|
||||
#: For example:
|
||||
#: brew prof readall
|
||||
#:
|
||||
#: *Example:* `brew prof readall`
|
||||
|
||||
module Homebrew
|
||||
module_function
|
||||
|
||||
def prof_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`prof` [<ruby options>]
|
||||
|
||||
Run Homebrew with the Ruby profiler.
|
||||
|
||||
*Example:* `brew prof readall`
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
def prof
|
||||
Homebrew.install_gem_setup_path! "ruby-prof"
|
||||
FileUtils.mkdir_p "prof"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#: * `pull` [`--bottle`] [`--bump`] [`--clean`] [`--ignore-whitespace`] [`--resolve`] [`--branch-okay`] [`--no-pbcopy`] [`--no-publish`] [`--warn-on-publish-failure`] [`--bintray-org=`<bintray-org>] [`--test-bot-user=`<test-bot-user>] <patch-source> [<patch-source>]:
|
||||
#: Gets a patch from a GitHub commit or pull request and applies it to Homebrew.
|
||||
#: Optionally, installs the formulae changed by the patch.
|
||||
#: Get a patch from a GitHub commit or pull request and apply it to Homebrew.
|
||||
#: Optionally, publish updated bottles for the formulae changed by the patch.
|
||||
#:
|
||||
#: Each <patch-source> may be one of:
|
||||
#:
|
||||
@ -41,11 +41,11 @@
|
||||
#: If `--warn-on-publish-failure` was passed, do not exit if there's a
|
||||
#: failure publishing bottles on Bintray.
|
||||
#:
|
||||
#: If `--bintray-org=`<bintray-org> is passed, publish at the given Bintray
|
||||
#: If `--bintray-org=`<bintray-org> is passed, publish at the provided Bintray
|
||||
#: organisation.
|
||||
#:
|
||||
#: If `--test-bot-user=`<test-bot-user> is passed, pull the bottle block
|
||||
#: commit from the specified user on GitHub.
|
||||
#: commit from the provided user on GitHub.
|
||||
|
||||
require "net/http"
|
||||
require "net/https"
|
||||
@ -74,12 +74,12 @@ module Homebrew
|
||||
def pull_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`pull` [<options>] <formula>:
|
||||
`pull` [<options>] <patch sources>
|
||||
|
||||
Gets a patch from a GitHub commit or pull request and applies it to Homebrew.
|
||||
Optionally, installs the formulae changed by the patch.
|
||||
Get a patch from a GitHub commit or pull request and apply it to Homebrew.
|
||||
Optionally, publish updated bottles for the formulae changed by the patch.
|
||||
|
||||
Each <patch-source> may be one of:
|
||||
Each <patch source> may be one of:
|
||||
|
||||
~ The ID number of a PR (pull request) in the homebrew/core GitHub
|
||||
repository
|
||||
@ -112,9 +112,9 @@ module Homebrew
|
||||
switch "--warn-on-publish-failure",
|
||||
description: "Do not exit if there's a failure publishing bottles on Bintray."
|
||||
flag "--bintray-org=",
|
||||
description: "Publish at the given Bintray organisation."
|
||||
description: "Publish bottles at the provided Bintray <organisation>."
|
||||
flag "--test-bot-user=",
|
||||
description: "Pull the bottle block commit from the specified user on GitHub."
|
||||
description: "Pull the bottle block commit from the provided <user> on GitHub."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
#: * `release-notes` [`--markdown`] [<previous_tag>] [<end_ref>]:
|
||||
#: Output the merged pull requests on Homebrew/brew between two Git refs.
|
||||
#: Print the merged pull requests on Homebrew/brew between two Git refs.
|
||||
#: If no <previous_tag> is provided it defaults to the latest tag.
|
||||
#: If no <end_ref> is provided it defaults to `origin/master`.
|
||||
#:
|
||||
#: If `--markdown` is passed, output as a Markdown list.
|
||||
#: If `--markdown` is passed, print as a Markdown list.
|
||||
|
||||
require "cli_parser"
|
||||
|
||||
@ -13,14 +13,14 @@ module Homebrew
|
||||
def release_notes_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`release-notes` [<options>] [<previous_tag>] [<end_ref>]:
|
||||
`release-notes` [<options>] [<previous_tag>] [<end_ref>]
|
||||
|
||||
Output the merged pull requests on Homebrew/brew between two Git refs.
|
||||
Print the merged pull requests on Homebrew/brew between two Git refs.
|
||||
If no <previous_tag> is provided it defaults to the latest tag.
|
||||
If no <end_ref> is provided it defaults to `origin/master`.
|
||||
EOS
|
||||
switch "--markdown",
|
||||
description: "Output as a Markdown list."
|
||||
description: "Print as a Markdown list."
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -1,13 +1,32 @@
|
||||
#: * `ruby` [<ruby options>]:
|
||||
#: Run a Ruby instance with Homebrew's libraries loaded.
|
||||
#: For example:
|
||||
# brew ruby -e "puts :gcc.f.deps"
|
||||
# brew ruby script.rb
|
||||
#:
|
||||
#: *Example:* `brew ruby -e "puts :gcc.f.deps"` or `brew ruby script.rb`
|
||||
|
||||
require "cli_parser"
|
||||
|
||||
module Homebrew
|
||||
module_function
|
||||
|
||||
def ruby_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`ruby` [<ruby options>]
|
||||
|
||||
Run a Ruby instance with Homebrew's libraries loaded.
|
||||
|
||||
*Example:* `brew ruby -e "puts :gcc.f.deps"` or `brew ruby script.rb`
|
||||
EOS
|
||||
switch "-e",
|
||||
description: "Execute the provided string argument as a script."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
def ruby
|
||||
ruby_args.parse
|
||||
|
||||
exec ENV["HOMEBREW_RUBY_PATH"], "-I", $LOAD_PATH.join(File::PATH_SEPARATOR), "-rglobal", "-rdev-cmd/irb", *ARGV
|
||||
end
|
||||
end
|
||||
|
||||
@ -7,23 +7,15 @@ require "cli_parser"
|
||||
module Homebrew
|
||||
module_function
|
||||
|
||||
def write_path(tap, filename, content)
|
||||
path = tap.path/filename
|
||||
tap.path.mkpath
|
||||
raise "#{path} already exists" if path.exist?
|
||||
|
||||
path.write content
|
||||
end
|
||||
|
||||
def tap_new_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`tap-new` <user>/<repo>:
|
||||
`tap-new` <user>`/`<repo>
|
||||
|
||||
Generate the template files for a new tap.
|
||||
EOS
|
||||
switch :debug
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
@ -84,4 +76,12 @@ module Homebrew
|
||||
YAML
|
||||
write_path(tap, ".travis.yml", travis)
|
||||
end
|
||||
|
||||
def write_path(tap, filename, content)
|
||||
path = tap.path/filename
|
||||
tap.path.mkpath
|
||||
raise "#{path} already exists" if path.exist?
|
||||
|
||||
path.write content
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,8 +1,7 @@
|
||||
#: * `test` [`--devel`|`--HEAD`] [`--debug`] [`--keep-tmp`] <formula>:
|
||||
#: Most formulae provide a test method. `brew test` <formula> runs this
|
||||
#: test method. There is no standard output or return code, but it should
|
||||
#: generally indicate to the user if something is wrong with the installed
|
||||
#: formula.
|
||||
#: * `test` [`--devel`|`--HEAD`] [`--debug`] [`--keep-tmp`] <formulae>:
|
||||
#: Run the test method provided by a formula.
|
||||
#: There is no standard output or return code, but generally it should notify the
|
||||
#: user if something is wrong with the installed formula.
|
||||
#:
|
||||
#: To test the development or head version of a formula, use `--devel` or
|
||||
#: `--HEAD`.
|
||||
@ -13,7 +12,7 @@
|
||||
#: If `--keep-tmp` is passed, the temporary files created for the test are
|
||||
#: not deleted.
|
||||
#:
|
||||
#: Example: `brew install jruby && brew test jruby`
|
||||
#: *Example:* `brew install jruby && brew test jruby`
|
||||
|
||||
require "extend/ENV"
|
||||
require "formula_assertions"
|
||||
@ -23,6 +22,28 @@ require "timeout"
|
||||
module Homebrew
|
||||
module_function
|
||||
|
||||
def test_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`test` [<options>] <formulae>
|
||||
|
||||
Run the test method provided by an installed formula.
|
||||
There is no standard output or return code, but generally it should notify the
|
||||
user if something is wrong with the installed formula.
|
||||
|
||||
*Example:* `brew install jruby && brew test jruby`
|
||||
EOS
|
||||
switch "--devel",
|
||||
description: "Test the development version of a formula."
|
||||
switch "--HEAD",
|
||||
description: "Test the head version of a formula."
|
||||
switch "--keep-tmp",
|
||||
description: "Keep the temporary files created for the test."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
end
|
||||
|
||||
def test
|
||||
raise FormulaUnspecifiedError if ARGV.named.empty?
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#: * `tests` [`--verbose`] [`--coverage`] [`--generic`] [`--no-compat`] [`--only=`<test_script>[`:`<line_number>]] [`--seed=`<seed>] [`--online`] [`--official-cmd-taps`]:
|
||||
#: * `tests` [`--verbose`] [`--coverage`] [`--generic`] [`--no-compat`] [`--only=`<test_script>[`:`<line_number>]] [`--seed=`<seed>] [`--online`]:
|
||||
#: Run Homebrew's unit and integration tests. If provided,
|
||||
#: `--only=`<test_script> runs only <test_script>_spec.rb, and `--seed`
|
||||
#: `--only=`<test_script> runs only <test_script>`_spec.rb`, and `--seed`
|
||||
#: randomizes tests with the provided value instead of a random seed.
|
||||
#:
|
||||
#: If `--verbose` (or `-v`) is passed, print the command that runs the tests.
|
||||
@ -24,25 +24,24 @@ module Homebrew
|
||||
def tests_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`tests` [<options>]:
|
||||
`tests` [<options>]
|
||||
|
||||
Run Homebrew's unit and integration tests. If provided,
|
||||
`--only=`<test_script> runs only <test_script>_spec.rb, and `--seed`
|
||||
randomizes tests with the provided value instead of a random seed.
|
||||
Run Homebrew's unit and integration tests.
|
||||
EOS
|
||||
switch "--coverage",
|
||||
description: "Generate code coverage reports."
|
||||
switch "--generic",
|
||||
description: "Run only OS-agnostic tests."
|
||||
description: "Run only OS-agnostic tests."
|
||||
switch "--no-compat",
|
||||
description: "Do not load the compatibility layer when running tests."
|
||||
switch "--online",
|
||||
description: "Include tests that use the GitHub API and tests that use any of the taps for "\
|
||||
"official external commands."
|
||||
flag "--only=",
|
||||
description: "Run only <test_script>_spec.rb"
|
||||
description: "Run only <test_script>`_spec.rb`. Appending `:`<line_number> will start at a "\
|
||||
"specific line."
|
||||
flag "--seed=",
|
||||
description: "Randomizes tests with the provided value instead of a random seed."
|
||||
description: "Randomize tests with the provided <value> instead of a random seed."
|
||||
switch :verbose
|
||||
switch :debug
|
||||
end
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#: * `update-test` [`--commit=`<commit>] [`--before=`<date>] [`--to-tag`] [`--keep-tmp`]:
|
||||
#: Runs a test of `brew update` with a new repository clone.
|
||||
#: Run a test of `brew update` with a new repository clone.
|
||||
#:
|
||||
#: If no arguments are passed, use `origin/master` as the start commit.
|
||||
#:
|
||||
@ -22,10 +22,9 @@ module Homebrew
|
||||
def update_test_args
|
||||
Homebrew::CLI::Parser.new do
|
||||
usage_banner <<~EOS
|
||||
`update-test` [<options>]:
|
||||
|
||||
Runs a test of `brew update` with a new repository clone.
|
||||
`update-test` [<options>]
|
||||
|
||||
Run a test of `brew update` with a new repository clone.
|
||||
If no arguments are passed, use `origin/master` as the start commit.
|
||||
EOS
|
||||
switch "--to-tag",
|
||||
|
||||
@ -489,8 +489,7 @@ module Homebrew
|
||||
end
|
||||
|
||||
def check_git_version
|
||||
# System Git version on macOS Sierra.
|
||||
minimum_version = "2.14.3".freeze
|
||||
minimum_version = ENV["HOMEBREW_MINIMUM_GIT_VERSION"].freeze
|
||||
return unless Utils.git_available?
|
||||
return if Version.create(Utils.git_version) >= Version.create(minimum_version)
|
||||
|
||||
|
||||
@ -352,8 +352,9 @@ class CurlDownloadStrategy < AbstractFileDownloadStrategy
|
||||
end
|
||||
end
|
||||
|
||||
filenames = lines.map { |line| line[/^Content\-Disposition:\s*attachment;\s*filename=(["']?)([^;]+)\1/i, 2] }
|
||||
.compact
|
||||
filenames =
|
||||
lines.map { |line| line[/^Content\-Disposition:\s*(?:inline|attachment);\s*filename=(["']?)([^;]+)\1/i, 2] }
|
||||
.compact
|
||||
|
||||
basename = filenames.last || parse_basename(redirect_url)
|
||||
|
||||
|
||||
1
Library/Homebrew/extend/os/keg.rb
Normal file
1
Library/Homebrew/extend/os/keg.rb
Normal file
@ -0,0 +1 @@
|
||||
require "extend/os/mac/keg" if OS.mac?
|
||||
@ -1,5 +1,8 @@
|
||||
class Keg
|
||||
def relocate_dynamic_linkage(relocation)
|
||||
# Patching the dynamic linker of glibc breaks it.
|
||||
return if name == "glibc"
|
||||
|
||||
# Patching patchelf using itself fails with "Text file busy" or SIGBUS.
|
||||
return if name == "patchelf"
|
||||
|
||||
@ -83,4 +86,17 @@ class Keg
|
||||
def self.relocation_formulae
|
||||
["patchelf"]
|
||||
end
|
||||
|
||||
def self.bottle_dependencies
|
||||
@bottle_dependencies ||= begin
|
||||
formulae = relocation_formulae
|
||||
gcc = Formula["gcc"]
|
||||
if !ENV["HOMEBREW_FORCE_HOMEBREW_ON_LINUX"] &&
|
||||
DevelopmentTools.non_apple_gcc_version("gcc") < gcc.version.to_i
|
||||
formulae += gcc.recursive_dependencies.map(&:name)
|
||||
formulae << gcc.name
|
||||
end
|
||||
formulae
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
class CoreTap < Tap
|
||||
def default_remote
|
||||
if ENV["HOMEBREW_FORCE_HOMEBREW_ORG"]
|
||||
if ENV["HOMEBREW_FORCE_HOMEBREW_ON_LINUX"]
|
||||
"https://github.com/Homebrew/homebrew-core".freeze
|
||||
else
|
||||
"https://github.com/Linuxbrew/homebrew-core".freeze
|
||||
|
||||
4
Library/Homebrew/extend/os/mac/keg.rb
Normal file
4
Library/Homebrew/extend/os/mac/keg.rb
Normal file
@ -0,0 +1,4 @@
|
||||
class Keg
|
||||
GENERIC_KEG_LINK_DIRECTORIES = remove_const :KEG_LINK_DIRECTORIES
|
||||
KEG_LINK_DIRECTORIES = (GENERIC_KEG_LINK_DIRECTORIES + ["Frameworks"]).freeze
|
||||
end
|
||||
@ -1,15 +0,0 @@
|
||||
require "requirement"
|
||||
|
||||
class NonBinaryOsxfuseRequirement < Requirement
|
||||
fatal true
|
||||
satisfy(build_env: false) do
|
||||
HOMEBREW_PREFIX.to_s != "/usr/local" || !OsxfuseRequirement.binary_osxfuse_installed?
|
||||
end
|
||||
|
||||
def message
|
||||
<<~EOS
|
||||
osxfuse is already installed from the binary distribution and
|
||||
conflicts with this formula.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
@ -42,6 +42,10 @@ module Utils
|
||||
altivec_tag if key?(altivec_tag)
|
||||
end
|
||||
|
||||
def tag_without_or_later(tag)
|
||||
tag
|
||||
end
|
||||
|
||||
# Find a bottle built for a previous version of macOS.
|
||||
def find_older_compatible_tag(tag)
|
||||
begin
|
||||
@ -51,13 +55,12 @@ module Utils
|
||||
end
|
||||
|
||||
keys.find do |key|
|
||||
# TODO: move to compat?
|
||||
key_tag_version = if key.to_s.end_with?("_or_later")
|
||||
key.to_s[/(\w+)_or_later$/, 1].to_sym
|
||||
else
|
||||
key
|
||||
key_tag_version = tag_without_or_later(key)
|
||||
begin
|
||||
MacOS::Version.from_symbol(key_tag_version) <= tag_version
|
||||
rescue ArgumentError
|
||||
false
|
||||
end
|
||||
MacOS::Version.from_symbol(key_tag_version) <= tag_version
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
if OS.mac?
|
||||
require "extend/os/mac/requirements/non_binary_osxfuse_requirement"
|
||||
end
|
||||
@ -165,13 +165,14 @@ class Pathname
|
||||
# The enclosing `mktmpdir` and the `chmod` are a workaround
|
||||
# for https://github.com/rails/rails/pull/34037.
|
||||
Dir.mktmpdir(".d", dirname) do |tmpdir|
|
||||
should_fix_sticky_bit = dirname.world_writable? && !dirname.sticky?
|
||||
FileUtils.chmod "+t", dirname if should_fix_sticky_bit
|
||||
begin
|
||||
FileUtils.chmod "+t", dirname
|
||||
rescue Errno::EPERM
|
||||
:ignore
|
||||
end
|
||||
File.atomic_write(self, tmpdir) do |file|
|
||||
file.write(content)
|
||||
File.atomic_write(self, tmpdir) do |file|
|
||||
file.write(content)
|
||||
end
|
||||
ensure
|
||||
FileUtils.chmod "-t", dirname if should_fix_sticky_bit
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -2532,7 +2532,6 @@ class Formula
|
||||
# version '4.8.1'
|
||||
# end</pre>
|
||||
def fails_with(compiler, &block)
|
||||
odisabled "fails_with :llvm" if compiler == :llvm
|
||||
specs.each { |spec| spec.fails_with(compiler, &block) }
|
||||
end
|
||||
|
||||
|
||||
@ -489,14 +489,20 @@ class FormulaInstaller
|
||||
end
|
||||
end
|
||||
|
||||
if pour_bottle && !Keg.relocation_formulae.include?(formula.name)
|
||||
bottle_deps = Keg.relocation_formulae
|
||||
.map { |formula| Dependency.new(formula) }
|
||||
.reject do |dep|
|
||||
if pour_bottle && !Keg.bottle_dependencies.empty?
|
||||
bottle_deps = if !Keg.bottle_dependencies.include?(formula.name)
|
||||
Keg.bottle_dependencies
|
||||
elsif !Keg.relocation_formulae.include?(formula.name)
|
||||
Keg.relocation_formulae
|
||||
else
|
||||
[]
|
||||
end
|
||||
bottle_deps = bottle_deps.map { |formula| Dependency.new(formula) }
|
||||
.reject do |dep|
|
||||
inherited_options[dep.name] |= inherited_options_for(dep)
|
||||
dep.satisfied? inherited_options[dep.name]
|
||||
end
|
||||
expanded_deps = Dependency.merge_repeats(bottle_deps + expanded_deps) unless bottle_deps.empty?
|
||||
expanded_deps = Dependency.merge_repeats(bottle_deps + expanded_deps)
|
||||
end
|
||||
|
||||
expanded_deps.map { |dep| [dep, inherited_options[dep.name]] }
|
||||
|
||||
@ -54,7 +54,7 @@ HOMEBREW_USER_AGENT_FAKE_SAFARI =
|
||||
# `HOMEBREW_BOTTLE_DEFAULT_DOMAIN` isn't set.
|
||||
HOMEBREW_BOTTLE_DEFAULT_DOMAIN = if ENV["HOMEBREW_BOTTLE_DEFAULT_DOMAIN"]
|
||||
ENV["HOMEBREW_BOTTLE_DEFAULT_DOMAIN"]
|
||||
elsif OS.mac?
|
||||
elsif OS.mac? || ENV["HOMEBREW_FORCE_HOMEBREW_ON_LINUX"]
|
||||
"https://homebrew.bintray.com".freeze
|
||||
else
|
||||
"https://linuxbrew.bintray.com".freeze
|
||||
|
||||
@ -66,7 +66,7 @@ class Keg
|
||||
LOCALEDIR_RX = %r{(locale|man)/([a-z]{2}|C|POSIX)(_[A-Z]{2})?(\.[a-zA-Z\-0-9]+(@.+)?)?}
|
||||
INFOFILE_RX = %r{info/([^.].*?\.info|dir)$}
|
||||
KEG_LINK_DIRECTORIES = %w[
|
||||
bin etc include lib sbin share var Frameworks
|
||||
bin etc include lib sbin share var
|
||||
].freeze
|
||||
MUST_EXIST_SUBDIRECTORIES = (
|
||||
KEG_LINK_DIRECTORIES - %w[var] + %w[
|
||||
@ -672,3 +672,5 @@ class Keg
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
require "extend/os/keg"
|
||||
|
||||
@ -187,6 +187,10 @@ class Keg
|
||||
def self.relocation_formulae
|
||||
[]
|
||||
end
|
||||
|
||||
def self.bottle_dependencies
|
||||
relocation_formulae
|
||||
end
|
||||
end
|
||||
|
||||
require "extend/os/keg_relocate"
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
# When done, regenerate the man page and its HTML version by running `brew man`.
|
||||
%>
|
||||
brew(1) -- The missing package manager for macOS
|
||||
===============================================
|
||||
================================================
|
||||
|
||||
## SYNOPSIS
|
||||
|
||||
@ -105,6 +105,7 @@ can take several different forms:
|
||||
The formula file will be cached for later use.
|
||||
|
||||
## ENVIRONMENT
|
||||
|
||||
Note that environment variables must have a value set to be detected. For example, `export HOMEBREW_NO_INSECURE_REDIRECT=1` rather than just `export HOMEBREW_NO_INSECURE_REDIRECT`.
|
||||
|
||||
* `HOMEBREW_ARTIFACT_DOMAIN`:
|
||||
@ -180,22 +181,16 @@ Note that environment variables must have a value set to be detected. For exampl
|
||||
editors will do strange things in this case.
|
||||
|
||||
* `HOMEBREW_FORCE_BREWED_CURL`:
|
||||
If set, Homebrew will use a Homebrew-installed `curl` rather than the
|
||||
system version.
|
||||
If set, Homebrew will always use a Homebrew-installed `curl` rather than the
|
||||
system version. Automatically set if the system version of `curl` is too old.
|
||||
|
||||
* `HOMEBREW_FORCE_VENDOR_RUBY`:
|
||||
If set, Homebrew will always use its vendored, relocatable Ruby version
|
||||
even if the system version of Ruby is new enough.
|
||||
|
||||
* `HOMEBREW_GIT`:
|
||||
When using Git, Homebrew will use `GIT` if set,
|
||||
a Homebrew-built Git if installed, or the system-provided binary.
|
||||
|
||||
Set this to force Homebrew to use a particular git binary.
|
||||
|
||||
* `HOMEBREW_FORCE_BREWED_GIT`:
|
||||
If set, Homebrew will use a Homebrew-installed `git` rather than the
|
||||
system version.
|
||||
If set, Homebrew will always use a Homebrew-installed `git` rather than the
|
||||
system version. Automatically set if the system version of `git` is too old.
|
||||
|
||||
* `HOMEBREW_GITHUB_API_TOKEN`:
|
||||
A personal access token for the GitHub API, which you can create at
|
||||
|
||||
@ -1,3 +1,7 @@
|
||||
module Homebrew
|
||||
DEFAULT_PREFIX = "/home/linuxbrew/.linuxbrew".freeze
|
||||
DEFAULT_PREFIX = if ENV["HOMEBREW_FORCE_HOMEBREW_ON_LINUX"]
|
||||
"/usr/local".freeze
|
||||
else
|
||||
"/home/linuxbrew/.linuxbrew".freeze
|
||||
end
|
||||
end
|
||||
|
||||
@ -150,10 +150,6 @@ class Requirement
|
||||
attr_reader :env_proc, :build
|
||||
attr_rw :fatal, :cask, :download
|
||||
|
||||
def default_formula(_val = nil)
|
||||
odisabled "Requirement.default_formula"
|
||||
end
|
||||
|
||||
def satisfy(options = nil, &block)
|
||||
return @satisfied if options.nil? && !block_given?
|
||||
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
require "requirement"
|
||||
require "requirements/arch_requirement"
|
||||
require "requirements/codesign_requirement"
|
||||
require "requirements/java_requirement"
|
||||
require "requirements/linux_requirement"
|
||||
require "requirements/macos_requirement"
|
||||
require "requirements/maximum_macos_requirement"
|
||||
require "requirements/osxfuse_requirement"
|
||||
require "requirements/java_requirement"
|
||||
require "requirements/tuntap_requirement"
|
||||
require "requirements/unsigned_kext_requirement"
|
||||
require "requirements/x11_requirement"
|
||||
require "requirements/arch_requirement"
|
||||
require "requirements/xcode_requirement"
|
||||
|
||||
@ -3,9 +3,9 @@ require "requirement"
|
||||
class ArchRequirement < Requirement
|
||||
fatal true
|
||||
|
||||
def initialize(arch)
|
||||
@arch = arch.pop
|
||||
super
|
||||
def initialize(tags)
|
||||
@arch = tags.shift
|
||||
super(tags)
|
||||
end
|
||||
|
||||
satisfy(build_env: false) do
|
||||
|
||||
32
Library/Homebrew/requirements/codesign_requirement.rb
Normal file
32
Library/Homebrew/requirements/codesign_requirement.rb
Normal file
@ -0,0 +1,32 @@
|
||||
class CodesignRequirement < Requirement
|
||||
fatal true
|
||||
|
||||
def initialize(tags)
|
||||
options = tags.shift
|
||||
unless options.is_a?(Hash)
|
||||
raise ArgumentError("CodesignRequirement requires an options Hash!")
|
||||
end
|
||||
unless options.key?(:identity)
|
||||
raise ArgumentError("CodesignRequirement requires an identity key!")
|
||||
end
|
||||
|
||||
@identity = options.fetch(:identity)
|
||||
@with = options.fetch(:with, "code signing")
|
||||
@url = options.fetch(:url, nil)
|
||||
super(tags)
|
||||
end
|
||||
|
||||
satisfy(build_env: false) do
|
||||
mktemp do
|
||||
FileUtils.cp "/usr/bin/false", "codesign_check"
|
||||
quiet_system "/usr/bin/codesign", "-f", "-s", @identity,
|
||||
"--dryrun", "codesign_check"
|
||||
end
|
||||
end
|
||||
|
||||
def message
|
||||
message = "#{@identity} identity must be available to build with #{@with}"
|
||||
message += ":\n#{@url}" if @url.present?
|
||||
message
|
||||
end
|
||||
end
|
||||
@ -27,7 +27,7 @@ class JavaRequirement < Requirement
|
||||
|
||||
def initialize(tags = [])
|
||||
@version = tags.shift if /(\d+\.)+\d/ =~ tags.first
|
||||
super
|
||||
super(tags)
|
||||
end
|
||||
|
||||
def message
|
||||
@ -39,7 +39,7 @@ class JavaRequirement < Requirement
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>"
|
||||
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>"
|
||||
end
|
||||
|
||||
def display_s
|
||||
|
||||
@ -4,8 +4,8 @@ class MacOSRequirement < Requirement
|
||||
fatal true
|
||||
|
||||
def initialize(tags = [])
|
||||
@version = MacOS::Version.from_symbol(tags.first) unless tags.empty?
|
||||
super
|
||||
@version = MacOS::Version.from_symbol(tags.shift) unless tags.empty?
|
||||
super(tags)
|
||||
end
|
||||
|
||||
def minimum_version_specified?
|
||||
|
||||
@ -4,8 +4,8 @@ class MaximumMacOSRequirement < Requirement
|
||||
fatal true
|
||||
|
||||
def initialize(tags)
|
||||
@version = MacOS::Version.from_symbol(tags.first)
|
||||
super
|
||||
@version = MacOS::Version.from_symbol(tags.shift)
|
||||
super(tags)
|
||||
end
|
||||
|
||||
satisfy(build_env: false) { MacOS.version <= @version }
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
require "requirement"
|
||||
|
||||
class NonBinaryOsxfuseRequirement < Requirement
|
||||
fatal false
|
||||
end
|
||||
|
||||
require "extend/os/requirements/non_binary_osxfuse_requirement"
|
||||
@ -1,16 +0,0 @@
|
||||
require "requirement"
|
||||
|
||||
class UnsignedKextRequirement < Requirement
|
||||
fatal true
|
||||
|
||||
satisfy(build_env: false) { MacOS.version < :yosemite }
|
||||
|
||||
def message
|
||||
s = <<~EOS
|
||||
Building this formula from source isn't possible due to OS X
|
||||
Yosemite (10.10) and above's strict unsigned kext ban.
|
||||
EOS
|
||||
s += super
|
||||
s
|
||||
end
|
||||
end
|
||||
@ -10,13 +10,6 @@ class X11Requirement < Requirement
|
||||
|
||||
env { ENV.x11 }
|
||||
|
||||
def initialize(name = "x11", tags = [])
|
||||
@name = name
|
||||
# no-op on version specified as a tag argument
|
||||
tags.shift if /(\d\.)+\d/ =~ tags.first
|
||||
super(tags)
|
||||
end
|
||||
|
||||
def min_version
|
||||
"1.12.2"
|
||||
end
|
||||
@ -51,7 +44,7 @@ class X11Requirement < Requirement
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#<#{self.class.name}: #{name.inspect} #{tags.inspect}>"
|
||||
"#<#{self.class.name}: #{tags.inspect}>"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -6,8 +6,8 @@ class XcodeRequirement < Requirement
|
||||
satisfy(build_env: false) { xcode_installed_version }
|
||||
|
||||
def initialize(tags = [])
|
||||
@version = tags.find { |tag| tags.delete(tag) if tag =~ /(\d\.)+\d/ }
|
||||
super
|
||||
@version = tags.shift if tags.first.to_s.match?(/(\d\.)+\d/)
|
||||
super(tags)
|
||||
end
|
||||
|
||||
def xcode_installed_version
|
||||
@ -40,6 +40,6 @@ class XcodeRequirement < Requirement
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>"
|
||||
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>"
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
require_relative "load_path"
|
||||
|
||||
require "rubocop-rspec"
|
||||
require "rubocops/formula_desc_cop"
|
||||
require "rubocops/components_order_cop"
|
||||
require "rubocops/components_redundancy_cop"
|
||||
|
||||
@ -6,6 +6,7 @@ module RuboCop
|
||||
# This cop audits `options` in Formulae.
|
||||
class Options < FormulaCop
|
||||
DEPRECATION_MSG = "macOS has been 64-bit only since 10.6 so 32-bit options are deprecated.".freeze
|
||||
UNI_DEPRECATION_MSG = "macOS has been 64-bit only since 10.6 so universal options are deprecated.".freeze
|
||||
|
||||
def audit_formula(_node, _class_node, _parent_class_node, body_node)
|
||||
option_call_nodes = find_every_method_call_by_name(body_node, :option)
|
||||
@ -13,20 +14,11 @@ module RuboCop
|
||||
option = parameters(option_call).first
|
||||
problem DEPRECATION_MSG if regex_match_group(option, /32-bit/)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module FormulaAuditStrict
|
||||
class Options < FormulaCop
|
||||
DEPRECATION_MSG = "macOS has been 64-bit only since 10.6 so universal options are deprecated.".freeze
|
||||
|
||||
def audit_formula(_node, _class_node, _parent_class_node, body_node)
|
||||
option_call_nodes = find_every_method_call_by_name(body_node, :option)
|
||||
option_call_nodes.each do |option_call|
|
||||
offending_node(option_call)
|
||||
option = string_content(parameters(option_call).first)
|
||||
problem DEPRECATION_MSG if option == "universal"
|
||||
problem UNI_DEPRECATION_MSG if option == "universal"
|
||||
|
||||
if option !~ /with(out)?-/ &&
|
||||
option != "cxx11" &&
|
||||
|
||||
@ -43,6 +43,7 @@ module RuboCop
|
||||
%r{^http://code\.google\.com/},
|
||||
%r{^http://fossies\.org/},
|
||||
%r{^http://mirrors\.kernel\.org/},
|
||||
%r{^http://mirrors\.ocf\.berkeley\.edu/},
|
||||
%r{^http://(?:[^/]*\.)?bintray\.com/},
|
||||
%r{^http://tools\.ietf\.org/},
|
||||
%r{^http://launchpad\.net/},
|
||||
@ -125,10 +126,19 @@ module RuboCop
|
||||
problem <<~EOS
|
||||
Please use a secure mirror for Debian URLs.
|
||||
We recommend:
|
||||
https://mirrors.ocf.berkeley.edu/debian/#{match[1]}
|
||||
https://deb.debian.org/debian/#{match[1]}
|
||||
EOS
|
||||
end
|
||||
|
||||
# Check to use canonical urls for Debian packages
|
||||
noncanon_deb_pattern =
|
||||
Regexp.union([%r{^https://mirrors\.kernel\.org/debian/},
|
||||
%r{^https://mirrors\.ocf\.berkeley\.edu/debian/},
|
||||
%r{^https://(?:[^/]*\.)?mirrorservice\.org/sites/ftp\.debian\.org/debian/}])
|
||||
audit_urls(urls, noncanon_deb_pattern) do |_, url|
|
||||
problem "Please use https://deb.debian.org/debian/ for #{url}"
|
||||
end
|
||||
|
||||
# Check for new-url Google Code download urls, https:// is preferred
|
||||
google_code_pattern = Regexp.union([%r{^http://.*\.googlecode\.com/files.*},
|
||||
%r{^http://code\.google\.com/}])
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# This script because we support $GIT, $HOMEBREW_SVN, etc., Xcode-only and
|
||||
# This script because we support $HOMEBREW_GIT, $HOMEBREW_SVN, etc., Xcode-only and
|
||||
# no Xcode/CLT configurations. Order is careful to be what the user would want.
|
||||
|
||||
set +o posix
|
||||
|
||||
@ -212,7 +212,6 @@ class SoftwareSpec
|
||||
end
|
||||
|
||||
def fails_with(compiler, &block)
|
||||
odisabled "fails_with :llvm" if compiler == :llvm
|
||||
compiler_failures << CompilerFailure.create(compiler, &block)
|
||||
end
|
||||
|
||||
|
||||
@ -123,7 +123,6 @@ class SystemConfig
|
||||
HOMEBREW_CACHE: "#{ENV["HOME"]}/Library/Caches/Homebrew",
|
||||
HOMEBREW_TEMP: ENV["HOMEBREW_SYSTEM_TEMP"],
|
||||
HOMEBREW_RUBY_WARNINGS: "-W0",
|
||||
HOMEBREW_GIT: "git",
|
||||
}.freeze
|
||||
boring_keys = %w[
|
||||
HOMEBREW_BROWSER
|
||||
@ -137,10 +136,12 @@ class SystemConfig
|
||||
HOMEBREW_BREW_FILE
|
||||
HOMEBREW_COMMAND_DEPTH
|
||||
HOMEBREW_CURL
|
||||
HOMEBREW_GIT
|
||||
HOMEBREW_GIT_CONFIG_FILE
|
||||
HOMEBREW_LIBRARY
|
||||
HOMEBREW_MACOS_VERSION
|
||||
HOMEBREW_MACOS_VERSION_NUMERIC
|
||||
HOMEBREW_MINIMUM_GIT_VERSION
|
||||
HOMEBREW_RUBY_PATH
|
||||
HOMEBREW_SYSTEM
|
||||
HOMEBREW_SYSTEM_TEMP
|
||||
@ -168,9 +169,6 @@ class SystemConfig
|
||||
if defaults_hash[:HOMEBREW_RUBY_WARNINGS] != ENV["HOMEBREW_RUBY_WARNINGS"].to_s
|
||||
f.puts "HOMEBREW_RUBY_WARNINGS: #{ENV["HOMEBREW_RUBY_WARNINGS"]}"
|
||||
end
|
||||
if defaults_hash[:HOMEBREW_GIT] != ENV["HOMEBREW_GIT"].to_s
|
||||
f.puts "HOMEBREW_GIT: #{ENV["HOMEBREW_GIT"]}"
|
||||
end
|
||||
unless ENV["HOMEBREW_ENV"]
|
||||
ENV.sort.each do |key, value|
|
||||
next unless key.start_with?("HOMEBREW_")
|
||||
|
||||
@ -121,17 +121,6 @@ RSpec/RepeatedDescription:
|
||||
- 'rubocops/lines_cop_spec.rb'
|
||||
- 'tab_spec.rb'
|
||||
|
||||
# Offense count: 10
|
||||
RSpec/RepeatedExample:
|
||||
Exclude:
|
||||
- 'compiler_selector_spec.rb'
|
||||
- 'utils/shell_spec.rb'
|
||||
|
||||
# Offense count: 2
|
||||
RSpec/ScatteredLet:
|
||||
Exclude:
|
||||
- 'cask/artifact/uninstall_zap_shared_examples.rb'
|
||||
|
||||
# Offense count: 31
|
||||
RSpec/SubjectStub:
|
||||
Exclude:
|
||||
|
||||
@ -8,7 +8,6 @@ gem "rspec-its", require: false
|
||||
gem "rspec-retry", require: false
|
||||
gem "rspec-wait", require: false
|
||||
gem "rubocop", HOMEBREW_RUBOCOP_VERSION
|
||||
gem "rubocop-rspec", require: false
|
||||
|
||||
group :development do
|
||||
gem "ronn", require: false
|
||||
|
||||
@ -13,9 +13,9 @@ GEM
|
||||
json (2.1.0)
|
||||
mustache (1.1.0)
|
||||
parallel (1.12.1)
|
||||
parallel_tests (2.23.0)
|
||||
parallel_tests (2.26.0)
|
||||
parallel
|
||||
parser (2.5.1.2)
|
||||
parser (2.5.3.0)
|
||||
ast (~> 2.4.0)
|
||||
powerpack (0.1.2)
|
||||
rainbow (3.0.0)
|
||||
@ -52,8 +52,6 @@ GEM
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (~> 1.0, >= 1.0.1)
|
||||
rubocop-rspec (1.30.0)
|
||||
rubocop (>= 0.58.0)
|
||||
ruby-progressbar (1.10.0)
|
||||
simplecov (0.16.1)
|
||||
docile (~> 1.1)
|
||||
@ -77,7 +75,6 @@ DEPENDENCIES
|
||||
rspec-retry
|
||||
rspec-wait
|
||||
rubocop (= 0.59.1)
|
||||
rubocop-rspec
|
||||
simplecov
|
||||
simplecov-cobertura
|
||||
|
||||
|
||||
@ -158,6 +158,8 @@ shared_examples "#uninstall_phase or #zap_phase" do
|
||||
let(:glob_path1) { Pathname.new("#{dir}/glob_path1") }
|
||||
let(:glob_path2) { Pathname.new("#{dir}/glob_path2") }
|
||||
let(:paths) { [absolute_path, path_with_tilde, glob_path1, glob_path2] }
|
||||
let(:fake_system_command) { NeverSudoSystemCommand }
|
||||
let(:cask) { Cask::CaskLoader.load(cask_path("with-#{artifact_dsl_key}-#{directive}")) }
|
||||
|
||||
around(:each) do |example|
|
||||
begin
|
||||
@ -171,9 +173,6 @@ shared_examples "#uninstall_phase or #zap_phase" do
|
||||
end
|
||||
end
|
||||
|
||||
let(:fake_system_command) { NeverSudoSystemCommand }
|
||||
let(:cask) { Cask::CaskLoader.load(cask_path("with-#{artifact_dsl_key}-#{directive}")) }
|
||||
|
||||
before(:each) do
|
||||
allow_any_instance_of(Cask::Artifact::AbstractUninstall).to receive(:trash_paths)
|
||||
.and_wrap_original do |method, *args|
|
||||
|
||||
@ -46,6 +46,11 @@ describe Homebrew::CLI::Parser do
|
||||
parser.parse([])
|
||||
expect(Homebrew.args.pry?).to be true
|
||||
end
|
||||
|
||||
it ":verbose with custom description" do
|
||||
_, _, _, desc = parser.processed_options.find { |short, _| short == "-v" }
|
||||
expect(desc).to eq "Flag for verbosity"
|
||||
end
|
||||
end
|
||||
|
||||
describe "test long flag options" do
|
||||
@ -71,6 +76,20 @@ describe Homebrew::CLI::Parser do
|
||||
end
|
||||
end
|
||||
|
||||
describe "test short flag options" do
|
||||
subject(:parser) {
|
||||
described_class.new do
|
||||
flag "-f", "--filename=", description: "Name of the file"
|
||||
end
|
||||
}
|
||||
|
||||
it "parses a short flag option with its argument" do
|
||||
parser.parse(["--filename=random.txt"])
|
||||
expect(Homebrew.args.filename).to eq "random.txt"
|
||||
expect(Homebrew.args.f).to eq "random.txt"
|
||||
end
|
||||
end
|
||||
|
||||
describe "test constraints for flag options" do
|
||||
subject(:parser) {
|
||||
described_class.new do
|
||||
@ -158,4 +177,18 @@ describe Homebrew::CLI::Parser do
|
||||
expect(Homebrew.args.switch_b?).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe "test immutability of args" do
|
||||
subject(:parser) {
|
||||
described_class.new do
|
||||
switch "-a", "--switch-a"
|
||||
switch "-b", "--switch-b"
|
||||
end
|
||||
}
|
||||
|
||||
it "raises exception upon Homebrew.args mutation" do
|
||||
parser.parse(["--switch-a"])
|
||||
expect { parser.parse(["--switch-b"]) }.to raise_error(RuntimeError, /can't modify frozen OpenStruct/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -23,6 +23,13 @@ end
|
||||
describe Homebrew do
|
||||
let(:remote) { "https://github.com/Homebrew/homebrew-core" }
|
||||
|
||||
specify "::analytics_table" do
|
||||
results = { ack: 10, wget: 100 }
|
||||
expect { subject.analytics_table("install", "30", results) }
|
||||
.to output(/110 | 100.00%/).to_stdout
|
||||
.and not_to_output.to_stderr
|
||||
end
|
||||
|
||||
specify "::github_remote_path" do
|
||||
expect(subject.github_remote_path(remote, "Formula/git.rb"))
|
||||
.to eq("https://github.com/Homebrew/homebrew-core/blob/master/Formula/git.rb")
|
||||
|
||||
@ -27,29 +27,10 @@ describe CompilerSelector do
|
||||
end
|
||||
|
||||
describe "#compiler" do
|
||||
it "raises an error if no matching compiler can be found" do
|
||||
software_spec.fails_with(:clang)
|
||||
software_spec.fails_with(:gcc_4_2)
|
||||
software_spec.fails_with(gcc: "4.8")
|
||||
software_spec.fails_with(gcc: "4.7")
|
||||
|
||||
expect { subject.compiler }.to raise_error(CompilerSelectionError)
|
||||
end
|
||||
|
||||
it "defaults to cc" do
|
||||
expect(subject.compiler).to eq(cc)
|
||||
end
|
||||
|
||||
it "returns gcc if it fails with clang" do
|
||||
software_spec.fails_with(:clang)
|
||||
expect(subject.compiler).to eq(:gcc_4_2)
|
||||
end
|
||||
|
||||
it "returns clang if it fails with gcc" do
|
||||
software_spec.fails_with(:gcc_4_2)
|
||||
expect(subject.compiler).to eq(:clang)
|
||||
end
|
||||
|
||||
it "returns clang if it fails with non-Apple gcc" do
|
||||
software_spec.fails_with(gcc: "4.8")
|
||||
expect(subject.compiler).to eq(:clang)
|
||||
@ -84,23 +65,7 @@ describe CompilerSelector do
|
||||
expect(subject.compiler).to eq("gcc-4.7")
|
||||
end
|
||||
|
||||
it "prefers gcc" do
|
||||
software_spec.fails_with(:clang)
|
||||
software_spec.fails_with(:gcc_4_2)
|
||||
expect(subject.compiler).to eq("gcc-4.8")
|
||||
end
|
||||
|
||||
it "raises an error when gcc is missing" do
|
||||
allow(versions).to receive(:gcc_4_2_build_version).and_return(Version::NULL)
|
||||
|
||||
software_spec.fails_with(:clang)
|
||||
software_spec.fails_with(gcc: "4.8")
|
||||
software_spec.fails_with(gcc: "4.7")
|
||||
|
||||
expect { subject.compiler }.to raise_error(CompilerSelectionError)
|
||||
end
|
||||
|
||||
it "raises an error when llvm and gcc are missing" do
|
||||
it "raises an error when gcc or llvm is missing" do
|
||||
allow(versions).to receive(:gcc_4_2_build_version).and_return(Version::NULL)
|
||||
|
||||
software_spec.fails_with(:clang)
|
||||
|
||||
@ -38,7 +38,7 @@ describe DependencyCollector do
|
||||
end
|
||||
|
||||
specify "requirement tags" do
|
||||
subject.add x11: "2.5.1"
|
||||
subject.add :x11
|
||||
subject.add xcode: :build
|
||||
expect(find_requirement(X11Requirement).tags).to be_empty
|
||||
expect(find_requirement(XcodeRequirement)).to be_a_build_requirement
|
||||
|
||||
@ -8,7 +8,7 @@ describe "brew bottle", :integration_test do
|
||||
(HOMEBREW_CELLAR/"patchelf/1.0/bin").mkpath
|
||||
|
||||
expect { brew "bottle", "--no-rebuild", testball }
|
||||
.to output(/Formula not from core or any taps/).to_stderr
|
||||
.to output(/Formula not from core or any installed taps/).to_stderr
|
||||
.and not_to_output.to_stdout
|
||||
.and be_a_failure
|
||||
|
||||
|
||||
@ -18,6 +18,7 @@ describe FormulaInstaller do
|
||||
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)
|
||||
described_class.new(formula).install
|
||||
|
||||
@ -798,7 +798,7 @@ describe Formula do
|
||||
stub_formula_loader(f1)
|
||||
|
||||
java = JavaRequirement.new
|
||||
x11 = X11Requirement.new("x11", [:recommended])
|
||||
x11 = X11Requirement.new([:recommended])
|
||||
xcode = XcodeRequirement.new(["1.0", :optional])
|
||||
|
||||
expect(Set.new(f1.recursive_requirements)).to eq(Set[java, x11])
|
||||
|
||||
@ -138,6 +138,7 @@ describe Formulary do
|
||||
context "with installed Formula" do
|
||||
before do
|
||||
allow(described_class).to receive(:loader_for).and_call_original
|
||||
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)
|
||||
end
|
||||
|
||||
@ -14,7 +14,7 @@ describe JavaRequirement do
|
||||
describe "#inspect" do
|
||||
subject { described_class.new(%w[1.7+]) }
|
||||
|
||||
its(:inspect) { is_expected.to eq('#<JavaRequirement: "java" [] version="1.7+">') }
|
||||
its(:inspect) { is_expected.to eq('#<JavaRequirement: [] version="1.7+">') }
|
||||
end
|
||||
|
||||
describe "#display_s" do
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
require "requirements/codesign_requirement"
|
||||
|
||||
describe CodesignRequirement do
|
||||
subject(:requirement) {
|
||||
described_class.new([{ identity: identity, with: with, url: url }])
|
||||
}
|
||||
|
||||
let(:identity) { "lldb_codesign" }
|
||||
let(:with) { "LLDB" }
|
||||
let(:url) {
|
||||
"https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt"
|
||||
}
|
||||
|
||||
describe "#message" do
|
||||
it "includes all parameters" do
|
||||
expect(requirement.message).to include(identity)
|
||||
expect(requirement.message).to include(with)
|
||||
expect(requirement.message).to include(url)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,9 +0,0 @@
|
||||
require "requirements/non_binary_osxfuse_requirement"
|
||||
|
||||
describe NonBinaryOsxfuseRequirement, :needs_macos do
|
||||
subject { described_class.new([]) }
|
||||
|
||||
describe "#message" do
|
||||
its(:message) { is_expected.to match("osxfuse is already installed from the binary distribution") }
|
||||
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