fastlane 2.56.0.beta.20170907010003 → 2.56.0.beta.20170908010003
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/credentials_manager/lib/credentials_manager/account_manager.rb +3 -1
- data/deliver/lib/deliver/commands_generator.rb +3 -0
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +41 -3
- data/fastlane/lib/fastlane/environment_printer.rb +2 -2
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
- data/gym/lib/gym/error_handler.rb +3 -2
- data/match/README.md +2 -0
- data/match/lib/match/options.rb +1 -1
- data/match/lib/match/runner.rb +8 -1
- data/precheck/lib/precheck/rule_processor.rb +15 -7
- data/precheck/lib/precheck/runner.rb +12 -2
- data/spaceship/lib/spaceship/client.rb +1 -1
- data/spaceship/lib/spaceship/tunes/iap_status.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72272fe0f501813a435dd4c3070400647818d4d4
|
4
|
+
data.tar.gz: 10e25aa18e05dc977efcc70e0424a377985dd0fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25b341e98475a2c8588b94b77f97a96d61a1c8d0e076935cb952c0543391b98d89cec0a444e025854884d57b0f8b72f5d4a08e769e67826f27f82c3eb1132af6
|
7
|
+
data.tar.gz: f41ecd0b5405ac0481b9db7e4ced3b135cb1531e1c55df1a08db51237cc373474098adaab5e6f712bffeefddad0de99b2c956f5da0daf517c96e903c702d7615
|
@@ -33,7 +33,9 @@ module CredentialsManager
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def fetch_password_from_env
|
36
|
-
ENV["FASTLANE_PASSWORD"] || ENV["DELIVER_PASSWORD"]
|
36
|
+
password = ENV["FASTLANE_PASSWORD"] || ENV["DELIVER_PASSWORD"]
|
37
|
+
return password if password.to_s.length > 0
|
38
|
+
return nil
|
37
39
|
end
|
38
40
|
|
39
41
|
def password(ask_if_missing: true)
|
@@ -102,7 +102,10 @@ module Deliver
|
|
102
102
|
end
|
103
103
|
|
104
104
|
require 'deliver/setup'
|
105
|
+
|
105
106
|
options = FastlaneCore::Configuration.create(deliverfile_options, options.__hash__)
|
107
|
+
options[:run_precheck_before_submit] = false # precheck doesn't need to run during init
|
108
|
+
|
106
109
|
Deliver::Runner.new(options) # to login...
|
107
110
|
Deliver::Setup.new.run(options)
|
108
111
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
1
3
|
module Fastlane
|
2
4
|
module Actions
|
3
5
|
class UploadSymbolsToCrashlyticsAction < Action
|
@@ -20,8 +22,13 @@ module Fastlane
|
|
20
22
|
dsym_paths = dsym_paths.collect { |a| File.expand_path(a) }
|
21
23
|
dsym_paths.uniq!
|
22
24
|
|
25
|
+
max_worker_threads = params[:dsym_worker_threads]
|
26
|
+
if max_worker_threads > 1
|
27
|
+
UI.message("Using #{max_worker_threads} threads for Crashlytics dSYM upload 🏎")
|
28
|
+
end
|
29
|
+
|
23
30
|
dsym_paths.each do |current_path|
|
24
|
-
handle_dsym(params, current_path)
|
31
|
+
handle_dsym(params, current_path, max_worker_threads)
|
25
32
|
end
|
26
33
|
|
27
34
|
UI.success("Successfully uploaded dSYM files to Crashlytics 💯")
|
@@ -29,7 +36,7 @@ module Fastlane
|
|
29
36
|
|
30
37
|
# @param current_path this is a path to either a dSYM or a zipped dSYM
|
31
38
|
# this might also be either nested or not, we're flexible
|
32
|
-
def self.handle_dsym(params, current_path)
|
39
|
+
def self.handle_dsym(params, current_path, max_worker_threads)
|
33
40
|
if current_path.end_with?(".dSYM")
|
34
41
|
upload_dsym(params, current_path)
|
35
42
|
elsif current_path.end_with?(".zip")
|
@@ -39,9 +46,11 @@ module Fastlane
|
|
39
46
|
Dir.mktmpdir do |dir|
|
40
47
|
Dir.chdir(dir) do
|
41
48
|
Actions.sh("unzip -qo #{current_path.shellescape}")
|
49
|
+
work_q = Queue.new
|
42
50
|
Dir["*.dSYM"].each do |sub|
|
43
|
-
|
51
|
+
work_q.push sub
|
44
52
|
end
|
53
|
+
execute_uploads(params, max_worker_threads, work_q)
|
45
54
|
end
|
46
55
|
end
|
47
56
|
else
|
@@ -49,6 +58,23 @@ module Fastlane
|
|
49
58
|
end
|
50
59
|
end
|
51
60
|
|
61
|
+
def self.execute_uploads(params, max_worker_threads, work_q)
|
62
|
+
number_of_threads = [max_worker_threads, work_q.size].min
|
63
|
+
workers = (0...number_of_threads).map do
|
64
|
+
Thread.new do
|
65
|
+
begin
|
66
|
+
while work_q.size > 0
|
67
|
+
current_path = work_q.pop(true)
|
68
|
+
upload_dsym(params, current_path)
|
69
|
+
end
|
70
|
+
rescue => ex
|
71
|
+
UI.error ex.to_s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
workers.map(&:join)
|
76
|
+
end
|
77
|
+
|
52
78
|
def self.upload_dsym(params, path)
|
53
79
|
UI.message("Uploading '#{path}'...")
|
54
80
|
command = []
|
@@ -133,6 +159,18 @@ module Fastlane
|
|
133
159
|
verify_block: proc do |value|
|
134
160
|
available = ['ios', 'appletvos', 'mac']
|
135
161
|
UI.user_error!("Invalid platform '#{value}', must be #{available.join(', ')}") unless available.include?(value)
|
162
|
+
end),
|
163
|
+
FastlaneCore::ConfigItem.new(key: :dsym_worker_threads,
|
164
|
+
env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_DSYM_WORKER_THREADS",
|
165
|
+
type: Integer,
|
166
|
+
default_value: 1,
|
167
|
+
optional: true,
|
168
|
+
description: "The number of threads to use for simultaneous dSYM upload",
|
169
|
+
verify_block: proc do |value|
|
170
|
+
min_threads = 1
|
171
|
+
max_threads = 15
|
172
|
+
UI.user_error!("Too few threads (#{value}) minimum number of threads: #{min_threads}") unless value >= min_threads
|
173
|
+
UI.user_error!("Too many threads (#{value}) maximum number of threads: #{max_threads}") unless value <= max_threads
|
136
174
|
end)
|
137
175
|
]
|
138
176
|
end
|
@@ -258,7 +258,7 @@ module Fastlane
|
|
258
258
|
env_output << "\n"
|
259
259
|
env_output << "```ruby\n"
|
260
260
|
env_output << File.read(fastlane_path)
|
261
|
-
env_output << "```\n"
|
261
|
+
env_output << "\n```\n"
|
262
262
|
env_output << "</details>"
|
263
263
|
else
|
264
264
|
env_output << "**No Fastfile found**\n"
|
@@ -272,7 +272,7 @@ module Fastlane
|
|
272
272
|
env_output << "\n"
|
273
273
|
env_output << "```ruby\n"
|
274
274
|
env_output << File.read(appfile_path)
|
275
|
-
env_output << "```\n"
|
275
|
+
env_output << "\n```\n"
|
276
276
|
env_output << "</details>"
|
277
277
|
else
|
278
278
|
env_output << "**No Appfile found**\n"
|
@@ -61,7 +61,7 @@ module FastlaneCore
|
|
61
61
|
filename = file.path
|
62
62
|
keychain = wwdr_keychain
|
63
63
|
keychain = "-k #{keychain.shellescape}" unless keychain.empty?
|
64
|
-
Helper.backticks("curl -o #{filename} #{url} && security import #{filename} #{keychain}", print: FastlaneCore::Globals.verbose?)
|
64
|
+
Helper.backticks("curl -f -o #{filename} #{url} && security import #{filename} #{keychain}", print: FastlaneCore::Globals.verbose?)
|
65
65
|
UI.user_error!("Could not install WWDR certificate") unless $?.success?
|
66
66
|
end
|
67
67
|
|
@@ -214,8 +214,9 @@ module Gym
|
|
214
214
|
def print_environment_information
|
215
215
|
if Gym.config[:export_method].to_s == "development"
|
216
216
|
UI.message("")
|
217
|
-
UI.error("Your `export_method` in gym is defined as
|
218
|
-
UI.error("which
|
217
|
+
UI.error("Your `export_method` in gym is defined as `development`")
|
218
|
+
UI.error("which might cause problems when signing your application")
|
219
|
+
UI.error("Are you sure want to build and export for development?")
|
219
220
|
UI.error("Please make sure to define the correct export methods when calling")
|
220
221
|
UI.error("gym in your Fastfile or from the command line")
|
221
222
|
UI.message("")
|
data/match/README.md
CHANGED
@@ -274,6 +274,8 @@ end
|
|
274
274
|
|
275
275
|
By using the `force_for_new_devices` parameter, `match` will check if the device count has changed since the last time you ran `match`, and automatically re-generate the provisioning profile if necessary. You can also use `force: true` to re-generate the provisioning profile on each run.
|
276
276
|
|
277
|
+
_**Important:** The `force_for_new_devices` parameter is ignored for App Store provisioning profiles since they don't contain any device information._
|
278
|
+
|
277
279
|
If you're not using `fastlane`, you can also use the `force_for_new_devices` option from the command line:
|
278
280
|
|
279
281
|
```
|
data/match/lib/match/options.rb
CHANGED
@@ -125,7 +125,7 @@ module Match
|
|
125
125
|
optional: true),
|
126
126
|
FastlaneCore::ConfigItem.new(key: :force_for_new_devices,
|
127
127
|
env_name: "MATCH_FORCE_FOR_NEW_DEVICES",
|
128
|
-
description: "Renew the provisioning profiles if the device count on the developer portal has changed",
|
128
|
+
description: "Renew the provisioning profiles if the device count on the developer portal has changed. Ignored for profile type 'appstore'",
|
129
129
|
is_string: false,
|
130
130
|
default_value: false),
|
131
131
|
FastlaneCore::ConfigItem.new(key: :skip_docs,
|
data/match/lib/match/runner.rb
CHANGED
@@ -120,7 +120,14 @@ module Match
|
|
120
120
|
profile = profiles.last
|
121
121
|
|
122
122
|
if params[:force_for_new_devices] && !params[:readonly]
|
123
|
-
|
123
|
+
if prov_type != :appstore
|
124
|
+
params[:force] = device_count_different?(profile: profile) unless params[:force]
|
125
|
+
else
|
126
|
+
# App Store provisioning profiles don't contain device identifiers and
|
127
|
+
# thus shouldn't be renewed if the device count has changed.
|
128
|
+
UI.important "Warning: `force_for_new_devices` is set but is ignored for App Store provisioning profiles."
|
129
|
+
UI.important "You can safely stop specifying `force_for_new_devices` when running Match for type 'appstore'."
|
130
|
+
end
|
124
131
|
end
|
125
132
|
|
126
133
|
if profile.nil? or params[:force]
|
@@ -55,7 +55,7 @@ module Precheck
|
|
55
55
|
rules.each do |rule|
|
56
56
|
rule_config = Precheck.config[rule.key]
|
57
57
|
rule_level = rule_config[:level].to_sym unless rule_config.nil?
|
58
|
-
rule_level ||= Precheck.config[:default_rule_level]
|
58
|
+
rule_level ||= Precheck.config[:default_rule_level].to_sym
|
59
59
|
|
60
60
|
if rule_level == RULE_LEVELS[:skip]
|
61
61
|
skipped_rules << rule
|
@@ -87,13 +87,18 @@ module Precheck
|
|
87
87
|
|
88
88
|
# if we passed, then go to the next item, otherwise, recode the failure
|
89
89
|
next unless result.status == VALIDATION_STATES[:failed]
|
90
|
-
add_new_result_to_rule_hash(rule_hash: error_results, result: result) if rule_level == RULE_LEVELS[:error]
|
91
|
-
add_new_result_to_rule_hash(rule_hash: warning_results, result: result) if rule_level == RULE_LEVELS[:warn]
|
90
|
+
error_results = add_new_result_to_rule_hash(rule_hash: error_results, result: result) if rule_level == RULE_LEVELS[:error]
|
91
|
+
warning_results = add_new_result_to_rule_hash(rule_hash: warning_results, result: result) if rule_level == RULE_LEVELS[:warn]
|
92
92
|
rule_failed_at_least_once = true
|
93
93
|
end
|
94
94
|
|
95
95
|
if rule_failed_at_least_once
|
96
|
-
|
96
|
+
message = "😵 Failed: #{rule.class.friendly_name}-> #{rule.description}"
|
97
|
+
if rule_level == RULE_LEVELS[:error]
|
98
|
+
UI.error message
|
99
|
+
else
|
100
|
+
UI.important message
|
101
|
+
end
|
97
102
|
else
|
98
103
|
UI.message "✅ Passed: #{rule.class.friendly_name}"
|
99
104
|
end
|
@@ -109,9 +114,12 @@ module Precheck
|
|
109
114
|
|
110
115
|
# hash will be { rule: [result, result, result] }
|
111
116
|
def self.add_new_result_to_rule_hash(rule_hash: nil, result: nil)
|
112
|
-
|
113
|
-
|
114
|
-
|
117
|
+
unless rule_hash.include?(result.rule)
|
118
|
+
rule_hash[result.rule] = []
|
119
|
+
end
|
120
|
+
rule_results = rule_hash[result.rule]
|
121
|
+
rule_results << result
|
122
|
+
return rule_hash
|
115
123
|
end
|
116
124
|
|
117
125
|
def self.generate_url_items_to_check(app: nil, app_version: nil)
|
@@ -40,10 +40,14 @@ module Precheck
|
|
40
40
|
end
|
41
41
|
|
42
42
|
if processor_result.should_trigger_user_error?
|
43
|
-
UI.user_error!("precheck found one or more potential problems that must be addressed before submitting to review")
|
43
|
+
UI.user_error!("precheck 👮♀️ 👮 found one or more potential problems that must be addressed before submitting to review")
|
44
44
|
return false
|
45
45
|
end
|
46
46
|
|
47
|
+
if processor_result.has_errors_or_warnings?
|
48
|
+
UI.important "precheck 👮♀️ 👮 found one or more potential metadata problems, but this won't prevent fastlane from completing 👍".yellow
|
49
|
+
end
|
50
|
+
|
47
51
|
if !processor_result.has_errors_or_warnings? && !processor_result.items_not_checked?
|
48
52
|
UI.message "precheck 👮♀️ 👮 finished without detecting any potential problems 🛫".green
|
49
53
|
end
|
@@ -77,8 +81,14 @@ module Precheck
|
|
77
81
|
if rows.length == 0
|
78
82
|
return nil
|
79
83
|
else
|
84
|
+
title_text = "Potential problems"
|
85
|
+
if error_results.length > 0
|
86
|
+
title_text = title_text.red
|
87
|
+
else
|
88
|
+
title_text = title_text.yellow
|
89
|
+
end
|
80
90
|
return Terminal::Table.new(
|
81
|
-
title:
|
91
|
+
title: title_text,
|
82
92
|
headings: ["Field", "Failure reason"],
|
83
93
|
rows: FastlaneCore::PrintTable.transform_output(rows)
|
84
94
|
).to_s
|
@@ -686,7 +686,7 @@ module Spaceship
|
|
686
686
|
end
|
687
687
|
|
688
688
|
if response.body.to_s.include?("<title>302 Found</title>")
|
689
|
-
raise AppleTimeoutError.new, "Apple 302 detected"
|
689
|
+
raise AppleTimeoutError.new, "Apple 302 detected - this might be temporary server error, check https://developer.apple.com/system-status/ to see if there is a known downtime"
|
690
690
|
end
|
691
691
|
return response
|
692
692
|
end
|
@@ -25,6 +25,9 @@ module Spaceship
|
|
25
25
|
# In-app purchase rejected for whatever reason
|
26
26
|
REJECTED = "Rejected"
|
27
27
|
|
28
|
+
# The developer took the app from the App Store
|
29
|
+
DEVELOPER_REMOVED_FROM_SALE = "Developer Removed From Sale"
|
30
|
+
|
28
31
|
# Get the iap status matching based on a string (given by iTunes Connect)
|
29
32
|
def self.get_from_string(text)
|
30
33
|
mapping = {
|
@@ -34,7 +37,8 @@ module Spaceship
|
|
34
37
|
'inReview' => IN_REVIEW,
|
35
38
|
'readyForSale' => APPROVED,
|
36
39
|
'deleted' => DELETED,
|
37
|
-
'rejected' => REJECTED
|
40
|
+
'rejected' => REJECTED,
|
41
|
+
'developerRemovedFromSale' => DEVELOPER_REMOVED_FROM_SALE
|
38
42
|
}
|
39
43
|
|
40
44
|
mapping.each do |itc_status, readable_status|
|
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.56.0.beta.
|
4
|
+
version: 2.56.0.beta.20170908010003
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
@@ -15,7 +15,7 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date: 2017-09-
|
18
|
+
date: 2017-09-08 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: slack-notifier
|