diff options
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) @@ -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\. . |
