fastlane 2.30.0.beta.20170511010018 → 2.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/deliver/lib/deliver/upload_metadata.rb +1 -1
- data/fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb +41 -0
- data/fastlane/lib/fastlane/actions/update_fastlane.rb +1 -2
- data/fastlane/lib/fastlane/environment_printer.rb +11 -13
- data/fastlane/lib/fastlane/runner.rb +3 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core.rb +3 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +27 -6
- data/fastlane_core/lib/fastlane_core/crash_reporter/backtrace_sanitizer.rb +42 -0
- data/fastlane_core/lib/fastlane_core/crash_reporter/crash_report_generator.rb +50 -0
- data/fastlane_core/lib/fastlane_core/crash_reporter/crash_reporter.rb +82 -0
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +7 -0
- data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +5 -1
- data/match/lib/match/encrypt.rb +3 -1
- data/snapshot/lib/assets/SnapshotHelper.swift +8 -1
- metadata +21 -16
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b24de7dca69e16aea8b48239f2eb105cf61d42e4
         | 
| 4 | 
            +
              data.tar.gz: abee9d945caa12cec5f5b84736e196db6ed6270e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 108860da51b20af99859e93b50f377797d6991f2fbd18b91c07f56c70905c6c4429b02a84e510f96c146a72f8289f4ea198f06fe26cf58d261a4c055c8362234
         | 
| 7 | 
            +
              data.tar.gz: b7c2b1d67ed298ca2424eadede430719972b3a6e86a03365b4619cbfd5980afe937f6a1c90bd6e00c8cccf757086a794704cb3800359cf53713fae8272742a29
         | 
    
        data/README.md
    CHANGED
    
    | @@ -154,6 +154,12 @@ We have recently changed the destination service to which these metrics are repo | |
| 154 154 |  | 
| 155 155 | 
             
            You can easily opt-out of metrics collection by adding `opt_out_usage` at the top of your `Fastfile` or by setting the environment variable `FASTLANE_OPT_OUT_USAGE`. Participating helps us provide the best possible support for _fastlane_, so we hope you'll consider it a plus! :heavy_plus_sign:
         | 
| 156 156 |  | 
| 157 | 
            +
            ## Crash Reporting
         | 
| 158 | 
            +
             | 
| 159 | 
            +
            In order to continuously improve stability, _fastlane_ will record crash reports with sanitized stacktraces. Sanitization removes personal information from the stacktrace and error message (including home directories, _fastlane_ path, gem paths, environment variables, and parameters).
         | 
| 160 | 
            +
             | 
| 161 | 
            +
            You can easily opt-out of crash reporting by adding `opt_out_crash_reporting` at the top of your `Fastfile` or by setting the environment variable `FASTLANE_OPT_OUT_CRASH_REPORTING`. Just like metrics mentioned above, participating helps us provide the best possible support for _fastlane_, so we hope you'll consider it a plus! :heavy_plus_sign:
         | 
| 162 | 
            +
             | 
| 157 163 | 
             
            ## Need Help?
         | 
| 158 164 |  | 
| 159 165 | 
             
            Please [submit an issue](https://github.com/fastlane/fastlane/issues) on GitHub and provide information about your setup.
         | 
| @@ -250,7 +250,7 @@ module Deliver | |
| 250 250 | 
             
                  UI.user_error!("`trade_representative_contact_information` must be a hash", show_github_issues: true) unless info.kind_of?(Hash)
         | 
| 251 251 |  | 
| 252 252 | 
             
                  TRADE_REPRESENTATIVE_CONTACT_INFORMATION_VALUES.each do |key, option_name|
         | 
| 253 | 
            -
                    v.send("#{key}=", info[option_name].chomp) if info[option_name] | 
| 253 | 
            +
                    v.send("#{key}=", info[option_name].to_s.chomp) if info[option_name]
         | 
| 254 254 | 
             
                  end
         | 
| 255 255 | 
             
                end
         | 
| 256 256 |  | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            module Fastlane
         | 
| 2 | 
            +
              module Actions
         | 
| 3 | 
            +
                class OptOutCrashReportingAction < Action
         | 
| 4 | 
            +
                  def self.run(params)
         | 
| 5 | 
            +
                    ENV['FASTLANE_OPT_OUT_CRASH_REPORTING'] = "YES"
         | 
| 6 | 
            +
                    UI.message("Disabled crash reporting")
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def self.description
         | 
| 10 | 
            +
                    "This will prevent reports from being uploaded when _fastlane_ crashes"
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def self.details
         | 
| 14 | 
            +
                    [
         | 
| 15 | 
            +
                      "By default, fastlane will send a report when it crashes",
         | 
| 16 | 
            +
                      "The stacktrace is sanitized so no personal information is sent.",
         | 
| 17 | 
            +
                      "Learn more at https://github.com/fastlane/fastlane#crash-reporting",
         | 
| 18 | 
            +
                      "Add `opt_out_crash_reporting` at the top of your Fastfile to disable crash reporting"
         | 
| 19 | 
            +
                    ].join(' ')
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def self.authors
         | 
| 23 | 
            +
                    ['mpirri', 'ohayon']
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def self.is_supported?(platform)
         | 
| 27 | 
            +
                    true
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def self.example_code
         | 
| 31 | 
            +
                    [
         | 
| 32 | 
            +
                      'opt_out_crash_reporting # add this to the top of your Fastfile'
         | 
| 33 | 
            +
                    ]
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def self.category
         | 
| 37 | 
            +
                    :misc
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -57,8 +57,7 @@ module Fastlane | |
| 57 57 | 
             
                    update_needed.each do |tool_info|
         | 
| 58 58 | 
             
                      tool = tool_info[0]
         | 
| 59 59 | 
             
                      local_version = Gem::Version.new(highest_versions[tool].version)
         | 
| 60 | 
            -
                       | 
| 61 | 
            -
                      latest_version = FastlaneCore::UpdateChecker.fetch_latest(update_url)
         | 
| 60 | 
            +
                      latest_version = FastlaneCore::UpdateChecker.fetch_latest(tool)
         | 
| 62 61 | 
             
                      UI.message("Updating #{tool} from #{local_version} to #{latest_version} ... 🚀")
         | 
| 63 62 |  | 
| 64 63 | 
             
                      # Approximate_recommendation will create a string like "~> 0.10" from a version 0.10.0, e.g. one that is valid for versions >= 0.10 and <1.0
         | 
| @@ -62,17 +62,16 @@ module Fastlane | |
| 62 62 | 
             
                    table << "|--------|---------|\n"
         | 
| 63 63 | 
             
                    plugin_manager.available_plugins.each do |plugin|
         | 
| 64 64 | 
             
                      begin
         | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
                         | 
| 70 | 
            -
             | 
| 71 | 
            -
                         | 
| 65 | 
            +
                        installed_version = Fastlane::ActionCollector.determine_version(plugin)
         | 
| 66 | 
            +
                        latest_version = FastlaneCore::UpdateChecker.fetch_latest(plugin)
         | 
| 67 | 
            +
                        if Gem::Version.new(installed_version) == Gem::Version.new(latest_version)
         | 
| 68 | 
            +
                          update_status = "✅ Up-To-Date"
         | 
| 69 | 
            +
                        else
         | 
| 70 | 
            +
                          update_status = "🚫 Update available"
         | 
| 71 | 
            +
                        end
         | 
| 72 | 
            +
                      rescue
         | 
| 73 | 
            +
                        update_status = "💥 Check failed"
         | 
| 72 74 | 
             
                      end
         | 
| 73 | 
            -
                    rescue
         | 
| 74 | 
            -
                      update_status = "💥 Check failed"
         | 
| 75 | 
            -
                    end
         | 
| 76 75 | 
             
                      table << "| #{plugin} | #{installed_version} | #{update_status} |\n"
         | 
| 77 76 | 
             
                    end
         | 
| 78 77 |  | 
| @@ -107,9 +106,8 @@ module Fastlane | |
| 107 106 |  | 
| 108 107 | 
             
                    next unless fastlane_tools.include?(current_gem.name.to_sym)
         | 
| 109 108 | 
             
                    begin
         | 
| 110 | 
            -
                       | 
| 111 | 
            -
                       | 
| 112 | 
            -
                      if Gem::Version.new(current_gem.version) == Gem::Version.new(latest_version)
         | 
| 109 | 
            +
                      latest_version = FastlaneCore::UpdateChecker.fetch_latest(current_gem.name)
         | 
| 110 | 
            +
                      if Gem::Version.new(current_gem.version) >= Gem::Version.new(latest_version)
         | 
| 113 111 | 
             
                        update_status = "✅ Up-To-Date"
         | 
| 114 112 | 
             
                      else
         | 
| 115 113 | 
             
                        update_status = "🚫 Update available"
         | 
| @@ -253,6 +253,7 @@ module Fastlane | |
| 253 253 | 
             
                      end
         | 
| 254 254 | 
             
                    end
         | 
| 255 255 | 
             
                  rescue FastlaneCore::Interface::FastlaneError => e # user_error!
         | 
| 256 | 
            +
                    FastlaneCore::CrashReporter.report_crash(type: :user_error, exception: e, action: method_sym)
         | 
| 256 257 | 
             
                    collector.did_raise_error(method_sym)
         | 
| 257 258 | 
             
                    raise e
         | 
| 258 259 | 
             
                  rescue FastlaneCore::Interface::FastlaneTestFailure => e # test_failure!
         | 
| @@ -260,6 +261,8 @@ module Fastlane | |
| 260 261 | 
             
                  rescue Exception => e # rubocop:disable Lint/RescueException
         | 
| 261 262 | 
             
                    # high chance this is actually FastlaneCore::Interface::FastlaneCrash, but can be anything else
         | 
| 262 263 | 
             
                    # Catches all exceptions, since some plugins might use system exits to get out
         | 
| 264 | 
            +
                    type = e.kind_of?(FastlaneCore::Interface::FastlaneCrash) ? :crash : :exception
         | 
| 265 | 
            +
                    FastlaneCore::CrashReporter.report_crash(type: type, exception: e, action: method_sym)
         | 
| 263 266 | 
             
                    collector.did_crash(method_sym)
         | 
| 264 267 | 
             
                    raise e
         | 
| 265 268 | 
             
                  end
         | 
| @@ -31,6 +31,9 @@ require 'fastlane_core/fastlane_folder' | |
| 31 31 | 
             
            require 'fastlane_core/keychain_importer'
         | 
| 32 32 | 
             
            require 'fastlane_core/swag'
         | 
| 33 33 | 
             
            require 'fastlane_core/build_watcher'
         | 
| 34 | 
            +
            require 'fastlane_core/crash_reporter/crash_reporter'
         | 
| 35 | 
            +
            require 'fastlane_core/crash_reporter/crash_report_generator'
         | 
| 36 | 
            +
            require 'fastlane_core/crash_reporter/backtrace_sanitizer'
         | 
| 34 37 |  | 
| 35 38 | 
             
            # Third Party code
         | 
| 36 39 | 
             
            require 'colored'
         | 
| @@ -4,10 +4,14 @@ module FastlaneCore | |
| 4 4 | 
             
                # A reference to the actual configuration
         | 
| 5 5 | 
             
                attr_accessor :config
         | 
| 6 6 |  | 
| 7 | 
            +
                # Path to the config file represented by the current object
         | 
| 8 | 
            +
                attr_accessor :configfile_path
         | 
| 9 | 
            +
             | 
| 7 10 | 
             
                # @param config [FastlaneCore::Configuration] is stored to save the resulting values
         | 
| 8 11 | 
             
                # @param path [String] The path to the configuration file to use
         | 
| 9 12 | 
             
                def initialize(config, path, block_for_missing)
         | 
| 10 13 | 
             
                  self.config = config
         | 
| 14 | 
            +
                  self.configfile_path = path
         | 
| 11 15 |  | 
| 12 16 | 
             
                  @block_for_missing = block_for_missing
         | 
| 13 17 | 
             
                  content = File.read(path)
         | 
| @@ -25,20 +29,20 @@ module FastlaneCore | |
| 25 29 | 
             
                    eval(content) # this is okay in this case
         | 
| 26 30 | 
             
                    # rubocop:enable Security/Eval
         | 
| 27 31 |  | 
| 28 | 
            -
                    print_resulting_config_values | 
| 32 | 
            +
                    print_resulting_config_values # only on success
         | 
| 29 33 | 
             
                  rescue SyntaxError => ex
         | 
| 30 34 | 
             
                    line = ex.to_s.match(/\(eval\):(\d+)/)[1]
         | 
| 31 35 | 
             
                    UI.user_error!("Syntax error in your configuration file '#{path}' on line #{line}: #{ex}")
         | 
| 32 36 | 
             
                  end
         | 
| 33 37 | 
             
                end
         | 
| 34 38 |  | 
| 35 | 
            -
                def print_resulting_config_values | 
| 39 | 
            +
                def print_resulting_config_values
         | 
| 36 40 | 
             
                  require 'terminal-table'
         | 
| 37 | 
            -
                  UI.success("Successfully loaded '#{File.expand_path( | 
| 41 | 
            +
                  UI.success("Successfully loaded '#{File.expand_path(self.configfile_path)}' 📄")
         | 
| 38 42 |  | 
| 39 43 | 
             
                  # Show message when self.modified_values is empty
         | 
| 40 44 | 
             
                  if self.modified_values.empty?
         | 
| 41 | 
            -
                    UI.important("No values defined in '#{ | 
| 45 | 
            +
                    UI.important("No values defined in '#{self.configfile_path}'")
         | 
| 42 46 | 
             
                    return
         | 
| 43 47 | 
             
                  end
         | 
| 44 48 |  | 
| @@ -48,7 +52,7 @@ module FastlaneCore | |
| 48 52 |  | 
| 49 53 | 
             
                  puts ""
         | 
| 50 54 | 
             
                  puts Terminal::Table.new(rows: FastlaneCore::PrintTable.transform_output(rows),
         | 
| 51 | 
            -
                                          title: "Detected Values from '#{ | 
| 55 | 
            +
                                          title: "Detected Values from '#{self.configfile_path}'")
         | 
| 52 56 | 
             
                  puts ""
         | 
| 53 57 | 
             
                end
         | 
| 54 58 |  | 
| @@ -66,7 +70,24 @@ module FastlaneCore | |
| 66 70 | 
             
                    value = arguments.first
         | 
| 67 71 | 
             
                    value = yield if value.nil? && block_given?
         | 
| 68 72 |  | 
| 69 | 
            -
                     | 
| 73 | 
            +
                    if value.nil?
         | 
| 74 | 
            +
                      unless block_given?
         | 
| 75 | 
            +
                        # The config file has something like this:
         | 
| 76 | 
            +
                        #
         | 
| 77 | 
            +
                        #   clean
         | 
| 78 | 
            +
                        #
         | 
| 79 | 
            +
                        # without specifying a value for the method call
         | 
| 80 | 
            +
                        # or a block. This is most likely a user error
         | 
| 81 | 
            +
                        # So we tell the user that they can provide a value
         | 
| 82 | 
            +
                        warning = ["In the config file '#{self.configfile_path}'"]
         | 
| 83 | 
            +
                        warning << "you have the line #{method_sym}, but didn't provide"
         | 
| 84 | 
            +
                        warning << "any value. Make sure to append a value rght after the"
         | 
| 85 | 
            +
                        warning << "option name. Make sure to check the docs for more information"
         | 
| 86 | 
            +
                        UI.important(warning.join(" "))
         | 
| 87 | 
            +
                      end
         | 
| 88 | 
            +
                      return
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
             | 
| 70 91 | 
             
                    self.modified_values[method_sym] = value
         | 
| 71 92 |  | 
| 72 93 | 
             
                    # to support frozen strings (e.g. ENV variables) too
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            module FastlaneCore
         | 
| 2 | 
            +
              class BacktraceSanitizer
         | 
| 3 | 
            +
                class << self
         | 
| 4 | 
            +
                  def sanitize(type: :unknown, backtrace: nil)
         | 
| 5 | 
            +
                    if type == :user_error || type == :crash
         | 
| 6 | 
            +
                      # If the crash is from `UI` we only want to include the stack trace
         | 
| 7 | 
            +
                      # up to the point where the crash was initiated.
         | 
| 8 | 
            +
                      # The two stack frames we are dropping are `method_missing` and
         | 
| 9 | 
            +
                      # the call to `crash!` or `user_error!`.
         | 
| 10 | 
            +
                      stack = backtrace.drop(2)
         | 
| 11 | 
            +
                    else
         | 
| 12 | 
            +
                      stack = backtrace
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    stack = remove_fastlane_gem_path(backtrace: stack)
         | 
| 16 | 
            +
                    stack = remove_gem_home_path(backtrace: stack)
         | 
| 17 | 
            +
                    remove_home_dir_mentions(backtrace: stack)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def remove_fastlane_gem_path(backtrace: nil)
         | 
| 21 | 
            +
                    fastlane_path = Gem.loaded_specs['fastlane'].full_gem_path
         | 
| 22 | 
            +
                    return backtrace unless fastlane_path
         | 
| 23 | 
            +
                    backtrace.map do |frame|
         | 
| 24 | 
            +
                      frame.gsub(fastlane_path, '[fastlane_path]')
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def remove_gem_home_path(backtrace: nil)
         | 
| 29 | 
            +
                    return backtrace unless Gem.dir
         | 
| 30 | 
            +
                    backtrace.map do |frame|
         | 
| 31 | 
            +
                      frame.gsub(Gem.dir, '[gem_home]')
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def remove_home_dir_mentions(backtrace: nil)
         | 
| 36 | 
            +
                    backtrace.map do |frame|
         | 
| 37 | 
            +
                      frame.gsub(Dir.home, '~')
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            module FastlaneCore
         | 
| 2 | 
            +
              class CrashReportGenerator
         | 
| 3 | 
            +
                class << self
         | 
| 4 | 
            +
                  def types
         | 
| 5 | 
            +
                    {
         | 
| 6 | 
            +
                      user_error: '[USER_ERROR]',
         | 
| 7 | 
            +
                      crash: '[FASTLANE_CRASH]',
         | 
| 8 | 
            +
                      exception: '[EXCEPTION]',
         | 
| 9 | 
            +
                      connection_failure: '[CONNECTION_FAILURE]',
         | 
| 10 | 
            +
                      system: '[SYSTEM_ERROR]',
         | 
| 11 | 
            +
                      option_parser: '[OPTION_PARSER]',
         | 
| 12 | 
            +
                      invalid_command: '[INVALID_COMMAND]',
         | 
| 13 | 
            +
                      unknown: '[UNKNOWN]'
         | 
| 14 | 
            +
                    }
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def generate(type: :unknown, exception: nil, action: nil)
         | 
| 18 | 
            +
                    message = crash_report_message(type: type, exception: exception)
         | 
| 19 | 
            +
                    crash_report_payload(message: message, action: action)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  private
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def crash_report_message(type: :unknown, exception: nil)
         | 
| 25 | 
            +
                    return if exception.nil?
         | 
| 26 | 
            +
                    backtrace = FastlaneCore::BacktraceSanitizer.sanitize(type: type, backtrace: exception.backtrace).join("\n")
         | 
| 27 | 
            +
                    message = types[type]
         | 
| 28 | 
            +
                    if type == :user_error
         | 
| 29 | 
            +
                      message += ': '
         | 
| 30 | 
            +
                    else
         | 
| 31 | 
            +
                      message += ": #{exception.message}"
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                    message = message[0..100]
         | 
| 34 | 
            +
                    message += "\n" unless type == :user_error
         | 
| 35 | 
            +
                    message + backtrace
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def crash_report_payload(message: '', action: nil)
         | 
| 39 | 
            +
                    {
         | 
| 40 | 
            +
                      'eventTime' => Time.now.utc.to_datetime.rfc3339,
         | 
| 41 | 
            +
                      'serviceContext' => {
         | 
| 42 | 
            +
                        'service' => action || 'fastlane',
         | 
| 43 | 
            +
                        'version' => Fastlane::VERSION
         | 
| 44 | 
            +
                      },
         | 
| 45 | 
            +
                      'message' => message
         | 
| 46 | 
            +
                    }.to_json
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| @@ -0,0 +1,82 @@ | |
| 1 | 
            +
            require 'faraday'
         | 
| 2 | 
            +
            require 'json'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module FastlaneCore
         | 
| 5 | 
            +
              class CrashReporter
         | 
| 6 | 
            +
                class << self
         | 
| 7 | 
            +
                  @did_report_crash = false
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  @explitly_enabled_for_testing = false
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def crash_report_path
         | 
| 12 | 
            +
                    File.join(FastlaneCore.fastlane_user_dir, 'latest_crash.json')
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def enabled?
         | 
| 16 | 
            +
                    !FastlaneCore::Env.truthy?("FASTLANE_OPT_OUT_CRASH_REPORTING")
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def report_crash(type: :unknown, exception: nil, action: nil)
         | 
| 20 | 
            +
                    return unless enabled?
         | 
| 21 | 
            +
                    return if @did_report_crash
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    # Do not run the crash reporter while tests are happening (it might try to send
         | 
| 24 | 
            +
                    # a crash report), unless we have explictly turned on the crash reporter because
         | 
| 25 | 
            +
                    # we want to test it
         | 
| 26 | 
            +
                    return if Helper.test? && !@explitly_enabled_for_testing
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    payload = CrashReportGenerator.generate(type: type, exception: exception, action: action)
         | 
| 29 | 
            +
                    send_report(payload: payload)
         | 
| 30 | 
            +
                    save_file(payload: payload)
         | 
| 31 | 
            +
                    show_message unless did_show_message?
         | 
| 32 | 
            +
                    @did_report_crash = true
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def reset_crash_reporter_for_testing
         | 
| 36 | 
            +
                    @did_report_crash = false
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  def enable_for_testing
         | 
| 40 | 
            +
                    @explitly_enabled_for_testing = true
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def disable_for_testing
         | 
| 44 | 
            +
                    @explitly_enabled_for_testing = false
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  private
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def show_message
         | 
| 50 | 
            +
                    UI.message("Sending crash report...")
         | 
| 51 | 
            +
                    UI.message("The stacktrace is sanitized so no personal information is sent.")
         | 
| 52 | 
            +
                    UI.message("To see what we are sending, look here: #{crash_report_path}")
         | 
| 53 | 
            +
                    UI.message("Learn more at https://github.com/fastlane/fastlane#crash-reporting")
         | 
| 54 | 
            +
                    UI.message("You can disable crash reporting by adding `opt_out_crash_reporting` at the top of your Fastfile")
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  def did_show_message?
         | 
| 58 | 
            +
                    file_name = ".did_show_opt_out_crash_info"
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    path = File.join(FastlaneCore.fastlane_user_dir, file_name)
         | 
| 61 | 
            +
                    did_show = File.exist?(path)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    return did_show if did_show
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    File.write(path, '1')
         | 
| 66 | 
            +
                    false
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  def save_file(payload: "{}")
         | 
| 70 | 
            +
                    File.write(crash_report_path, payload)
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  def send_report(payload: "{}")
         | 
| 74 | 
            +
                    connection = Faraday.new(url: "https://clouderrorreporting.googleapis.com/v1beta1/projects/fastlane-166414/events:report?key=AIzaSyAMACPfuI-wi4grJWEZjcPvhfV2Rhmddwo")
         | 
| 75 | 
            +
                    connection.post do |request|
         | 
| 76 | 
            +
                      request.headers['Content-Type'] = 'application/json'
         | 
| 77 | 
            +
                      request.body = payload
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
            end
         | 
| @@ -48,6 +48,7 @@ module Commander | |
| 48 48 | 
             
                    if FastlaneCore::Helper.test?
         | 
| 49 49 | 
             
                      raise e
         | 
| 50 50 | 
             
                    else
         | 
| 51 | 
            +
                      FastlaneCore::CrashReporter.report_crash(type: :invalid_command, exception: e, action: @program[:name])
         | 
| 51 52 | 
             
                      abort "#{e}. Use --help for more information"
         | 
| 52 53 | 
             
                    end
         | 
| 53 54 | 
             
                  rescue Interrupt => e
         | 
| @@ -66,11 +67,13 @@ module Commander | |
| 66 67 | 
             
                    if FastlaneCore::Helper.test?
         | 
| 67 68 | 
             
                      raise e
         | 
| 68 69 | 
             
                    else
         | 
| 70 | 
            +
                      FastlaneCore::CrashReporter.report_crash(type: :option_parser, exception: e, action: @program[:name])
         | 
| 69 71 | 
             
                      abort e.to_s
         | 
| 70 72 | 
             
                    end
         | 
| 71 73 | 
             
                  rescue FastlaneCore::Interface::FastlaneError => e # user_error!
         | 
| 72 74 | 
             
                    collector.did_raise_error(@program[:name])
         | 
| 73 75 | 
             
                    show_github_issues(e.message) if e.show_github_issues
         | 
| 76 | 
            +
                    FastlaneCore::CrashReporter.report_crash(type: :user_error, exception: e, action: @program[:name])
         | 
| 74 77 | 
             
                    display_user_error!(e, e.message)
         | 
| 75 78 | 
             
                  rescue Errno::ENOENT => e
         | 
| 76 79 | 
             
                    # We're also printing the new-lines, as otherwise the message is not very visible in-between the error and the stacktrace
         | 
| @@ -78,6 +81,7 @@ module Commander | |
| 78 81 | 
             
                    FastlaneCore::UI.important("Error accessing file, this might be due to fastlane's directory handling")
         | 
| 79 82 | 
             
                    FastlaneCore::UI.important("Check out https://docs.fastlane.tools/advanced/#directory-behavior for more details")
         | 
| 80 83 | 
             
                    puts ""
         | 
| 84 | 
            +
                    FastlaneCore::CrashReporter.report_crash(type: :system, exception: e, action: @program[:name])
         | 
| 81 85 | 
             
                    raise e
         | 
| 82 86 | 
             
                  rescue FastlaneCore::Interface::FastlaneTestFailure => e # test_failure!
         | 
| 83 87 | 
             
                    display_user_error!(e, e.to_s)
         | 
| @@ -87,9 +91,12 @@ module Commander | |
| 87 91 | 
             
                    if e.message.include? 'Connection reset by peer - SSL_connect'
         | 
| 88 92 | 
             
                      handle_tls_error!(e)
         | 
| 89 93 | 
             
                    else
         | 
| 94 | 
            +
                      FastlaneCore::CrashReporter.report_crash(type: :connection_failure, exception: e, action: @program[:name])
         | 
| 90 95 | 
             
                      handle_unknown_error!(e)
         | 
| 91 96 | 
             
                    end
         | 
| 92 97 | 
             
                  rescue => e # high chance this is actually FastlaneCore::Interface::FastlaneCrash, but can be anything else
         | 
| 98 | 
            +
                    type = e.kind_of?(FastlaneCore::Interface::FastlaneCrash) ? :crash : :exception
         | 
| 99 | 
            +
                    FastlaneCore::CrashReporter.report_crash(type: type, exception: e, action: @program[:name])
         | 
| 93 100 | 
             
                    collector.did_crash(@program[:name])
         | 
| 94 101 | 
             
                    handle_unknown_error!(e)
         | 
| 95 102 | 
             
                  ensure
         | 
| @@ -112,7 +112,11 @@ module FastlaneCore | |
| 112 112 | 
             
                end
         | 
| 113 113 |  | 
| 114 114 | 
             
                def self.fetch_latest(gem_name)
         | 
| 115 | 
            -
                  JSON.parse(Excon.get( | 
| 115 | 
            +
                  JSON.parse(Excon.get(generate_fetch_url(gem_name)).body)["version"]
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                def self.generate_fetch_url(gem_name)
         | 
| 119 | 
            +
                  "https://rubygems.org/api/v1/gems/#{gem_name}.json"
         | 
| 116 120 | 
             
                end
         | 
| 117 121 |  | 
| 118 122 | 
             
                # (optional) Returns the app identifier for the current tool
         | 
    
        data/match/lib/match/encrypt.rb
    CHANGED
    
    | @@ -16,7 +16,9 @@ module Match | |
| 16 16 |  | 
| 17 17 | 
             
                  unless password
         | 
| 18 18 | 
             
                    if !UI.interactive?
         | 
| 19 | 
            -
                      UI.error " | 
| 19 | 
            +
                      UI.error "Neither the MATCH_PASSWORD environment variable nor the local keychain contained a password."
         | 
| 20 | 
            +
                      UI.error "Bailing out instead of asking for a password, since this is non-interactive mode."
         | 
| 21 | 
            +
                      UI.user_error!("Try setting the MATCH_PASSWORD environment variable, or temporarily enable interactive mode to store a password.")
         | 
| 20 22 | 
             
                    else
         | 
| 21 23 | 
             
                      UI.important "Enter the passphrase that should be used to encrypt/decrypt your certificates"
         | 
| 22 24 | 
             
                      UI.important "This passphrase is specific per repository and will be stored in your local keychain"
         | 
| @@ -6,6 +6,13 @@ | |
| 6 6 | 
             
            //  Copyright © 2015 Felix Krause. All rights reserved.
         | 
| 7 7 | 
             
            //
         | 
| 8 8 |  | 
| 9 | 
            +
            // -----------------------------------------------------
         | 
| 10 | 
            +
            // IMPORTANT: When modifying this file, make sure to 
         | 
| 11 | 
            +
            //            increment the version number at the very
         | 
| 12 | 
            +
            //            bottom of the file to notify users about
         | 
| 13 | 
            +
            //            the new SnapshotHelper.swift
         | 
| 14 | 
            +
            // -----------------------------------------------------
         | 
| 15 | 
            +
             | 
| 9 16 | 
             
            import Foundation
         | 
| 10 17 | 
             
            import XCTest
         | 
| 11 18 |  | 
| @@ -163,4 +170,4 @@ extension XCUIElement { | |
| 163 170 |  | 
| 164 171 | 
             
            // Please don't remove the lines below
         | 
| 165 172 | 
             
            // They are used to detect outdated configuration files
         | 
| 166 | 
            -
            // SnapshotHelperVersion [1. | 
| 173 | 
            +
            // SnapshotHelperVersion [1.4]
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: fastlane
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.30.0 | 
| 4 | 
            +
              version: 2.30.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Felix Krause
         | 
| @@ -922,6 +922,7 @@ files: | |
| 922 922 | 
             
            - fastlane/lib/fastlane/actions/number_of_commits.rb
         | 
| 923 923 | 
             
            - fastlane/lib/fastlane/actions/oclint.rb
         | 
| 924 924 | 
             
            - fastlane/lib/fastlane/actions/onesignal.rb
         | 
| 925 | 
            +
            - fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb
         | 
| 925 926 | 
             
            - fastlane/lib/fastlane/actions/opt_out_usage.rb
         | 
| 926 927 | 
             
            - fastlane/lib/fastlane/actions/pem.rb
         | 
| 927 928 | 
             
            - fastlane/lib/fastlane/actions/pilot.rb
         | 
| @@ -1082,6 +1083,9 @@ files: | |
| 1082 1083 | 
             
            - fastlane_core/lib/fastlane_core/configuration/configuration.rb
         | 
| 1083 1084 | 
             
            - fastlane_core/lib/fastlane_core/configuration/configuration_file.rb
         | 
| 1084 1085 | 
             
            - fastlane_core/lib/fastlane_core/core_ext/string.rb
         | 
| 1086 | 
            +
            - fastlane_core/lib/fastlane_core/crash_reporter/backtrace_sanitizer.rb
         | 
| 1087 | 
            +
            - fastlane_core/lib/fastlane_core/crash_reporter/crash_report_generator.rb
         | 
| 1088 | 
            +
            - fastlane_core/lib/fastlane_core/crash_reporter/crash_reporter.rb
         | 
| 1085 1089 | 
             
            - fastlane_core/lib/fastlane_core/device_manager.rb
         | 
| 1086 1090 | 
             
            - fastlane_core/lib/fastlane_core/env.rb
         | 
| 1087 1091 | 
             
            - fastlane_core/lib/fastlane_core/fastlane_folder.rb
         | 
| @@ -1357,23 +1361,23 @@ metadata: | |
| 1357 1361 | 
             
            post_install_message: 
         | 
| 1358 1362 | 
             
            rdoc_options: []
         | 
| 1359 1363 | 
             
            require_paths:
         | 
| 1360 | 
            -
            - pem/lib
         | 
| 1361 | 
            -
            - produce/lib
         | 
| 1362 | 
            -
            - gym/lib
         | 
| 1363 | 
            -
            - snapshot/lib
         | 
| 1364 | 
            -
            - sigh/lib
         | 
| 1365 | 
            -
            - pilot/lib
         | 
| 1366 | 
            -
            - supply/lib
         | 
| 1367 1364 | 
             
            - cert/lib
         | 
| 1365 | 
            +
            - credentials_manager/lib
         | 
| 1368 1366 | 
             
            - deliver/lib
         | 
| 1369 | 
            -
            - match/lib
         | 
| 1370 | 
            -
            - fastlane_core/lib
         | 
| 1371 | 
            -
            - spaceship/lib
         | 
| 1372 1367 | 
             
            - fastlane/lib
         | 
| 1368 | 
            +
            - fastlane_core/lib
         | 
| 1373 1369 | 
             
            - frameit/lib
         | 
| 1374 | 
            -
            -  | 
| 1375 | 
            -
            -  | 
| 1370 | 
            +
            - gym/lib
         | 
| 1371 | 
            +
            - match/lib
         | 
| 1372 | 
            +
            - pem/lib
         | 
| 1373 | 
            +
            - pilot/lib
         | 
| 1374 | 
            +
            - produce/lib
         | 
| 1376 1375 | 
             
            - scan/lib
         | 
| 1376 | 
            +
            - screengrab/lib
         | 
| 1377 | 
            +
            - sigh/lib
         | 
| 1378 | 
            +
            - snapshot/lib
         | 
| 1379 | 
            +
            - spaceship/lib
         | 
| 1380 | 
            +
            - supply/lib
         | 
| 1377 1381 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 1378 1382 | 
             
              requirements:
         | 
| 1379 1383 | 
             
              - - ">="
         | 
| @@ -1381,14 +1385,15 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 1381 1385 | 
             
                  version: 2.0.0
         | 
| 1382 1386 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 1383 1387 | 
             
              requirements:
         | 
| 1384 | 
            -
              - - " | 
| 1388 | 
            +
              - - ">="
         | 
| 1385 1389 | 
             
                - !ruby/object:Gem::Version
         | 
| 1386 | 
            -
                  version:  | 
| 1390 | 
            +
                  version: '0'
         | 
| 1387 1391 | 
             
            requirements: []
         | 
| 1388 1392 | 
             
            rubyforge_project: 
         | 
| 1389 | 
            -
            rubygems_version: 2. | 
| 1393 | 
            +
            rubygems_version: 2.5.2
         | 
| 1390 1394 | 
             
            signing_key: 
         | 
| 1391 1395 | 
             
            specification_version: 4
         | 
| 1392 1396 | 
             
            summary: The easiest way to automate beta deployments and releases for your iOS and
         | 
| 1393 1397 | 
             
              Android apps
         | 
| 1394 1398 | 
             
            test_files: []
         | 
| 1399 | 
            +
            has_rdoc: 
         |