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\.  . | 
