aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Library/.rubocop.yml5
-rw-r--r--Library/Homebrew/dev-cmd/audit.rb56
-rw-r--r--Library/Homebrew/diagnostic.rb2
-rw-r--r--Library/Homebrew/download_strategy.rb3
-rw-r--r--Library/Homebrew/formula.rb12
-rw-r--r--Library/Homebrew/formula_installer.rb1
-rw-r--r--Library/Homebrew/keg.rb5
-rw-r--r--Library/Homebrew/manpages/brew.1.md.erb39
-rw-r--r--Library/Homebrew/rubocops/components_order_cop.rb57
-rw-r--r--Library/Homebrew/rubocops/extend/formula_cop.rb5
-rw-r--r--Library/Homebrew/sandbox.rb4
-rwxr-xr-xLibrary/Homebrew/shims/scm/git1
-rw-r--r--Library/Homebrew/test/diagnostic_spec.rb2
-rw-r--r--Library/Homebrew/test/rubocops/components_order_cop_spec.rb47
-rw-r--r--Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb25
-rw-r--r--Library/Homebrew/utils.rb4
-rwxr-xr-xbin/brew9
-rw-r--r--docs/Manpage.md39
-rw-r--r--docs/Python-for-Formula-Authors.md2
-rw-r--r--docs/_layouts/index.html2
-rw-r--r--docs/css/reset.css53
-rw-r--r--docs/css/screen.css389
-rw-r--r--docs/css/screen.scss488
-rw-r--r--manpages/brew.142
24 files changed, 729 insertions, 563 deletions
diff --git a/Library/.rubocop.yml b/Library/.rubocop.yml
index dcfae5c5c..12886a508 100644
--- a/Library/.rubocop.yml
+++ b/Library/.rubocop.yml
@@ -43,6 +43,11 @@ Metrics/MethodLength:
Metrics/ModuleLength:
CountComments: false
+ Exclude:
+ - '**/bin/**/*'
+ - '**/cmd/**/*'
+ - '**/lib/**/*'
+ - '**/spec/**/*'
Metrics/PerceivedComplexity:
Enabled: false
diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb
index 0b9fe0a7e..cbe26b422 100644
--- a/Library/Homebrew/dev-cmd/audit.rb
+++ b/Library/Homebrew/dev-cmd/audit.rb
@@ -307,25 +307,41 @@ class FormulaAuditor
unversioned_name = unversioned_formula.basename(".rb")
problem "#{formula} is versioned but no #{unversioned_name} formula exists"
end
- elsif ARGV.build_stable?
- versioned_formulae = Dir[formula.path.to_s.gsub(/\.rb$/, "@*.rb")]
- needs_versioned_alias = !versioned_formulae.empty? &&
- formula.tap &&
- formula.aliases.grep(/.@\d/).empty?
- if needs_versioned_alias
- _, last_alias_version = File.basename(versioned_formulae.sort.reverse.first)
- .gsub(/\.rb$/, "")
- .split("@")
- major, minor, = formula.version.to_s.split(".")
- alias_name = if last_alias_version.split(".").length == 1
- "#{formula.name}@#{major}"
+ elsif ARGV.build_stable? &&
+ !(versioned_formulae = Dir[formula.path.to_s.gsub(/\.rb$/, "@*.rb")]).empty?
+ versioned_aliases = formula.aliases.grep(/.@\d/)
+ _, last_alias_version =
+ File.basename(versioned_formulae.sort.reverse.first)
+ .gsub(/\.rb$/, "").split("@")
+ major, minor, = formula.version.to_s.split(".")
+ alias_name_major = "#{formula.name}@#{major}"
+ alias_name_major_minor = "#{alias_name_major}.#{minor}"
+ alias_name = if last_alias_version.split(".").length == 1
+ alias_name_major
+ else
+ alias_name_major_minor
+ end
+ valid_alias_names = [alias_name_major, alias_name_major_minor]
+
+ valid_versioned_aliases = versioned_aliases & valid_alias_names
+ invalid_versioned_aliases = versioned_aliases - valid_alias_names
+
+ if valid_versioned_aliases.empty?
+ if formula.tap
+ problem <<-EOS.undent
+ Formula has other versions so create a versioned alias:
+ cd #{formula.tap.alias_dir}
+ ln -s #{formula.path.to_s.gsub(formula.tap.path, "..")} #{alias_name}
+ EOS
else
- "#{formula.name}@#{major}.#{minor}"
+ problem "Formula has other versions so create an alias named #{alias_name}."
end
+ end
+
+ unless invalid_versioned_aliases.empty?
problem <<-EOS.undent
- Formula has other versions so create an alias:
- cd #{formula.tap.alias_dir}
- ln -s #{formula.path.to_s.gsub(formula.tap.path, "..")} #{alias_name}
+ Formula has invalid versioned aliases:
+ #{invalid_versioned_aliases.join("\n ")}
EOS
end
end
@@ -967,8 +983,12 @@ class FormulaAuditor
problem "#{$2} modules should be vendored rather than use deprecated `depends_on \"#{$1}\" => :#{$2}#{$3}`"
end
- if line =~ /depends_on\s+['"](.+)['"]\s+=>\s+.*(?<!\?[( ])['"](.+)['"]/
- problem "Dependency #{$1} should not use option #{$2}"
+ if line =~ /depends_on\s+['"](.+)['"]\s+=>\s+(.*)/
+ dep = $1
+ $2.split(" ").map do |o|
+ next unless o =~ /^\[?['"](.*)['"]/
+ problem "Dependency #{dep} should not use option #{$1}"
+ end
end
# Commented-out depends_on
diff --git a/Library/Homebrew/diagnostic.rb b/Library/Homebrew/diagnostic.rb
index 1544e6765..6bb5c8b8e 100644
--- a/Library/Homebrew/diagnostic.rb
+++ b/Library/Homebrew/diagnostic.rb
@@ -100,7 +100,7 @@ module Homebrew
# See https://github.com/Homebrew/legacy-homebrew/pull/9986
def check_path_for_trailing_slashes
- bad_paths = PATH.new(ENV["PATH"]).select { |p| p.end_with?("/") }
+ bad_paths = PATH.new(ENV["HOMEBREW_PATH"]).select { |p| p.end_with?("/") }
return if bad_paths.empty?
inject_file_list bad_paths, <<-EOS.undent
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index a0025cef3..d74efe0bb 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -520,6 +520,9 @@ class S3DownloadStrategy < CurlDownloadStrategy
bucket = $1
key = $2
+ ENV["AWS_ACCESS_KEY_ID"] = ENV["HOMEBREW_AWS_ACCESS_KEY_ID"]
+ ENV["AWS_SECRET_ACCESS_KEY"] = ENV["HOMEBREW_AWS_SECRET_ACCESS_KEY"]
+
obj = AWS::S3.new.buckets[bucket].objects[key]
begin
s3url = obj.url_for(:get)
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index 17a34dd13..1b3b718da 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -1943,8 +1943,10 @@ class Formula
old_curl_home = ENV["CURL_HOME"]
old_path = ENV["HOMEBREW_PATH"]
- ENV["HOME"] = env_home
- ENV["CURL_HOME"] = old_curl_home || old_home
+ unless ARGV.interactive?
+ ENV["HOME"] = env_home
+ ENV["CURL_HOME"] = old_curl_home || old_home
+ end
ENV["HOMEBREW_PATH"] = nil
setup_home env_home
@@ -1955,8 +1957,10 @@ class Formula
yield staging
ensure
@buildpath = nil
- ENV["HOME"] = old_home
- ENV["CURL_HOME"] = old_curl_home
+ unless ARGV.interactive?
+ ENV["HOME"] = old_home
+ ENV["CURL_HOME"] = old_curl_home
+ end
ENV["HOMEBREW_PATH"] = old_path
end
end
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index ad87c2a5f..f50d9ed9e 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -664,6 +664,7 @@ class FormulaInstaller
sandbox = Sandbox.new
formula.logs.mkpath
sandbox.record_log(formula.logs/"build.sandbox.log")
+ sandbox.allow_write_path(ENV["HOME"]) if ARGV.interactive?
sandbox.allow_write_temp_and_cache
sandbox.allow_write_log(formula)
sandbox.allow_write_xcode
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb
index d4b9c5d77..8733def27 100644
--- a/Library/Homebrew/keg.rb
+++ b/Library/Homebrew/keg.rb
@@ -468,7 +468,10 @@ class Keg
end
def aliases
- Formulary.from_rack(rack).aliases
+ formula = Formulary.from_rack(rack)
+ aliases = formula.aliases
+ return aliases if formula.stable?
+ aliases.reject { |a| a.include?("@") }
rescue FormulaUnavailableError
[]
end
diff --git a/Library/Homebrew/manpages/brew.1.md.erb b/Library/Homebrew/manpages/brew.1.md.erb
index 5b0228e3f..29f8d0bec 100644
--- a/Library/Homebrew/manpages/brew.1.md.erb
+++ b/Library/Homebrew/manpages/brew.1.md.erb
@@ -98,8 +98,15 @@ can take several different forms:
The formula file will be cached for later use.
## ENVIRONMENT
+ * `HOMEBREW_ARTIFACT_DOMAIN`:
+ If set, instructs Homebrew to use the given URL as a download mirror for bottles and binaries.
+
+ * `HOMEBREW_AUTO_UPDATE_SECS`:
+ If set, Homebrew will only check for autoupdates once per this seconds interval.
+
+ *Default:* `60`.
- * `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`:
+ * `HOMEBREW_AWS_ACCESS_KEY_ID`, `HOMEBREW_AWS_SECRET_ACCESS_KEY`:
When using the `S3` download strategy, Homebrew will look in
these variables for access credentials (see
<https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-environment>
@@ -107,30 +114,9 @@ can take several different forms:
the `S3` download strategy will download with a public
(unsigned) URL.
- * `BROWSER`:
- If set, and `HOMEBREW_BROWSER` is not, use `BROWSER` as the web browser
- when opening project homepages.
-
- * `EDITOR`:
- If set, and `HOMEBREW_EDITOR` and `VISUAL` are not, use `EDITOR` as the text editor.
-
- * `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_BOTTLE_DOMAIN`:
If set, instructs Homebrew to use the given URL as a download mirror for bottles.
- * `HOMEBREW_ARTIFACT_DOMAIN`:
- If set, instructs Homebrew to use the given URL as a download mirror for bottles and binaries.
-
- * `HOMEBREW_AUTO_UPDATE_SECS`:
- If set, Homebrew will only check for autoupdates once per this seconds interval.
-
- *Default:* `60`.
-
* `HOMEBREW_BROWSER`:
If set, uses this setting as the browser when opening project homepages,
instead of the OS default browser.
@@ -178,6 +164,12 @@ can take several different forms:
If set, Homebrew will always use its vendored, relocatable Ruby 2.0 version
even if the system version of Ruby is >=2.0.
+ * `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_GITHUB_API_TOKEN`:
A personal access token for the GitHub API, which you can create at
<https://github.com/settings/tokens>. If set, GitHub will allow you a
@@ -243,9 +235,6 @@ can take several different forms:
* `HOMEBREW_VERBOSE`:
If set, Homebrew always assumes `--verbose` when running commands.
- * `VISUAL`:
- If set, and `HOMEBREW_EDITOR` is not, use `VISUAL` as the text editor.
-
## USING HOMEBREW BEHIND A PROXY
Homebrew uses several commands for downloading files (e.g. `curl`, `git`, `svn`).
diff --git a/Library/Homebrew/rubocops/components_order_cop.rb b/Library/Homebrew/rubocops/components_order_cop.rb
index a6259133d..dfddbe145 100644
--- a/Library/Homebrew/rubocops/components_order_cop.rb
+++ b/Library/Homebrew/rubocops/components_order_cop.rb
@@ -36,7 +36,7 @@ module RuboCop
[{ name: :test, type: :block_call }],
]
- present_components = component_precedence_list.map do |components|
+ @present_components = component_precedence_list.map do |components|
relevant_components = []
components.each do |component|
case component[:type]
@@ -51,20 +51,63 @@ module RuboCop
relevant_components.delete_if(&:nil?)
end
- present_components = present_components.delete_if(&:empty?)
-
- present_components.each_cons(2) do |preceding_component, succeeding_component|
- offensive_nodes = check_precedence(preceding_component, succeeding_component)
- component_problem offensive_nodes[0], offensive_nodes[1] if offensive_nodes
+ # Check if each present_components is above rest of the present_components
+ @present_components.take(@present_components.size-1).each_with_index do |preceding_component, p_idx|
+ next if preceding_component.empty?
+ @present_components.drop(p_idx+1).each do |succeeding_component|
+ next if succeeding_component.empty?
+ @offensive_nodes = check_precedence(preceding_component, succeeding_component)
+ component_problem @offensive_nodes[0], @offensive_nodes[1] if @offensive_nodes
+ end
end
end
private
+ # Method to format message for reporting component precedence violations
def component_problem(c1, c2)
- # Method to format message for reporting component precedence violations
problem "`#{format_component(c1)}` (line #{line_number(c1)}) should be put before `#{format_component(c2)}` (line #{line_number(c2)})"
end
+
+ # autocorrect method gets called just after component_problem method call
+ def autocorrect(_node)
+ succeeding_node = @offensive_nodes[0]
+ preceding_node = @offensive_nodes[1]
+ lambda do |corrector|
+ reorder_components(corrector, succeeding_node, preceding_node)
+ end
+ end
+
+ # Reorder two nodes in the source, using the corrector instance in autocorrect method
+ # Components of same type are grouped together when rewriting the source
+ # Linebreaks are introduced if components are of two different methods/blocks/multilines
+ def reorder_components(corrector, node1, node2)
+ # order_idx : node1's index in component_precedence_list
+ # curr_p_idx: node1's index in preceding_comp_arr
+ # preceding_comp_arr: array containing components of same type
+ order_idx, curr_p_idx, preceding_comp_arr = get_state(node1)
+
+ # curr_p_idx > 0 means node1 needs to be grouped with its own kind
+ if curr_p_idx>0
+ node2 = preceding_comp_arr[curr_p_idx-1]
+ indentation = " " * (start_column(node2) - line_start_column(node2))
+ line_breaks = node2.multiline? ? "\n\n" : "\n"
+ corrector.insert_after(node2.source_range, line_breaks+indentation+node1.source)
+ else
+ indentation = " " * (start_column(node2) - line_start_column(node2))
+ # No line breaks upto version_scheme, order_idx == 8
+ line_breaks = order_idx>8 ? "\n\n" : "\n"
+ corrector.insert_before(node2.source_range, node1.source+line_breaks+indentation)
+ end
+ corrector.remove(range_with_surrounding_space(node1.source_range, :left))
+ end
+
+ # Returns precedence index and component's index to properly reorder and group during autocorrect
+ def get_state(node1)
+ @present_components.each_with_index do |comp, idx|
+ return [idx, comp.index(node1), comp] if comp.member?(node1)
+ end
+ end
end
end
end
diff --git a/Library/Homebrew/rubocops/extend/formula_cop.rb b/Library/Homebrew/rubocops/extend/formula_cop.rb
index 4120be6ef..3f70086b3 100644
--- a/Library/Homebrew/rubocops/extend/formula_cop.rb
+++ b/Library/Homebrew/rubocops/extend/formula_cop.rb
@@ -180,9 +180,10 @@ module RuboCop
node.source_range.source_buffer
end
- # Returns the string representation if node is of type str
+ # Returns the string representation if node is of type str(plain) or dstr(interpolated)
def string_content(node)
- node.str_content if node.type == :str
+ return node.str_content if node.type == :str
+ node.each_child_node(:str).map(&:str_content).join("") if node.type == :dstr
end
# Returns printable component name
diff --git a/Library/Homebrew/sandbox.rb b/Library/Homebrew/sandbox.rb
index 9597dafa8..b16bbde1a 100644
--- a/Library/Homebrew/sandbox.rb
+++ b/Library/Homebrew/sandbox.rb
@@ -5,10 +5,6 @@ class Sandbox
SANDBOX_EXEC = "/usr/bin/sandbox-exec".freeze
SANDBOXED_TAPS = %w[
homebrew/core
- homebrew/dupes
- homebrew/fuse
- homebrew/devel-only
- homebrew/tex
].freeze
def self.available?
diff --git a/Library/Homebrew/shims/scm/git b/Library/Homebrew/shims/scm/git
index 82bb47c25..bfb779c25 100755
--- a/Library/Homebrew/shims/scm/git
+++ b/Library/Homebrew/shims/scm/git
@@ -86,7 +86,6 @@ fi
case "$(lowercase "$SCM_FILE")" in
git)
[[ -n "$HOMEBREW_GIT" ]] && safe_exec "$(which "$HOMEBREW_GIT")" "$@"
- [[ -n "$GIT" ]] && safe_exec "$(which "$GIT")" "$@"
;;
svn)
[[ -n "$HOMEBREW_SVN" ]] && safe_exec "$(which "$HOMEBREW_SVN")" "$@"
diff --git a/Library/Homebrew/test/diagnostic_spec.rb b/Library/Homebrew/test/diagnostic_spec.rb
index 12a8e0c42..c4373671e 100644
--- a/Library/Homebrew/test/diagnostic_spec.rb
+++ b/Library/Homebrew/test/diagnostic_spec.rb
@@ -7,7 +7,7 @@ describe Homebrew::Diagnostic::Checks do
end
specify "#check_path_for_trailing_slashes" do
- ENV["PATH"] += File::PATH_SEPARATOR + "/foo/bar/"
+ ENV["HOMEBREW_PATH"] += File::PATH_SEPARATOR + "/foo/bar/"
expect(subject.check_path_for_trailing_slashes)
.to match("Some directories in your path end in a slash")
end
diff --git a/Library/Homebrew/test/rubocops/components_order_cop_spec.rb b/Library/Homebrew/test/rubocops/components_order_cop_spec.rb
index 05ff53d8f..25467c635 100644
--- a/Library/Homebrew/test/rubocops/components_order_cop_spec.rb
+++ b/Library/Homebrew/test/rubocops/components_order_cop_spec.rb
@@ -113,4 +113,51 @@ describe RuboCop::Cop::FormulaAuditStrict::ComponentsOrder do
expect(actual.column).to eq(expected[:column])
end
end
+
+ context "When auditing formula components order with autocorrect" do
+ it "When url precedes homepage" do
+ source = <<-EOS.undent
+ class Foo < Formula
+ url "http://example.com/foo-1.0.tgz"
+ homepage "http://example.com"
+ end
+ EOS
+ correct_source = <<-EOS.undent
+ class Foo < Formula
+ homepage "http://example.com"
+ url "http://example.com/foo-1.0.tgz"
+ end
+ EOS
+
+ corrected_source = autocorrect_source(cop, source)
+ expect(corrected_source).to eq(correct_source)
+ end
+
+ it "When `resource` precedes `depends_on`" do
+ source = <<-EOS.undent
+ class Foo < Formula
+ url "https://example.com/foo-1.0.tgz"
+
+ resource "foo2" do
+ url "https://example.com/foo-2.0.tgz"
+ end
+
+ depends_on "openssl"
+ end
+ EOS
+ correct_source = <<-EOS.undent
+ class Foo < Formula
+ url "https://example.com/foo-1.0.tgz"
+
+ depends_on "openssl"
+
+ resource "foo2" do
+ url "https://example.com/foo-2.0.tgz"
+ end
+ end
+ EOS
+ corrected_source = autocorrect_source(cop, source)
+ expect(corrected_source).to eq(correct_source)
+ end
+ end
end
diff --git a/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb b/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb
index 581667935..432b15e3c 100644
--- a/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb
+++ b/Library/Homebrew/test/rubocops/formula_desc_cop_spec.rb
@@ -51,6 +51,31 @@ describe RuboCop::Cop::FormulaAuditStrict::Desc do
end
end
+ it "When desc is multiline string" do
+ source = <<-EOS.undent
+ class Foo < Formula
+ url 'http://example.com/foo-1.0.tgz'
+ desc '#{"bar"*10}'\
+ '#{"foo"*21}'
+ end
+ EOS
+
+ msg = <<-EOS.undent
+ Description is too long. "name: desc" should be less than 80 characters.
+ Length is calculated as Foo + desc. (currently 98)
+ EOS
+ expected_offenses = [{ message: msg,
+ severity: :convention,
+ line: 3,
+ column: 2,
+ source: source }]
+
+ inspect_source(cop, source)
+ expected_offenses.zip(cop.offenses).each do |expected, actual|
+ expect_offense(expected, actual)
+ end
+ end
+
it "When wrong \"command-line\" usage in desc" do
source = <<-EOS.undent
class Foo < Formula
diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb
index c37633e41..28d7fc283 100644
--- a/Library/Homebrew/utils.rb
+++ b/Library/Homebrew/utils.rb
@@ -320,7 +320,7 @@ def which_all(cmd, path = ENV["PATH"])
end
def which_editor
- editor = ENV.values_at("HOMEBREW_EDITOR", "VISUAL").compact.reject(&:empty?).first
+ editor = ENV.values_at("HOMEBREW_EDITOR", "HOMEBREW_VISUAL").compact.reject(&:empty?).first
if editor
editor_name, _, editor_args = editor.partition " "
editor_path = which(editor_name, ENV["HOMEBREW_PATH"])
@@ -356,7 +356,7 @@ def exec_editor(*args)
end
def exec_browser(*args)
- browser = ENV["HOMEBREW_BROWSER"] || ENV["BROWSER"]
+ browser = ENV["HOMEBREW_BROWSER"]
browser ||= OS::PATH_OPEN if defined?(OS::PATH_OPEN)
return unless browser
safe_exec(browser, *args)
diff --git a/bin/brew b/bin/brew
index 306be5ea0..90e0cf3e9 100755
--- a/bin/brew
+++ b/bin/brew
@@ -44,9 +44,16 @@ fi
HOMEBREW_LIBRARY="$HOMEBREW_REPOSITORY/Library"
-for VAR in EDITOR PATH BINTRAY_USER BINTRAY_KEY
+# Whitelist and copy to HOMEBREW_* all variables previously mentioned in
+# manpage or used elsewhere by Homebrew.
+for VAR in AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY BINTRAY_USER BINTRAY_KEY \
+ BROWSER EDITOR GIT PATH VISUAL
do
+ # Skip if variable value is empty.
+ [[ -z "${!VAR}" ]] && continue
+
VAR_NEW="HOMEBREW_${VAR}"
+ # Skip if existing HOMEBREW_* variable is set.
[[ -n "${!VAR_NEW}" ]] && continue
export "$VAR_NEW"="${!VAR}"
done
diff --git a/docs/Manpage.md b/docs/Manpage.md
index fcc6cf4a0..2dac89443 100644
--- a/docs/Manpage.md
+++ b/docs/Manpage.md
@@ -910,8 +910,15 @@ can take several different forms:
The formula file will be cached for later use.
## ENVIRONMENT
+ * `HOMEBREW_ARTIFACT_DOMAIN`:
+ If set, instructs Homebrew to use the given URL as a download mirror for bottles and binaries.
+
+ * `HOMEBREW_AUTO_UPDATE_SECS`:
+ If set, Homebrew will only check for autoupdates once per this seconds interval.
+
+ *Default:* `60`.
- * `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`:
+ * `HOMEBREW_AWS_ACCESS_KEY_ID`, `HOMEBREW_AWS_SECRET_ACCESS_KEY`:
When using the `S3` download strategy, Homebrew will look in
these variables for access credentials (see
<https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-environment>
@@ -919,30 +926,9 @@ can take several different forms:
the `S3` download strategy will download with a public
(unsigned) URL.
- * `BROWSER`:
- If set, and `HOMEBREW_BROWSER` is not, use `BROWSER` as the web browser
- when opening project homepages.
-
- * `EDITOR`:
- If set, and `HOMEBREW_EDITOR` and `VISUAL` are not, use `EDITOR` as the text editor.
-
- * `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_BOTTLE_DOMAIN`:
If set, instructs Homebrew to use the given URL as a download mirror for bottles.
- * `HOMEBREW_ARTIFACT_DOMAIN`:
- If set, instructs Homebrew to use the given URL as a download mirror for bottles and binaries.
-
- * `HOMEBREW_AUTO_UPDATE_SECS`:
- If set, Homebrew will only check for autoupdates once per this seconds interval.
-
- *Default:* `60`.
-
* `HOMEBREW_BROWSER`:
If set, uses this setting as the browser when opening project homepages,
instead of the OS default browser.
@@ -990,6 +976,12 @@ can take several different forms:
If set, Homebrew will always use its vendored, relocatable Ruby 2.0 version
even if the system version of Ruby is >=2.0.
+ * `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_GITHUB_API_TOKEN`:
A personal access token for the GitHub API, which you can create at
<https://github.com/settings/tokens>. If set, GitHub will allow you a
@@ -1055,9 +1047,6 @@ can take several different forms:
* `HOMEBREW_VERBOSE`:
If set, Homebrew always assumes `--verbose` when running commands.
- * `VISUAL`:
- If set, and `HOMEBREW_EDITOR` is not, use `VISUAL` as the text editor.
-
## USING HOMEBREW BEHIND A PROXY
Homebrew uses several commands for downloading files (e.g. `curl`, `git`, `svn`).
diff --git a/docs/Python-for-Formula-Authors.md b/docs/Python-for-Formula-Authors.md
index d3e7543db..ea86cf84c 100644
--- a/docs/Python-for-Formula-Authors.md
+++ b/docs/Python-for-Formula-Authors.md
@@ -143,7 +143,7 @@ def install
%w[six parsedatetime].each do |r|
venv.pip_install resource(r)
end
- venv.link_scripts(bin) { venv.pip_install buildpath }
+ venv.pip_install_and_link buildpath
end
```
diff --git a/docs/_layouts/index.html b/docs/_layouts/index.html
index 570718287..daf4fb6c0 100644
--- a/docs/_layouts/index.html
+++ b/docs/_layouts/index.html
@@ -1,7 +1,7 @@
---
layout: base
---
-<div id="informations">
+<div id="information">
<ul>
<li>
<div class="group row">
diff --git a/docs/css/reset.css b/docs/css/reset.css
deleted file mode 100644
index 1c85489d6..000000000
--- a/docs/css/reset.css
+++ /dev/null
@@ -1,53 +0,0 @@
-/* http://meyerweb.com/eric/tools/css/reset/ */
-/* v1.0 | 20080212 */
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, font, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- font-size: 100%;
- vertical-align: baseline;
- background: transparent;
-}
-body {
- line-height: 1;
-}
-ol, ul {
- list-style: none;
-}
-blockquote, q {
- quotes: none;
-}
-blockquote:before, blockquote:after,
-q:before, q:after {
- content: '';
- content: none;
-}
-
-/* remember to define focus styles! */
-:focus {
- outline: 0;
-}
-
-/* remember to highlight inserts somehow! */
-ins {
- text-decoration: none;
-}
-del {
- text-decoration: line-through;
-}
-
-/* tables still need 'cellspacing="0"' in the markup */
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
diff --git a/docs/css/screen.css b/docs/css/screen.css
deleted file mode 100644
index 836edac15..000000000
--- a/docs/css/screen.css
+++ /dev/null
@@ -1,389 +0,0 @@
-/* ****************************************************
-
- @file screen.css
- @description Screen stylesheet
- vim: set noet ts=4 fdm=marker fenc=utf-8:
-
-***************************************************** */
-
-@import url("./reset.css");
-
-/* @section Basic {{{
-******************************************************************************/
-
-html {
- font-size: 62.5%;
- font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif;
-}
-
-html, body { height: 100%; }
-
-body {
- font-size: 150%;
- line-height: 1.4;
- color: #F9D094;
- background: #2E2A24;
- position: relative;
- behavior: url("/js/ie6/csshover.htc");
- padding: 0 30px;
-}
-
-p,ul,ol,dl,table,pre { margin-bottom: 1em; }
-ul { margin-left: 20px; }
-a { text-decoration: none; cursor: pointer; color: #ba832c; font-weight: bold; }
-a:focus { outline: 1px dotted; }
-a:visited { }
-a:hover, a:focus { color: #d3a459; text-decoration: underline; }
-a *, button * { cursor: pointer; }
-hr { display: none; }
-small { font-size: 90%; }
-input, select, button, textarea, option { font-size: 100%; }
-button, label, select, option, input[type=submit] { cursor: pointer; }
-.group:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .group {display: inline-block;}
-/* Hides from IE-mac \*/ * html .group {height: 1%;} .group {display: block;} /* End hide from IE-mac */
-sup { font-size: 80%; line-height: 1; vertical-align: super; }
-button::-moz-focus-inner { border: 0; padding: 1px; }
-span.amp { font-weight: normal; font-style: italic; font-size: 1.2em; line-height: 0.8; }
-h1,h2,h3,h4,h5,h6 { line-height: 1.1; }
-
-::selection { background: #745626; }
-::-moz-selection { background: #745626; }
-
-h1, h2, h3 {
- font-size: 420%;
- margin: 0 0 0.1em;
- font-weight: 900;
- text-shadow: 1px 1px 10px rgba(0,0,0,0.25);
-}
-
-h2 {
- font-size: 300%;
- text-align: center;
- font-weight: 800;
- color: #F9D094;
- margin-top: 0.5em;
- margin-bottom: 0.1em;
-}
-
-h3 {
- font-size: 125%;
- text-align: center;
- font-weight: 800;
- color: #F9D094;
- margin-top: 0.5em;
- margin-bottom: 0.1em;
-}
-
-#forkme {
- width: 149px;
- height: 149px;
- position: absolute;
- top: 0;
- right: 0;
- border: 0
-}
-
-h1 a,
-h1 a:hover {
- color: #F9D094;
- font-weight: 900;
-}
-
-#wrap {
- width: 57em;
- /*width: 760px;*/
- max-width: 100%;
- margin: 0 auto;
- padding: 15px 0 0;
-}
-
-#header {
- text-align: center;
- margin-bottom: 1em;
-}
-
-#language {
- margin-bottom: 2em;
-}
-
-pre {
- background: rgba(0,0,0,0.3);
- color: #fff;
- padding: 8px 10px;
- border-radius: 0.4em;
- -moz-border-radius: 0.4em;
- -webkit-border-radius: 0.4em;
- overflow-x: auto;
-}
-
-pre code {
- font-family: "Monaco", "Menlo", monospace;
- font-size: 11px;
- line-height: 1.6;
-}
-
-#selectable {
- font-size: 13px;
-}
-
-.avatar {
- border-radius: 0.4em;
- overflow: hidden;
- margin-right: 0.5em;
- vertical-align: middle;
-}
-
-#home, #page, .postcontent {
- font-size: 1.2em;
- min-width: 25em;
- max-width: 35em;
- margin: 0 auto;
- margin-top: 1em;
- padding-top: 1em;
- padding-bottom: 1em;
-}
-
-#home img, #page img, .postcontent img {
- min-width: 25em;
- max-width: 35em;
-}
-
-#home th, #page th, .postcontent th, #home td, #page td, .postcontent td {
- padding: 0.25em 0.5em;
-}
-
-#post, #home, #page, .singlepostcontent, .posts li {
- border-top: 1px solid rgba(255,255,255,0.08);
- box-shadow: 0 -1px 0 rgba(0,0,0,0.5);
-}
-
-#home ul, #page ul, .postcontent ul {
- list-style: inherit;
-}
-
-#home h1, #page h1 {
- font-size: 250%;
- font-weight: 800;
- text-align: center;
- padding-bottom: 0.5em;
-}
-
-#home h2, #page h2 {
- font-size: 175%;
- font-weight: 700;
- text-align: left;
- padding-bottom: 0.3em;
-}
-
-#home h3, #page h3 {
- font-size: 150%;
- font-weight: 700;
- text-align: left;
- padding-bottom: 0.3em;
-}
-
-#home code, #page code {
- font-size: 100%;
-}
-
-#home pre code, #page pre code {
- font-size: 80%;
-}
-
-table {
- border-collapse: separate;
- border: solid rgba(0,0,0,0.4) 1px;
- border-radius: 0.4em;
- -moz-border-radius: 0.4em;
- -webkit-border-radius: 0.4em;
- margin-top: 1em;
-}
-
-.full-width {
- width: 100%;
-}
-
-table td, th {
- padding: 0.1em 1em;
-}
-
-table code {
- font-size: 130%;
-}
-
-.number-data {
- text-align: right;
-}
-
-table tr:nth-child(odd) {
- background: rgba(0,0,0,0.2);
-}
-
-table tr th, table tr:nth-child(even) {
- background: rgba(0,0,0,0.4);
-}
-
-/*}}}*/
-
-/* @section Informations {{{
-******************************************************************************/
-
-#informations {
- border-top: 1px solid rgba(0,0,0,0.5);
-}
-
-#informations ul {
- margin: 0;
-}
-
-#informations .row, #border-bottom {
- border-bottom: 1px solid rgba(0,0,0,0.5);
- border-top: 1px solid rgba(255,255,255,0.08);
- padding: 2em 20px 0;
-}
-
-#informations .row .col-1 {
- width: 49%;
- float: left;
- padding: 0 0 1em;
-}
-
-#informations .row .col-2 {
- width: 49%;
- float: right;
- padding: 0 0 1em;
-}
-
-@media screen and (min-width: 700px) {
- #informations .highlight {
- margin-inline-end: 0;
- -moz-margin-end: 0;
- -webkit-margin-end: 0;
- }
-}
-
-.button {
- text-align: center;
- margin: 1em 0 2em;
-}
-
-#informations .button a {
- background: rgba(162,107,20,0.3);
- padding: 8px 10px 6px;
- border-radius: 0.4em;
- -moz-border-radius: 0.4em;
- -webkit-border-radius: 0.4em;
- box-shadow: 0 0 5px rgba(0,0,0,0.4);
- -moz-box-shadow: 0 0 5px rgba(0,0,0,0.4);
- -webkit-box-shadow: 0 0 5px rgba(0,0,0,0.4);
- font-size: larger;
-}
-
-#informations .button a:hover {
- background: rgba(162,107,20,0.25);
-}
-
-#informations .button-large {
- padding: 2em 0 1em;
- font-size: 120%;
-}
-
-#informations .quote {
- text-align: center;
- color: #816f51;
- padding-bottom: 2em;
-}
-
-#informations .quote blockquote {
- font-size: 140%;
- padding: 0 15%;
-}
-
-#informations .quote blockquote span {
- font-size: 140%;
- line-height: 0.5;
- vertical-align: sub;
-}
-
-#informations .quote cite {
- font-style: normal;
-}
-
-#informations .quote cite a {
- font-weight: normal;
-}
-
-#informations .credits, #border-no-bottom {
- border-bottom: none;
- font-size: 70%;
- text-align: center;
- padding-top: 1.8em;
- opacity: 0.5;
-}
-
-#informations .credits p {
- margin: 0;
- padding: 0 0 0.7em;
-}
-
-/*}}}*/
-
-/* @section Mobile {{{
-******************************************************************************/
-@media screen and (max-width: 700px) {
- body {
- padding: 0px;
- }
-
- h1 {
- font-size: 350%;
- }
-
- h2 {
- font-size: 250%;
- }
-
- #forkme {
- width: 100px;
- height: 100px;
- }
-
- #informations .row .col-1 {
- width: 100%;
- padding: 0;
- margin: 0;
- }
-
- #informations .row .col-2 {
- width: 100%;
- float: left;
- }
- pre code#selectable {
- width: 90%;
- margin: 0 auto;
- }
-}
-/*}}}*/
-
-/* @section RTL {{{
-******************************************************************************/
-[dir="rtl"] ul { margin-left: 0; margin-right: 20px; }
-
-[dir="rtl"] pre {
- direction: ltr;
- text-align: left;
-}
-
-[dir="rtl"] #informations .row .col-1 {
- float: right;
-}
-
-[dir="rtl"] #informations .row .col-2 {
- float: left;
-}
-
-@media screen and (max-width: 700px) {
- [dir="rtl"] #informations .row .col-2 {
- float: right;
- }
-}
diff --git a/docs/css/screen.scss b/docs/css/screen.scss
new file mode 100644
index 000000000..5acdf4657
--- /dev/null
+++ b/docs/css/screen.scss
@@ -0,0 +1,488 @@
+---
+---
+
+$color_peach_orange_approx: #f9d094;
+$color_rangitoto_approx: #2e2a24;
+$color_marigold_approx: #ba832c;
+$color_di_serria_approx: #d3a459;
+$color_dallas_approx: #745626;
+$black_25: rgba(0, 0, 0, 0.25);
+$black_30: rgba(0, 0, 0, 0.3);
+$white: #fff;
+$white_8: rgba(255, 255, 255, 0.08);
+$black_50: rgba(0, 0, 0, 0.5);
+$black_40: rgba(0, 0, 0, 0.4);
+$black_20: rgba(0, 0, 0, 0.2);
+$color_reno_sand_30_approx: rgba(162, 107, 20, 0.3);
+$color_reno_sand_25_approx: rgba(162, 107, 20, 0.25);
+$color_shadow_approx: #816f51;
+
+@mixin border-radius($radius) {
+ border-radius: $radius;
+ -moz-border-radius: $radius;
+ -webkit-border-radius: $radius;
+}
+
+@mixin box-shadow($x, $y, $blur, $color) {
+ box-shadow: $x $y $blur $color;
+ -moz-box-shadow: $x $y $blur $color;
+ -webkit-box-shadow: $x $y $blur $color;
+}
+
+@mixin margin-inline-end($margin) {
+ margin-inline-end: $margin;
+ -moz-margin-end: $margin;
+ -webkit-margin-end: $margin;
+}
+
+h1, h2, h3 {
+ font-size: 420%;
+ color: $color_peach_orange_approx;
+ margin: 0 0 0.1em;
+ text-align: center;
+ text-shadow: 1px 1px 10px $black_25;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ line-height: 1.1;
+}
+
+h1 {
+ font-weight: 900;
+ a, a:hover {
+ font-weight: 900;
+ color: $color_peach_orange_approx;
+ }
+}
+
+h2, h3 {
+ font-weight: 800;
+ margin-top: 0.5em;
+ margin-bottom: 0.1em;
+}
+
+h2 {
+ font-size: 300%;
+}
+
+h3 {
+ font-size: 125%;
+}
+
+#home, #page {
+ h1 {
+ font-size: 250%;
+ font-weight: 800;
+ padding-bottom: 0.5em;
+ }
+
+ h2, h3 {
+ font-weight: 700;
+ text-align: left;
+ padding-bottom: 0.3em;
+ }
+
+ h2 {
+ font-size: 175%;
+ }
+
+ h3 {
+ font-size: 150%;
+ }
+}
+
+#home, #page, .postcontent {
+ font-size: 1.2em;
+ min-width: 25em;
+ max-width: 35em;
+ margin: 0 auto;
+ margin-top: 1em;
+ padding-top: 1em;
+ padding-bottom: 1em;
+}
+
+#information .row, #border-bottom {
+ border-bottom: 1px solid $black_50;
+ border-top: 1px solid $white_8;
+ padding: 2em 20px 0;
+}
+
+html {
+ margin: 0;
+ padding: 0;
+ font-size: 62.5%;
+ font-family: "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "Roboto", "sans-serif";
+ height: 100%;
+}
+
+body {
+ height: 100%;
+ font-size: 150%;
+ line-height: 1.4;
+ color: $color_peach_orange_approx;
+ background: $color_rangitoto_approx;
+ position: relative;
+ margin: 0;
+ padding: 0 30px;
+}
+
+p {
+ margin: 0 0 1em 0;
+}
+
+ul, ol, dl {
+ margin-bottom: 1em;
+}
+
+ul {
+ margin-left: 20px;
+}
+
+table {
+ margin-bottom: 1em;
+ border-collapse: separate;
+ border-spacing: 0;
+ border: solid $black_40 1px;
+ @include border-radius(0.4em);
+ margin-top: 1em;
+ td {
+ padding: 0.1em 1em;
+ }
+
+ code {
+ font-size: 130%;
+ }
+
+ tr {
+ &:nth-child(odd) {
+ background: $black_20;
+ }
+
+ th {
+ background: $black_40;
+ }
+
+ &:nth-child(even) {
+ background: $black_40;
+ }
+ }
+}
+
+pre {
+ margin: 0 0 1em 0;
+ background: $black_30;
+ color: $white;
+ padding: 8px 10px;
+ @include border-radius(0.4em);
+ overflow-x: auto;
+ code {
+ font-family: "Monaco", "Menlo", "monospace";
+ font-size: 11px;
+ line-height: 1.6;
+ }
+}
+
+a {
+ text-decoration: none;
+ color: $color_marigold_approx;
+ font-weight: bold;
+ &:focus {
+ outline: 1px dotted;
+ color: $color_di_serria_approx;
+ text-decoration: underline;
+ }
+
+ &:hover {
+ color: $color_di_serria_approx;
+ text-decoration: underline;
+ }
+}
+
+button, input, select, textarea, option {
+ font-size: 100%;
+}
+
+a, a *, button, button *, select, option, label, input[type=submit] {
+ cursor: pointer;
+}
+
+hr {
+ display: none;
+}
+
+small {
+ font-size: 90%;
+}
+
+.group {
+ display: block;
+ &:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+ }
+}
+
+sup {
+ font-size: 80%;
+ line-height: 1;
+ vertical-align: super;
+}
+
+button::-moz-focus-inner {
+ border: 0;
+ padding: 1px;
+}
+
+::selection, ::-moz-selection {
+ background: $color_dallas_approx;
+}
+
+#forkme {
+ width: 149px;
+ height: 149px;
+ position: absolute;
+ top: 0;
+ right: 0;
+ border: 0;
+}
+
+#wrap {
+ width: 57em;
+ max-width: 100%;
+ margin: 0 auto;
+ padding: 15px 0 0;
+}
+
+#header {
+ text-align: center;
+ margin-bottom: 1em;
+}
+
+#language {
+ margin-bottom: 2em;
+}
+
+#selectable {
+ font-size: 13px;
+}
+
+.avatar {
+ @include border-radius(0.4em);
+ overflow: hidden;
+ margin-right: 0.5em;
+ vertical-align: middle;
+}
+
+#home, #page, #post, .singlepostcontent {
+ border-top: 1px solid $white_8;
+ @include box-shadow(0, -1px, 0, $black_50);
+}
+
+#home, #page {
+ code {
+ font-size: 100%;
+ }
+
+ pre code {
+ font-size: 80%;
+ }
+}
+
+#home, #page, .postcontent {
+ img {
+ min-width: 25em;
+ max-width: 35em;
+ }
+
+ th, td {
+ padding: 0.25em 0.5em;
+ }
+}
+
+.full-width {
+ width: 100%;
+}
+
+th {
+ padding: 0.1em 1em;
+}
+
+.number-data {
+ text-align: right;
+}
+
+#information ul, .posts {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+#information {
+ border-top: 1px solid $black_50;
+ .row {
+ .col-1 {
+ width: 49%;
+ float: left;
+ padding: 0 0 1em;
+ }
+
+ .col-2 {
+ width: 49%;
+ float: right;
+ padding: 0 0 1em;
+ }
+ }
+
+ .button-large {
+ padding: 2em 0 1em;
+ font-size: 120%;
+ }
+
+ .quote {
+ text-align: center;
+ color: $color_shadow_approx;
+ padding-bottom: 2em;
+ blockquote {
+ font-size: 140%;
+ padding: 0 15%;
+ span {
+ font-size: 140%;
+ line-height: 0.5;
+ vertical-align: sub;
+ }
+ }
+
+ cite {
+ font-style: normal;
+ a {
+ font-weight: normal;
+ }
+ }
+ }
+
+ .credits {
+ border-bottom: none;
+ font-size: 70%;
+ text-align: center;
+ padding-top: 1.8em;
+ opacity: 0.5;
+ p {
+ margin: 0;
+ padding: 0 0 0.7em;
+ }
+ }
+ .button a {
+ background: $color_reno_sand_30_approx;
+ padding: 8px 10px 6px;
+ @include border-radius(0.4em);
+ @include box-shadow(0, 0, 5px, $black_40);
+ font-size: larger;
+ &:hover {
+ background: $color_reno_sand_25_approx;
+ }
+ }
+}
+
+.button {
+ text-align: center;
+ margin: 1em 0 2em;
+}
+
+#border-no-bottom {
+ border-bottom: none;
+ font-size: 70%;
+ text-align: center;
+ padding-top: 1.8em;
+ opacity: 0.5;
+}
+
+* html .group {
+ height: 1%;
+}
+
+span .amp {
+ font-weight: normal;
+ font-style: italic;
+ font-size: 1.2em;
+ line-height: 0.8;
+}
+
+.posts li {
+ border-top: 1px solid $white_8;
+ @include box-shadow(0, -1px, 0, $black_50);
+}
+
+[dir="rtl"] {
+ ul {
+ margin-left: 0;
+ margin-right: 20px;
+ }
+
+ pre {
+ direction: ltr;
+ text-align: left;
+ }
+
+ #information .row {
+ .col-1 {
+ float: right;
+ }
+ .col-2 {
+ float: left;
+ }
+ }
+}
+
+@media screen and(min-width: 700px) {
+ #information .highlight {
+ @include margin-inline-end(0);
+ }
+}
+
+@media screen and(max-width: 700px) {
+ body {
+ padding: 0;
+ }
+
+ #post, #page, .posts {
+ margin: 0 1em;
+ }
+
+ h1 {
+ font-size: 350%;
+ }
+
+ h2 {
+ font-size: 250%;
+ }
+
+ #forkme {
+ width: 100px;
+ height: 100px;
+ }
+
+ #information .row {
+ .col-1 {
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ }
+
+ .col-2 {
+ width: 100%;
+ float: left;
+ }
+ }
+
+ pre code#selectable {
+ width: 90%;
+ margin: 0 auto;
+ }
+
+ [dir="rtl"] #information .row .col-2 {
+ float: right;
+ }
+}
diff --git a/manpages/brew.1 b/manpages/brew.1
index 58c2c210c..ca11439a6 100644
--- a/manpages/brew.1
+++ b/manpages/brew.1
@@ -941,29 +941,6 @@ Homebrew can install formulae via URL, e\.g\. \fBhttps://raw\.github\.com/Homebr
.SH "ENVIRONMENT"
.
.TP
-\fBAWS_ACCESS_KEY_ID\fR, \fBAWS_SECRET_ACCESS_KEY\fR
-When using the \fBS3\fR download strategy, Homebrew will look in these variables for access credentials (see \fIhttps://docs\.aws\.amazon\.com/cli/latest/userguide/cli\-chap\-getting\-started\.html#cli\-environment\fR to retrieve these access credentials from AWS)\. If they are not set, the \fBS3\fR download strategy will download with a public (unsigned) URL\.
-.
-.TP
-\fBBROWSER\fR
-If set, and \fBHOMEBREW_BROWSER\fR is not, use \fBBROWSER\fR as the web browser when opening project homepages\.
-.
-.TP
-\fBEDITOR\fR
-If set, and \fBHOMEBREW_EDITOR\fR and \fBVISUAL\fR are not, use \fBEDITOR\fR as the text editor\.
-.
-.TP
-\fBGIT\fR
-When using Git, Homebrew will use \fBGIT\fR if set, a Homebrew\-built Git if installed, or the system\-provided binary\.
-.
-.IP
-Set this to force Homebrew to use a particular git binary\.
-.
-.TP
-\fBHOMEBREW_BOTTLE_DOMAIN\fR
-If set, instructs Homebrew to use the given URL as a download mirror for bottles\.
-.
-.TP
\fBHOMEBREW_ARTIFACT_DOMAIN\fR
If set, instructs Homebrew to use the given URL as a download mirror for bottles and binaries\.
.
@@ -975,6 +952,14 @@ If set, Homebrew will only check for autoupdates once per this seconds interval\
\fIDefault:\fR \fB60\fR\.
.
.TP
+\fBHOMEBREW_AWS_ACCESS_KEY_ID\fR, \fBHOMEBREW_AWS_SECRET_ACCESS_KEY\fR
+When using the \fBS3\fR download strategy, Homebrew will look in these variables for access credentials (see \fIhttps://docs\.aws\.amazon\.com/cli/latest/userguide/cli\-chap\-getting\-started\.html#cli\-environment\fR to retrieve these access credentials from AWS)\. If they are not set, the \fBS3\fR download strategy will download with a public (unsigned) URL\.
+.
+.TP
+\fBHOMEBREW_BOTTLE_DOMAIN\fR
+If set, instructs Homebrew to use the given URL as a download mirror for bottles\.
+.
+.TP
\fBHOMEBREW_BROWSER\fR
If set, uses this setting as the browser when opening project homepages, instead of the OS default browser\.
.
@@ -1021,6 +1006,13 @@ If set, Homebrew will use this editor when editing a single formula, or several
If set, Homebrew will always use its vendored, relocatable Ruby 2\.0 version even if the system version of Ruby is >=2\.0\.
.
.TP
+\fBHOMEBREW_GIT\fR
+When using Git, Homebrew will use \fBGIT\fR if set, a Homebrew\-built Git if installed, or the system\-provided binary\.
+.
+.IP
+Set this to force Homebrew to use a particular git binary\.
+.
+.TP
\fBHOMEBREW_GITHUB_API_TOKEN\fR
A personal access token for the GitHub API, which you can create at \fIhttps://github\.com/settings/tokens\fR\. If set, GitHub will allow you a greater number of API requests\. See \fIhttps://developer\.github\.com/v3/#rate\-limiting\fR for more information\. Homebrew uses the GitHub API for features such as \fBbrew search\fR\.
.
@@ -1086,10 +1078,6 @@ This issue typically occurs when using FileVault or custom SSD configurations\.
\fBHOMEBREW_VERBOSE\fR
If set, Homebrew always assumes \fB\-\-verbose\fR when running commands\.
.
-.TP
-\fBVISUAL\fR
-If set, and \fBHOMEBREW_EDITOR\fR is not, use \fBVISUAL\fR as the text editor\.
-.
.SH "USING HOMEBREW BEHIND A PROXY"
Homebrew uses several commands for downloading files (e\.g\. \fBcurl\fR, \fBgit\fR, \fBsvn\fR)\. Many of these tools can download via a proxy\. It\'s common for these tools to read proxy parameters from environment variables\.
.