fastlane 2.28.9 → 2.29.0.beta.20170421010107

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/deliver/lib/assets/summary.html.erb +0 -3
  4. data/deliver/lib/deliver/options.rb +2 -2
  5. data/deliver/lib/deliver/upload_metadata.rb +1 -2
  6. data/fastlane/README.md +2 -6
  7. data/fastlane/lib/fastlane/actions/artifactory.rb +1 -17
  8. data/fastlane/lib/fastlane/actions/crashlytics.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/download_dsyms.rb +1 -1
  10. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +3 -17
  11. data/fastlane/lib/fastlane/actions/hockey.rb +1 -1
  12. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +3 -3
  13. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +10 -16
  14. data/fastlane/lib/fastlane/version.rb +1 -1
  15. data/fastlane_core/lib/fastlane_core/build_watcher.rb +21 -39
  16. data/fastlane_core/lib/fastlane_core/helper.rb +5 -7
  17. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +1 -4
  18. data/fastlane_core/lib/fastlane_core/print_table.rb +9 -4
  19. data/fastlane_core/lib/fastlane_core/project.rb +4 -16
  20. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +7 -11
  21. data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +2 -2
  22. data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +0 -2
  23. data/fastlane_core/lib/fastlane_core/ui/ui.rb +2 -0
  24. data/gym/lib/gym/generators/build_command_generator.rb +0 -2
  25. data/gym/lib/gym/options.rb +0 -10
  26. data/gym/lib/gym/runner.rb +0 -2
  27. data/gym/lib/gym/xcode.rb +3 -1
  28. data/pilot/lib/pilot/build_manager.rb +17 -44
  29. data/pilot/lib/pilot/commands_generator.rb +1 -2
  30. data/pilot/lib/pilot/options.rb +2 -3
  31. data/pilot/lib/pilot/tester_manager.rb +44 -58
  32. data/snapshot/lib/assets/SnapshotHelper.swift +1 -1
  33. data/spaceship/lib/spaceship/spaceauth_runner.rb +1 -1
  34. data/spaceship/lib/spaceship/test_flight.rb +0 -2
  35. data/spaceship/lib/spaceship/test_flight/base.rb +0 -12
  36. data/spaceship/lib/spaceship/test_flight/build.rb +8 -22
  37. data/spaceship/lib/spaceship/test_flight/client.rb +40 -121
  38. data/spaceship/lib/spaceship/test_flight/group.rb +7 -49
  39. data/spaceship/lib/spaceship/test_flight/test_info.rb +0 -4
  40. data/spaceship/lib/spaceship/tunes/app_ratings.rb +2 -74
  41. data/spaceship/lib/spaceship/tunes/app_status.rb +2 -4
  42. data/spaceship/lib/spaceship/tunes/application.rb +1 -1
  43. data/spaceship/lib/spaceship/tunes/iap_detail.rb +11 -48
  44. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +5 -24
  45. data/spaceship/lib/spaceship/tunes/tunes_client.rb +3 -14
  46. data/supply/lib/supply/setup.rb +2 -2
  47. metadata +16 -33
  48. data/spaceship/lib/spaceship/test_flight/app_test_info.rb +0 -27
  49. data/spaceship/lib/spaceship/test_flight/tester.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3186c50a7d29fce28650a28f133b5612b848ec1f
4
- data.tar.gz: 71c9ec36764d97635a28d1b8a1dfa4a668810e57
3
+ metadata.gz: 85014dfb38ec08df2e882b67dab2873104d1f82c
4
+ data.tar.gz: 64afaa9217e93f86628361b8725f164e8dffcf69
5
5
  SHA512:
6
- metadata.gz: 2c9bfb2132277f93c86859aafd2f1121c8a8348b719262450f66a7d3e0856e01b793adb2c937b4c2aa43906e3e1341077fb229813630190a6365f1c37fe421d9
7
- data.tar.gz: 447f4bb6b4fe48a593e83b1c2008fa55aa23bd94f9808387ebe3d7147589be38701f0d366786708d093e59bf28b4225586f52bd2241d1665f97249105c1a8d90
6
+ metadata.gz: 7d03cc1e1d52bb69d4ed64e05a28bd5917c888c419825e382e72d90df0ccb19ede70fe3e9bc43f416bdcbabe196ebfac64290a5be9c4236da0dfe8cf854868a8
7
+ data.tar.gz: e625dec851c79be6c9821c4a7c799b73daf3d7cdd7f9687298ca84c31cac38d25691dc817da05cc3a1fd3f9eadc242586b761fd64a4cc24c3d7807a263798d7f
data/README.md CHANGED
@@ -48,7 +48,7 @@ Then to deploy a new 'beta' version of your app just run
48
48
  :ghost: | [Jenkins Integration](https://docs.fastlane.tools/best-practices/continuous-integration/#jenkins-integration): Show output directly in test results
49
49
  :book: | Automatically generate Markdown documentation of your lane configurations
50
50
  :hatching_chick: | Over 170 built-in integrations available
51
- :computer: | Support for iOS and Android apps
51
+ :computer: | Support for iOS, macOS, and Android apps
52
52
  :octocat: | Full Git and Mercurial support
53
53
 
54
54
  <hr />
@@ -107,9 +107,6 @@
107
107
  margin-left: 10px;
108
108
  margin-right: 10px;
109
109
  }
110
- .app-icons {
111
- overflow: hidden;
112
- }
113
110
  .app-icons img {
114
111
  width: 150px;
115
112
  }
@@ -37,7 +37,7 @@ module Deliver
37
37
  optional: true,
38
38
  env_name: "DELIVER_IPA_PATH",
39
39
  description: "Path to your ipa file",
40
- default_value: Dir["*.ipa"].sort_by { |x| File.mtime(x) }.last,
40
+ default_value: Dir["*.ipa"].first,
41
41
  verify_block: proc do |value|
42
42
  UI.user_error!("Could not find ipa file at path '#{File.expand_path(value)}'") unless File.exist?(value)
43
43
  UI.user_error!("'#{value}' doesn't seem to be an ipa file") unless value.end_with?(".ipa")
@@ -51,7 +51,7 @@ module Deliver
51
51
  optional: true,
52
52
  env_name: "DELIVER_PKG_PATH",
53
53
  description: "Path to your pkg file",
54
- default_value: Dir["*.pkg"].sort_by { |x| File.mtime(x) }.last,
54
+ default_value: Dir["*.pkg"].first,
55
55
  verify_block: proc do |value|
56
56
  UI.user_error!("Could not find pkg file at path '#{File.expand_path(value)}'") unless File.exist?(value)
57
57
  UI.user_error!("'#{value}' doesn't seem to be a pkg file") unless value.end_with?(".pkg")
@@ -116,7 +116,7 @@ module Deliver
116
116
  end
117
117
 
118
118
  # Check folder list (an empty folder signifies a language is required)
119
- Loader.language_folders(options[:metadata_path]).each do |lng_folder|
119
+ Dir.glob(File.join(options[:metadata_path], "*")).each do |lng_folder|
120
120
  next unless File.directory?(lng_folder) # We don't want to read txt as they are non localised
121
121
 
122
122
  language = File.basename(lng_folder)
@@ -233,7 +233,6 @@ module Deliver
233
233
  UI.error(ex.to_s)
234
234
  UI.user_error!("Error parsing JSON file at path '#{options[:app_rating_config_path]}'")
235
235
  end
236
- UI.message("Setting the app's age rating...")
237
236
  v.update_rating(json)
238
237
  end
239
238
  end
data/fastlane/README.md CHANGED
@@ -91,7 +91,7 @@ fastlane release
91
91
  :ghost: | [Jenkins Integration](https://docs.fastlane.tools/best-practices/continuous-integration/#jenkins-integration): Show the output directly in the Jenkins test results
92
92
  :book: | Automatically generate a markdown documentation of your lane config
93
93
  :hatching_chick: | Over 170 built-in integrations available
94
- :computer: | Support for iOS and Android apps
94
+ :computer: | Support for iOS, macOS and Android apps
95
95
  :octocat: | Full git and mercurial support
96
96
 
97
97
 
@@ -138,11 +138,7 @@ The setup assistant will create all the necessary files for you, using the exist
138
138
  - Follow the setup assistant, which will set up ```fastlane``` for you
139
139
  - Further customise the ```Fastfile``` with [actions](https://docs.fastlane.tools/actions).
140
140
 
141
- For more details, follow our new Getting Started guides:
142
-
143
- - [Getting Started fastlane guide for iOS](https://docs.fastlane.tools/getting-started/ios/setup/)
144
- - [Getting Started fastlane guide for Android](https://docs.fastlane.tools/getting-started/android/setup/)
145
-
141
+ For more details, please follow the [fastlane guide](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Guide.md) or [documentation](https://github.com/fastlane/fastlane/tree/master/fastlane/docs).
146
142
 
147
143
  There are also 2 Japanese fastlane guides available: [qiita](http://qiita.com/gin0606/items/a8573b582752de0c15e1) and [mercari](http://tech.mercari.com/entry/2015/07/13/143000)
148
144
 
@@ -1,10 +1,5 @@
1
1
  module Fastlane
2
2
  module Actions
3
- module SharedValues
4
- ARTIFACTORY_DOWNLOAD_URL = :ARTIFACTORY_DOWNLOAD_URL
5
- ARTIFACTORY_DOWNLOAD_SIZE = :ARTIFACTORY_DOWNLOAD_SIZE
6
- end
7
-
8
3
  class ArtifactoryAction < Action
9
4
  def self.run(params)
10
5
  Actions.verify_gem!('artifactory')
@@ -22,10 +17,6 @@ module Fastlane
22
17
  }
23
18
  UI.message("Uploading file: #{artifact.local_path} ...")
24
19
  upload = artifact.upload(params[:repo], params[:repo_path], params[:properties])
25
-
26
- Actions.lane_context[SharedValues::ARTIFACTORY_DOWNLOAD_URL] = upload.uri
27
- Actions.lane_context[SharedValues::ARTIFACTORY_DOWNLOAD_SIZE] = upload.size
28
-
29
20
  UI.message("Uploaded Artifact:")
30
21
  UI.message("Repo: #{upload.repo}")
31
22
  UI.message("URI: #{upload.uri}")
@@ -53,14 +44,7 @@ module Fastlane
53
44
  end
54
45
 
55
46
  def self.author
56
- ["koglinjg", "tommeier"]
57
- end
58
-
59
- def self.output
60
- [
61
- ['ARTIFACTORY_DOWNLOAD_URL', 'The download url for file uploaded'],
62
- ['ARTIFACTORY_DOWNLOAD_SIZE', 'The reported file size for file uploaded']
63
- ]
47
+ ["koglinjg"]
64
48
  end
65
49
 
66
50
  def self.example_code
@@ -65,7 +65,7 @@ module Fastlane
65
65
  platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
66
66
 
67
67
  if platform == :ios or platform.nil?
68
- ipa_path_default = Dir["*.ipa"].sort_by { |x| File.mtime(x) }.last
68
+ ipa_path_default = Dir["*.ipa"].last
69
69
  end
70
70
 
71
71
  if platform == :android
@@ -166,7 +166,7 @@ module Fastlane
166
166
  end
167
167
 
168
168
  def self.is_supported?(platform)
169
- [:ios, :appletvos].include?(platform)
169
+ platform == :ios
170
170
  end
171
171
 
172
172
  def self.example_code
@@ -7,16 +7,13 @@ module Fastlane
7
7
  # Raises an exception and stop the lane execution if the repo is not in a clean state
8
8
  class EnsureGitStatusCleanAction < Action
9
9
  def self.run(params)
10
- repo_status = Actions.sh("git status --porcelain")
11
- repo_clean = repo_status.empty?
10
+ repo_clean = `git status --porcelain`.empty?
12
11
 
13
12
  if repo_clean
14
13
  UI.success('Git status is clean, all good! 💪')
15
14
  Actions.lane_context[SharedValues::GIT_REPO_WAS_CLEAN_ON_START] = true
16
15
  else
17
- error_message = "Git repository is dirty! Please ensure the repo is in a clean state by committing/stashing/discarding all changes first."
18
- error_message += "\nUncommitted changes:\n#{repo_status}" if params[:show_uncommitted_changes]
19
- UI.user_error!(error_message)
16
+ UI.user_error!("Git repository is dirty! Please ensure the repo is in a clean state by committing/stashing/discarding all changes first.")
20
17
  end
21
18
  end
22
19
 
@@ -41,24 +38,13 @@ module Fastlane
41
38
  end
42
39
 
43
40
  def self.author
44
- ["lmirosevic", "antondomashnev"]
41
+ "lmirosevic"
45
42
  end
46
43
 
47
44
  def self.example_code
48
45
  ['ensure_git_status_clean']
49
46
  end
50
47
 
51
- def self.available_options
52
- [
53
- FastlaneCore::ConfigItem.new(key: :show_uncommitted_changes,
54
- env_name: "FL_ENSURE_GIT_STATUS_CLEAN_SHOW_UNCOMMITTED_CHANGES",
55
- description: "The flag whether to show uncommitted changes if the repo is dirty",
56
- optional: true,
57
- default_value: false,
58
- is_string: false)
59
- ]
60
- end
61
-
62
48
  def self.category
63
49
  :source_control
64
50
  end
@@ -250,7 +250,7 @@ module Fastlane
250
250
  default_value: "1"),
251
251
  FastlaneCore::ConfigItem.new(key: :status,
252
252
  env_name: "FL_HOCKEY_STATUS",
253
- description: "Download status: \"1\" = No user can download; \"2\" = Available for download (only possible with full-access token)",
253
+ description: "Download status: \"1\" = No user can download; \"2\" = Available for download",
254
254
  default_value: "2"),
255
255
  FastlaneCore::ConfigItem.new(key: :notes_type,
256
256
  env_name: "FL_HOCKEY_NOTES_TYPE",
@@ -128,10 +128,10 @@ module Fastlane
128
128
  end),
129
129
  FastlaneCore::ConfigItem.new(key: :platform,
130
130
  env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_PLATFORM",
131
- description: "The platform of the app (ios, appletvos, mac)",
131
+ description: "The platform of the app (ios, tvos, mac)",
132
132
  default_value: "ios",
133
133
  verify_block: proc do |value|
134
- available = ['ios', 'appletvos', 'mac']
134
+ available = ['ios', 'tvos', 'mac']
135
135
  UI.user_error!("Invalid platform '#{value}', must be #{available.join(', ')}") unless available.include?(value)
136
136
  end)
137
137
  ]
@@ -150,7 +150,7 @@ module Fastlane
150
150
  end
151
151
 
152
152
  def self.is_supported?(platform)
153
- [:ios, :appletvos].include?(platform)
153
+ platform == :ios
154
154
  end
155
155
 
156
156
  def self.example_code
@@ -1,6 +1,6 @@
1
1
  Style/PercentLiteralDelimiters:
2
2
  Enabled: false
3
-
3
+
4
4
  # kind_of? is a good way to check a type
5
5
  Style/ClassCheck:
6
6
  EnforcedStyle: kind_of?
@@ -16,12 +16,6 @@ Style/SafeNavigation:
16
16
  Performance/RegexpMatch:
17
17
  Enabled: false
18
18
 
19
- # This suggests use of `tr` instead of `gsub`. While this might be more performant,
20
- # these methods are not at all interchangable, and behave very differently. This can
21
- # lead to people making the substitution without considering the differences.
22
- Performance/StringReplacement:
23
- Enabled: false
24
-
25
19
  # .length == 0 is also good, we don't always want .zero?
26
20
  Style/NumericPredicate:
27
21
  Enabled: false
@@ -29,7 +23,7 @@ Style/NumericPredicate:
29
23
  # this would cause errors with long lanes
30
24
  Metrics/BlockLength:
31
25
  Enabled: false
32
-
26
+
33
27
  # this is a bit buggy
34
28
  Metrics/ModuleLength:
35
29
  Enabled: false
@@ -42,23 +36,23 @@ Style/VariableNumber:
42
36
  Style/MethodMissing:
43
37
  Enabled: false
44
38
 
45
- #
39
+ #
46
40
  # File.chmod(0777, f)
47
- #
41
+ #
48
42
  # is easier to read than
49
- #
43
+ #
50
44
  # File.chmod(0o777, f)
51
- #
45
+ #
52
46
  Style/NumericLiteralPrefix:
53
47
  Enabled: false
54
48
 
55
- #
49
+ #
56
50
  # command = (!clean_expired.nil? || !clean_pattern.nil?) ? CLEANUP : LIST
57
- #
51
+ #
58
52
  # is easier to read than
59
- #
53
+ #
60
54
  # command = !clean_expired.nil? || !clean_pattern.nil? ? CLEANUP : LIST
61
- #
55
+ #
62
56
  Style/TernaryParentheses:
63
57
  Enabled: false
64
58
 
@@ -1,4 +1,4 @@
1
1
  module Fastlane
2
- VERSION = '2.28.9'.freeze
2
+ VERSION = '2.29.0.beta.20170421010107'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  end
@@ -1,54 +1,36 @@
1
1
  module FastlaneCore
2
2
  class BuildWatcher
3
- class << self
4
- # @return The build we waited for. This method will always return a build
5
- def wait_for_build_processing_to_be_complete(app_id: nil, platform: nil)
6
- # First, find the train and build version we want to watch for
7
- watched_build = watching_build(app_id: app_id, platform: platform)
8
- UI.crash!("Could not find a build for app: #{app_id} on platform: #{platform}") if watched_build.nil?
3
+ # @return The build we waited for. This method will always return a build
4
+ def self.wait_for_build_processing_to_be_complete(app_id: nil, platform: nil)
5
+ # First, find the train and build version we want to watch for
6
+ processing_builds = Spaceship::TestFlight::Build.all_processing_builds(app_id: app_id, platform: platform)
9
7
 
10
- loop do
11
- matched_build = matching_build(watched_build: watched_build, app_id: app_id, platform: platform)
8
+ watching_build = processing_builds.sort_by(&:upload_date).last # either it's still processing
9
+ watching_build ||= Spaceship::TestFlight::Build.latest(app_id: app_id, platform: platform) # or we fallback to the most recent uplaod
12
10
 
13
- report_status(build: matched_build)
11
+ loop do
12
+ UI.message("Waiting for iTunes Connect to finish processing the new build (#{watching_build.train_version} - #{watching_build.build_version})")
14
13
 
15
- if matched_build && matched_build.processed?
16
- return matched_build
17
- end
18
-
19
- sleep 10
20
- end
21
- end
22
-
23
- private
24
-
25
- def watching_build(app_id: nil, platform: nil)
26
- processing_builds = Spaceship::TestFlight::Build.all_processing_builds(app_id: app_id, platform: platform)
27
-
28
- watched_build = processing_builds.sort_by(&:upload_date).last
29
- watched_build || Spaceship::TestFlight::Build.latest(app_id: app_id, platform: platform)
30
- end
31
-
32
- def matching_build(watched_build: nil, app_id: nil, platform: nil)
33
- matched_builds = Spaceship::TestFlight::Build.builds_for_train(app_id: app_id, platform: platform, train_version: watched_build.train_version)
34
- matched_builds.find { |build| build.build_version == watched_build.build_version }
35
- end
36
-
37
- def report_status(build: nil)
38
14
  # Due to iTunes Connect, builds disappear from the build list alltogether
39
15
  # after they finished processing. Before returning this build, we have to
40
16
  # wait for the build to appear in the build list again
41
17
  # As this method is very often used to wait for a build, and then do something
42
18
  # with it, we have to be sure that the build actually is ready
43
- if build.nil?
19
+
20
+ matching_builds = Spaceship::TestFlight::Build.builds_for_train(app_id: app_id, platform: platform, train_version: watching_build.train_version)
21
+ matching_build = matching_builds.find { |build| build.build_version == watching_build.build_version }
22
+
23
+ if matching_build.nil?
44
24
  UI.message("Build doesn't show up in the build list any more, waiting for it to appear again")
45
- elsif build.active?
46
- UI.success("Build #{build.train_version} - #{build.build_version} is already being tested")
47
- elsif build.ready_to_submit? || build.export_compliance_missing?
48
- UI.success("Successfully finished processing the build #{build.train_version} - #{build.build_version}")
49
- else
50
- UI.message("Waiting for iTunes Connect to finish processing the new build (#{build.train_version} - #{build.build_version})")
25
+ elsif matching_build.active?
26
+ UI.success("Build #{matching_build.train_version} - #{matching_build.build_version} is already being tested")
27
+ return matching_build
28
+ elsif matching_build.ready_to_submit?
29
+ UI.success("Successfully finished processing the build #{matching_build.train_version} - #{matching_build.build_version}")
30
+ return matching_build
51
31
  end
32
+
33
+ sleep 10
52
34
  end
53
35
  end
54
36
  end
@@ -118,6 +118,11 @@ module FastlaneCore
118
118
  FastlaneCore::Env.truthy?("TERM_PROGRAM_VERSION")
119
119
  end
120
120
 
121
+ # Does the user use iTerm?
122
+ def self.iterm?
123
+ FastlaneCore::Env.truthy?("ITERM_SESSION_ID")
124
+ end
125
+
121
126
  # Logs base directory
122
127
  def self.buildlog_path
123
128
  return ENV["FL_BUILDLOG_PATH"] || "~/Library/Logs"
@@ -208,13 +213,6 @@ module FastlaneCore
208
213
  keychain_path
209
214
  end
210
215
 
211
- # @return true if XCode version is higher than 8.3
212
- def self.xcode_at_least?(version)
213
- FastlaneCore::UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if xcode_version.nil?
214
- v = xcode_version
215
- Gem::Version.new(v) >= Gem::Version.new(version)
216
- end
217
-
218
216
  # @return the full path to the iTMSTransporter executable
219
217
  def self.itms_path
220
218
  return ENV["FASTLANE_ITUNES_TRANSPORTER_PATH"] if FastlaneCore::Env.truthy?("FASTLANE_ITUNES_TRANSPORTER_PATH")
@@ -376,10 +376,7 @@ module FastlaneCore
376
376
  def load_password_for_transporter
377
377
  # 3 different sources for the password
378
378
  # 1) ENV variable for application specific password
379
- if ENV[TWO_FACTOR_ENV_VARIABLE].to_s.length > 0
380
- UI.message("Fetching password for transporter from environment variable named `#{TWO_FACTOR_ENV_VARIABLE}`")
381
- return ENV[TWO_FACTOR_ENV_VARIABLE]
382
- end
379
+ return ENV[TWO_FACTOR_ENV_VARIABLE] if ENV[TWO_FACTOR_ENV_VARIABLE].to_s.length > 0
383
380
  # 2) TWO_STEP_HOST_PREFIX from keychain
384
381
  account_manager = CredentialsManager::AccountManager.new(user: @user,
385
382
  prefix: TWO_STEP_HOST_PREFIX,
@@ -44,7 +44,7 @@ module FastlaneCore
44
44
  value = ""
45
45
  array.each do |l|
46
46
  colored_line = l
47
- colored_line = "#{colors.first}#{l}#{colors.last}" if colors.length > 0
47
+ colored_line = "#{colors.first[0]}#{l}#{colors.last[0]}" if colors.length > 0
48
48
  value << colored_line
49
49
  value << "\n"
50
50
  end
@@ -68,10 +68,15 @@ module FastlaneCore
68
68
  return value.middle_truncate(max_value_length)
69
69
  elsif transform == :newline
70
70
  # remove all fixed newlines as it may mess up the output
71
- value.gsub!("\n", " ") if value.kind_of?(String)
71
+ value.tr!("\n", " ") if value.kind_of?(String)
72
72
  if value.length >= max_value_length
73
- colors = value.scan(/\e\[.*?m/)
74
- colors.each { |color| value.gsub!(color, '') }
73
+ colors = value.scan(/(\e\[.*?m)/)
74
+ if colors && colors.length > 0
75
+ colors.each do |color|
76
+ value.delete!(color.first)
77
+ value.delete!(color.last)
78
+ end
79
+ end
75
80
  lines = value.wordwrap(max_value_length)
76
81
  return colorize_array(lines, colors)
77
82
  end
@@ -279,14 +279,9 @@ module FastlaneCore
279
279
  def build_xcodebuild_showbuildsettings_command
280
280
  # We also need to pass the workspace and scheme to this command.
281
281
  #
282
- # The 'clean' portion of this command was a workaround for an xcodebuild bug with Core Data projects.
283
- # This xcodebuild bug is fixed in Xcode 8.3 so 'clean' it's not necessary anymore
282
+ # The 'clean' portion of this command is a workaround for an xcodebuild bug with Core Data projects.
284
283
  # See: https://github.com/fastlane/fastlane/pull/5626
285
- if FastlaneCore::Helper.xcode_at_least?('8.3')
286
- command = "xcodebuild -showBuildSettings #{xcodebuild_parameters.join(' ')}"
287
- else
288
- command = "xcodebuild clean -showBuildSettings #{xcodebuild_parameters.join(' ')}"
289
- end
284
+ command = "xcodebuild clean -showBuildSettings #{xcodebuild_parameters.join(' ')}"
290
285
  command += " 2> /dev/null" if xcodebuild_suppress_stderr
291
286
  command
292
287
  end
@@ -296,16 +291,9 @@ module FastlaneCore
296
291
  # @param [String] The key of which we want the value for (e.g. "PRODUCT_NAME")
297
292
  def build_settings(key: nil, optional: true)
298
293
  unless @build_settings
299
- if is_workspace
300
- if schemes.count == 0
301
- UI.user_error!("Could not find any schemes for Xcode workspace at path '#{self.path}'. Please make sure that the schemes you want to use are marked as `Shared` from Xcode.")
302
- end
303
- options[:scheme] ||= schemes.first
304
- end
305
-
306
294
  command = build_xcodebuild_showbuildsettings_command
307
295
 
308
- # Xcode might hang here and retrying fixes the problem, see fastlane#4059
296
+ # xcode might hang here and retrying fixes the problem, see fastlane#4059
309
297
  begin
310
298
  timeout = FastlaneCore::Project.xcode_build_settings_timeout
311
299
  retries = FastlaneCore::Project.xcode_build_settings_retries
@@ -339,7 +327,7 @@ module FastlaneCore
339
327
 
340
328
  # Returns the build settings and sets the default scheme to the options hash
341
329
  def default_build_settings(key: nil, optional: true)
342
- options[:scheme] ||= schemes.first if is_workspace
330
+ options[:scheme] = schemes.first if is_workspace
343
331
  build_settings(key: key, optional: optional)
344
332
  end
345
333