fastlane 2.113.0.beta.20181220200101 → 2.113.0.beta.20181221200014
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/keychain_importer.rb +11 -2
- data/match/lib/match/options.rb +86 -72
- data/snapshot/lib/snapshot/page.html.erb +115 -21
- data/snapshot/lib/snapshot/reports_generator.rb +14 -6
- data/spaceship/lib/spaceship/client.rb +2 -2
- data/spaceship/lib/spaceship/tunes/app_version.rb +4 -0
- data/spaceship/lib/spaceship/tunes/application.rb +12 -0
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +24 -4
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66a3631181a2f1412c6c2cd8f8a5acf7225ab1cb
|
4
|
+
data.tar.gz: 91c673a83c9a5d68063e89aa124db692a98fc457
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 167231d8961df63f4cb2b2d7bdc37deb2d09eec995f14206c50b5b886b96b40d697511f16f0b53f479a1ee45c8bd18d1644243380624245a64f2c12b9b4564d7
|
7
|
+
data.tar.gz: eae79d697eeae551e2b10d709af45538e427286390e070f24f1917085cf0bcfb65bc0657d448793a8cdb4ac9ffe6abf20cda9037a741f02e58147afea2843aa3
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.113.0.beta.
|
2
|
+
VERSION = '2.113.0.beta.20181221200014'.freeze
|
3
3
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
4
4
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
5
5
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'helper'
|
2
|
+
require 'open3'
|
2
3
|
|
3
4
|
module FastlaneCore
|
4
5
|
class KeychainImporter
|
@@ -20,9 +21,17 @@ module FastlaneCore
|
|
20
21
|
command << " -S apple-tool:,apple:"
|
21
22
|
command << " -k #{keychain_password.to_s.shellescape}"
|
22
23
|
command << " #{keychain_path.shellescape}"
|
23
|
-
command << " &> /dev/null" unless output
|
24
24
|
|
25
|
-
|
25
|
+
Open3.popen3(command) do |stdin, stdout, stderr, thrd|
|
26
|
+
if output
|
27
|
+
UI.command(command)
|
28
|
+
UI.command_output(stdout.read)
|
29
|
+
end
|
30
|
+
|
31
|
+
unless thrd.value.success?
|
32
|
+
UI.user_error!("Could not configure key to bypass permission popup:\n#{stderr.read}")
|
33
|
+
end
|
34
|
+
end
|
26
35
|
end
|
27
36
|
end
|
28
37
|
end
|
data/match/lib/match/options.rb
CHANGED
@@ -15,15 +15,7 @@ module Match
|
|
15
15
|
user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
|
16
16
|
|
17
17
|
[
|
18
|
-
|
19
|
-
env_name: "MATCH_GIT_URL",
|
20
|
-
description: "URL to the git repo containing all the certificates",
|
21
|
-
optional: false,
|
22
|
-
short_option: "-r"),
|
23
|
-
FastlaneCore::ConfigItem.new(key: :git_branch,
|
24
|
-
env_name: "MATCH_GIT_BRANCH",
|
25
|
-
description: "Specific git branch to use",
|
26
|
-
default_value: 'master'),
|
18
|
+
# main
|
27
19
|
FastlaneCore::ConfigItem.new(key: :type,
|
28
20
|
env_name: "MATCH_TYPE",
|
29
21
|
description: "Define the profile type, can be #{Match.environments.join(', ')}",
|
@@ -35,17 +27,13 @@ module Match
|
|
35
27
|
UI.user_error!("Unsupported environment #{value}, must be in #{Match.environments.join(', ')}")
|
36
28
|
end
|
37
29
|
end),
|
38
|
-
FastlaneCore::ConfigItem.new(key: :
|
39
|
-
env_name: "
|
40
|
-
description: "
|
41
|
-
is_string:
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
unless Match.storage_modes.include?(value)
|
46
|
-
UI.user_error!("Unsupported storage_mode #{value}, must be in #{Match.storage_modes.join(', ')}")
|
47
|
-
end
|
48
|
-
end),
|
30
|
+
FastlaneCore::ConfigItem.new(key: :readonly,
|
31
|
+
env_name: "MATCH_READONLY",
|
32
|
+
description: "Only fetch existing certificates and profiles, don't generate new ones",
|
33
|
+
is_string: false,
|
34
|
+
default_value: false),
|
35
|
+
|
36
|
+
# app
|
49
37
|
FastlaneCore::ConfigItem.new(key: :app_identifier,
|
50
38
|
short_option: "-a",
|
51
39
|
env_name: "MATCH_APP_IDENTIFIER",
|
@@ -62,22 +50,6 @@ module Match
|
|
62
50
|
description: "Your Apple ID Username",
|
63
51
|
default_value: user,
|
64
52
|
default_value_dynamic: true),
|
65
|
-
FastlaneCore::ConfigItem.new(key: :keychain_name,
|
66
|
-
short_option: "-s",
|
67
|
-
env_name: "MATCH_KEYCHAIN_NAME",
|
68
|
-
description: "Keychain the items should be imported to",
|
69
|
-
default_value: "login.keychain"),
|
70
|
-
FastlaneCore::ConfigItem.new(key: :keychain_password,
|
71
|
-
short_option: "-p",
|
72
|
-
env_name: "MATCH_KEYCHAIN_PASSWORD",
|
73
|
-
sensitive: true,
|
74
|
-
description: "This might be required the first time you access certificates on a new mac. For the login/default keychain this is your account password",
|
75
|
-
optional: true),
|
76
|
-
FastlaneCore::ConfigItem.new(key: :readonly,
|
77
|
-
env_name: "MATCH_READONLY",
|
78
|
-
description: "Only fetch existing certificates and profiles, don't generate new ones",
|
79
|
-
is_string: false,
|
80
|
-
default_value: false),
|
81
53
|
FastlaneCore::ConfigItem.new(key: :team_id,
|
82
54
|
short_option: "-b",
|
83
55
|
env_name: "FASTLANE_TEAM_ID",
|
@@ -86,16 +58,6 @@ module Match
|
|
86
58
|
code_gen_sensitive: true,
|
87
59
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_id),
|
88
60
|
default_value_dynamic: true),
|
89
|
-
FastlaneCore::ConfigItem.new(key: :git_full_name,
|
90
|
-
env_name: "MATCH_GIT_FULL_NAME",
|
91
|
-
description: "git user full name to commit",
|
92
|
-
optional: true,
|
93
|
-
default_value: nil),
|
94
|
-
FastlaneCore::ConfigItem.new(key: :git_user_email,
|
95
|
-
env_name: "MATCH_GIT_USER_EMAIL",
|
96
|
-
description: "git user email to commit",
|
97
|
-
optional: true,
|
98
|
-
default_value: nil),
|
99
61
|
FastlaneCore::ConfigItem.new(key: :team_name,
|
100
62
|
short_option: "-l",
|
101
63
|
env_name: "FASTLANE_TEAM_NAME",
|
@@ -104,24 +66,40 @@ module Match
|
|
104
66
|
code_gen_sensitive: true,
|
105
67
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:team_name),
|
106
68
|
default_value_dynamic: true),
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
69
|
+
|
70
|
+
# Storage
|
71
|
+
FastlaneCore::ConfigItem.new(key: :storage_mode,
|
72
|
+
env_name: "MATCH_STORAGE_MODE",
|
73
|
+
description: "Define where you want to store your certificates",
|
74
|
+
is_string: true,
|
75
|
+
short_option: "-q",
|
76
|
+
default_value: 'git',
|
112
77
|
verify_block: proc do |value|
|
113
|
-
|
78
|
+
unless Match.storage_modes.include?(value)
|
79
|
+
UI.user_error!("Unsupported storage_mode #{value}, must be in #{Match.storage_modes.join(', ')}")
|
80
|
+
end
|
114
81
|
end),
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
82
|
+
|
83
|
+
# Storage: Git
|
84
|
+
FastlaneCore::ConfigItem.new(key: :git_url,
|
85
|
+
env_name: "MATCH_GIT_URL",
|
86
|
+
description: "URL to the git repo containing all the certificates",
|
87
|
+
optional: false,
|
88
|
+
short_option: "-r"),
|
89
|
+
FastlaneCore::ConfigItem.new(key: :git_branch,
|
90
|
+
env_name: "MATCH_GIT_BRANCH",
|
91
|
+
description: "Specific git branch to use",
|
92
|
+
default_value: 'master'),
|
93
|
+
FastlaneCore::ConfigItem.new(key: :git_full_name,
|
94
|
+
env_name: "MATCH_GIT_FULL_NAME",
|
95
|
+
description: "git user full name to commit",
|
96
|
+
optional: true,
|
97
|
+
default_value: nil),
|
98
|
+
FastlaneCore::ConfigItem.new(key: :git_user_email,
|
99
|
+
env_name: "MATCH_GIT_USER_EMAIL",
|
100
|
+
description: "git user email to commit",
|
101
|
+
optional: true,
|
102
|
+
default_value: nil),
|
125
103
|
FastlaneCore::ConfigItem.new(key: :shallow_clone,
|
126
104
|
env_name: "MATCH_SHALLOW_CLONE",
|
127
105
|
description: "Make a shallow clone of the repository (truncate the history to 1 revision)",
|
@@ -132,11 +110,49 @@ module Match
|
|
132
110
|
description: "Clone just the branch specified, instead of the whole repo. This requires that the branch already exists. Otherwise the command will fail",
|
133
111
|
is_string: false,
|
134
112
|
default_value: false),
|
113
|
+
|
114
|
+
# Storage: Google Cloud
|
115
|
+
FastlaneCore::ConfigItem.new(key: :google_cloud_bucket_name,
|
116
|
+
env_name: "MATCH_GOOGLE_CLOUD_BUCKET_NAME",
|
117
|
+
description: "Name of the Google Cloud Storage bucket to use",
|
118
|
+
optional: true),
|
119
|
+
FastlaneCore::ConfigItem.new(key: :google_cloud_keys_file,
|
120
|
+
env_name: "MATCH_GOOGLE_CLOUD_KEYS_FILE",
|
121
|
+
description: "Path to the gc_keys.json file",
|
122
|
+
optional: true,
|
123
|
+
verify_block: proc do |value|
|
124
|
+
UI.user_error!("Could not find keys file at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
125
|
+
end),
|
126
|
+
|
127
|
+
# Keychain
|
128
|
+
FastlaneCore::ConfigItem.new(key: :keychain_name,
|
129
|
+
short_option: "-s",
|
130
|
+
env_name: "MATCH_KEYCHAIN_NAME",
|
131
|
+
description: "Keychain the items should be imported to",
|
132
|
+
default_value: "login.keychain"),
|
133
|
+
FastlaneCore::ConfigItem.new(key: :keychain_password,
|
134
|
+
short_option: "-p",
|
135
|
+
env_name: "MATCH_KEYCHAIN_PASSWORD",
|
136
|
+
sensitive: true,
|
137
|
+
description: "This might be required the first time you access certificates on a new mac. For the login/default keychain this is your account password",
|
138
|
+
optional: true),
|
139
|
+
|
140
|
+
# settings
|
141
|
+
FastlaneCore::ConfigItem.new(key: :force,
|
142
|
+
env_name: "MATCH_FORCE",
|
143
|
+
description: "Renew the provisioning profiles every time you run match",
|
144
|
+
is_string: false,
|
145
|
+
default_value: false),
|
135
146
|
FastlaneCore::ConfigItem.new(key: :force_for_new_devices,
|
136
147
|
env_name: "MATCH_FORCE_FOR_NEW_DEVICES",
|
137
148
|
description: "Renew the provisioning profiles if the device count on the developer portal has changed. Ignored for profile type 'appstore'",
|
138
149
|
is_string: false,
|
139
150
|
default_value: false),
|
151
|
+
FastlaneCore::ConfigItem.new(key: :skip_confirmation,
|
152
|
+
env_name: "MATCH_SKIP_CONFIRMATION",
|
153
|
+
description: "Disables confirmation prompts during nuke, answering them with yes",
|
154
|
+
is_string: false,
|
155
|
+
default_value: false),
|
140
156
|
FastlaneCore::ConfigItem.new(key: :skip_docs,
|
141
157
|
env_name: "MATCH_SKIP_DOCS",
|
142
158
|
description: "Skip generation of a README.md for the created git repository",
|
@@ -158,18 +174,16 @@ module Match
|
|
158
174
|
description: "The name of provisioning profile template. If the developer account has provisioning profile templates (aka: custom entitlements), the template name can be found by inspecting the Entitlements drop-down while creating/editing a provisioning profile (e.g. \"Apple Pay Pass Suppression Development\")",
|
159
175
|
optional: true,
|
160
176
|
default_value: nil),
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
optional: true,
|
177
|
+
|
178
|
+
# other
|
179
|
+
FastlaneCore::ConfigItem.new(key: :verbose,
|
180
|
+
env_name: "MATCH_VERBOSE",
|
181
|
+
description: "Print out extra information and all commands",
|
182
|
+
is_string: false,
|
183
|
+
default_value: false,
|
169
184
|
verify_block: proc do |value|
|
170
|
-
|
185
|
+
FastlaneCore::Globals.verbose = true if value
|
171
186
|
end)
|
172
|
-
|
173
187
|
]
|
174
188
|
end
|
175
189
|
end
|
@@ -8,8 +8,26 @@
|
|
8
8
|
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
|
9
9
|
font-weight: 300;
|
10
10
|
}
|
11
|
-
|
12
|
-
|
11
|
+
#sortMenu {
|
12
|
+
overflow: hidden;
|
13
|
+
border: 1px solid #ccc;
|
14
|
+
background-color: #f1f1f1;
|
15
|
+
display: none;
|
16
|
+
}
|
17
|
+
#sortMenu button {
|
18
|
+
background-color: inherit;
|
19
|
+
float: left;
|
20
|
+
border: none;
|
21
|
+
outline: none;
|
22
|
+
cursor: pointer;
|
23
|
+
padding: 14px 16px;
|
24
|
+
font-size: 17px;
|
25
|
+
}
|
26
|
+
#sortMenu button:hover {
|
27
|
+
background-color: #ddd;
|
28
|
+
}
|
29
|
+
#sortMenu button.active {
|
30
|
+
background-color: #ccc;
|
13
31
|
}
|
14
32
|
.deviceName {
|
15
33
|
display: block;
|
@@ -22,6 +40,14 @@
|
|
22
40
|
border: 1px #EEE solid;
|
23
41
|
z-index: 0;
|
24
42
|
}
|
43
|
+
.caption {
|
44
|
+
font-size: 24px;
|
45
|
+
padding-bottom: 24px;
|
46
|
+
padding-top: 30px;
|
47
|
+
}
|
48
|
+
h1, h2 {
|
49
|
+
font-weight: bold;
|
50
|
+
}
|
25
51
|
th {
|
26
52
|
text-align: left;
|
27
53
|
}
|
@@ -64,23 +90,48 @@
|
|
64
90
|
}
|
65
91
|
</style>
|
66
92
|
</head>
|
67
|
-
<body
|
68
|
-
<
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
93
|
+
<body>
|
94
|
+
<div id="sortMenu">
|
95
|
+
<button id="defaultTab" class="tabLink" onclick="openTab(event, 'byLanguage')">By Language</button>
|
96
|
+
<button class="tabLink" onclick="openTab(event, 'byScreen')">By Screen</button>
|
97
|
+
</div>
|
98
|
+
<div id="byLanguage" class="tabContent"><h1 class="tabTitle">By Language:</h1><% image_counter = 0 %><% @data_by_language.each do |language, content| %>
|
99
|
+
<h2 id="<%= language %>"><%= language %></h2>
|
100
|
+
<hr>
|
101
|
+
<table><% content.each do |device_name, screens| %>
|
102
|
+
<tr>
|
103
|
+
<th colspan="<%= screens.count %>">
|
104
|
+
<a id="<%= language %>-<%= device_name %>" class="deviceName" href="#<%= language %>-<%= device_name %>"><%= device_name %></a>
|
105
|
+
</th>
|
106
|
+
</tr>
|
107
|
+
<tr><% screens.each do |screen_path| %><% next if screen_path.include?"_framed.png" %>
|
108
|
+
<td><% image_counter += 1 %>
|
109
|
+
<a href="<%= screen_path %>" target="_blank" class="screenshotLink">
|
110
|
+
<img class="screenshot" src="<%= screen_path %>" style="width: 100%;" alt="<%= language %> <%= device_name %>" data-tab="1" data-counter="<%= image_counter %>">
|
111
|
+
</a>
|
112
|
+
</td><% end %>
|
113
|
+
</tr><% end %>
|
114
|
+
</table><% end %>
|
115
|
+
</div>
|
116
|
+
<div id="byScreen" class="tabContent"><h1 class="tabTitle">By Screen:</h1><% image_counter = 0 %><% @data_by_screen.each do |screen, content| %>
|
117
|
+
<h2 id="<%= screen %>" class="screen"><%= screen %></h2>
|
118
|
+
<hr>
|
119
|
+
<table><% content.each do |device_name, screens| %>
|
120
|
+
<tr>
|
121
|
+
<th colspan="<%= screens.count %>">
|
122
|
+
<a id="<%= screen %>-<%= device_name %>" class="deviceName" href="#<%= screen %>-<%= device_name %>"><%= device_name %></a>
|
123
|
+
</th>
|
124
|
+
</tr>
|
125
|
+
<tr><% screens.each do |language, screen_path| %><% next if screen_path.include?"_framed.png" %>
|
126
|
+
<td><% image_counter += 1 %>
|
127
|
+
<a href="<%= screen_path %>" target="_blank" class="screenshotLink">
|
128
|
+
<img class="screenshot" src="<%= screen_path %>" style="width: 100%;" alt="<%= language %> <%= device_name %>" data-tab="2" data-counter="<%= image_counter %>">
|
129
|
+
</a>
|
130
|
+
<div class="caption"><%= language %></div>
|
131
|
+
</td><% end %>
|
132
|
+
</tr><% end %>
|
133
|
+
</table><% end %>
|
134
|
+
</div>
|
84
135
|
<div id="overlay">
|
85
136
|
<img id="imageDisplay" src="" alt="" />
|
86
137
|
<div id="imageInfo"></div>
|
@@ -91,6 +142,48 @@
|
|
91
142
|
var imageInfo = document.getElementById('imageInfo');
|
92
143
|
var screenshotLink = document.getElementsByClassName('screenshotLink');
|
93
144
|
|
145
|
+
window.onload = setup();
|
146
|
+
|
147
|
+
function setup() {
|
148
|
+
var i, menu, tabTitles;
|
149
|
+
|
150
|
+
// Since JS is enabled, show sort menu and hide tab titles
|
151
|
+
menu = document.getElementById("sortMenu");
|
152
|
+
menu.style.display = "block";
|
153
|
+
|
154
|
+
tabTitles = document.getElementsByClassName("tabTitle");
|
155
|
+
for (i = 0; i < tabTitles.length; i++) {
|
156
|
+
tabTitles[i].style.display = "none";
|
157
|
+
}
|
158
|
+
|
159
|
+
doClick(document.getElementById("defaultTab"));
|
160
|
+
}
|
161
|
+
|
162
|
+
function getCurrentTab() {
|
163
|
+
var i, tabs;
|
164
|
+
tabs = document.getElementsByClassName("tabContent");
|
165
|
+
for (i = 0; i < tabs.length; i++) {
|
166
|
+
if (tabs[i].style.display != "none") {
|
167
|
+
return i + 1;
|
168
|
+
}
|
169
|
+
}
|
170
|
+
return 1; // fallback
|
171
|
+
}
|
172
|
+
|
173
|
+
function openTab(evt, tabName) {
|
174
|
+
var i, tabContent, tabLinks;
|
175
|
+
tabs = document.getElementsByClassName("tabContent");
|
176
|
+
for (i = 0; i < tabs.length; i++) {
|
177
|
+
tabs[i].style.display = "none";
|
178
|
+
}
|
179
|
+
tabLinks = document.getElementsByClassName("tabLink");
|
180
|
+
for (i = 0; i < tabLinks.length; i++) {
|
181
|
+
tabLinks[i].className = tabLinks[i].className.replace(" active", "");
|
182
|
+
}
|
183
|
+
document.getElementById(tabName).style.display = "block";
|
184
|
+
evt.currentTarget.className += " active";
|
185
|
+
}
|
186
|
+
|
94
187
|
function doClick(el) {
|
95
188
|
if (document.createEvent) {
|
96
189
|
var evObj = document.createEvent('MouseEvents', true);
|
@@ -141,12 +234,13 @@
|
|
141
234
|
|
142
235
|
overlay.style.display = "none";
|
143
236
|
|
237
|
+
img_tab = parseInt(getCurrentTab());
|
144
238
|
img_counter = parseInt(e.target.dataset.counter) + 1;
|
145
239
|
try {
|
146
|
-
link = document.body.querySelector('img[data-counter="'+img_counter+'"]').parentNode;
|
240
|
+
link = document.body.querySelector('img[data-tab="'+img_tab+'"][data-counter="'+img_counter+'"]').parentNode;
|
147
241
|
} catch (e) {
|
148
242
|
try {
|
149
|
-
link = document.body.querySelector('img[data-counter="0"]').parentNode;
|
243
|
+
link = document.body.querySelector('img[data-tab="'+img_tab+'"][data-counter="0"]').parentNode;
|
150
244
|
} catch (e) {
|
151
245
|
return false;
|
152
246
|
}
|
@@ -10,19 +10,27 @@ module Snapshot
|
|
10
10
|
|
11
11
|
screens_path = Snapshot.config[:output_directory]
|
12
12
|
|
13
|
-
@
|
13
|
+
@data_by_language = {}
|
14
|
+
@data_by_screen = {}
|
14
15
|
|
15
16
|
Dir[File.join(screens_path, "*")].sort.each do |language_folder|
|
16
17
|
language = File.basename(language_folder)
|
17
18
|
Dir[File.join(language_folder, '*.png')].sort.each do |screenshot|
|
19
|
+
file_name = File.basename(screenshot)
|
20
|
+
screen_name = file_name[/#{Regexp.escape("-")}(.*?)#{Regexp.escape(".png")}/m, 1]
|
18
21
|
available_devices.each do |key_name, output_name|
|
19
|
-
next unless
|
22
|
+
next unless file_name.include?(key_name)
|
20
23
|
# This screenshot is from this device
|
21
|
-
@data[language] ||= {}
|
22
|
-
@data[language][output_name] ||= []
|
23
24
|
|
24
|
-
|
25
|
-
@
|
25
|
+
@data_by_language[language] ||= {}
|
26
|
+
@data_by_language[language][output_name] ||= []
|
27
|
+
|
28
|
+
@data_by_screen[screen_name] ||= {}
|
29
|
+
@data_by_screen[screen_name][output_name] ||= {}
|
30
|
+
|
31
|
+
resulting_path = File.join('.', language, file_name)
|
32
|
+
@data_by_language[language][output_name] << resulting_path
|
33
|
+
@data_by_screen[screen_name][output_name][language] = resulting_path
|
26
34
|
break # to not include iPhone 6 and 6 Plus (name is contained in the other name)
|
27
35
|
end
|
28
36
|
end
|
@@ -230,14 +230,14 @@ module Spaceship
|
|
230
230
|
#####################################################
|
231
231
|
|
232
232
|
# The logger in which all requests are logged
|
233
|
-
# /tmp/spaceship[time]_[pid].log by default
|
233
|
+
# /tmp/spaceship[time]_[pid]_["threadid"].log by default
|
234
234
|
def logger
|
235
235
|
unless @logger
|
236
236
|
if ENV["VERBOSE"]
|
237
237
|
@logger = Logger.new(STDOUT)
|
238
238
|
else
|
239
239
|
# Log to file by default
|
240
|
-
path = "/tmp/spaceship#{Time.now.to_i}_#{Process.pid}.log"
|
240
|
+
path = "/tmp/spaceship#{Time.now.to_i}_#{Process.pid}_#{Thread.current.object_id}.log"
|
241
241
|
@logger = Logger.new(path)
|
242
242
|
end
|
243
243
|
|
@@ -624,6 +624,10 @@ module Spaceship
|
|
624
624
|
client.release!(self.application.apple_id, self.version_id)
|
625
625
|
end
|
626
626
|
|
627
|
+
def release_to_all_users!
|
628
|
+
client.release_to_all_users!(self.application.apple_id, self.version_id)
|
629
|
+
end
|
630
|
+
|
627
631
|
#####################################################
|
628
632
|
# @!group Promo codes
|
629
633
|
#####################################################
|
@@ -390,6 +390,18 @@ module Spaceship
|
|
390
390
|
version.release!
|
391
391
|
end
|
392
392
|
|
393
|
+
#####################################################
|
394
|
+
# @!group release to all users
|
395
|
+
#####################################################
|
396
|
+
|
397
|
+
def release_to_all_users!
|
398
|
+
version = self.live_version
|
399
|
+
if version.nil?
|
400
|
+
raise "Could not find a valid version to release"
|
401
|
+
end
|
402
|
+
version.release_to_all_users!
|
403
|
+
end
|
404
|
+
|
393
405
|
#####################################################
|
394
406
|
# @!group General
|
395
407
|
#####################################################
|
@@ -1146,6 +1146,24 @@ module Spaceship
|
|
1146
1146
|
parse_response(r, 'data')
|
1147
1147
|
end
|
1148
1148
|
|
1149
|
+
#####################################################
|
1150
|
+
# @!group release to all users
|
1151
|
+
#####################################################
|
1152
|
+
|
1153
|
+
def release_to_all_users!(app_id, version)
|
1154
|
+
raise "app_id is required" unless app_id
|
1155
|
+
raise "version is required" unless version
|
1156
|
+
|
1157
|
+
r = request(:post) do |req|
|
1158
|
+
req.url("ra/apps/#{app_id}/versions/#{version}/phasedRelease/state/COMPLETE")
|
1159
|
+
req.headers['Content-Type'] = 'application/json'
|
1160
|
+
req.body = app_id.to_s
|
1161
|
+
end
|
1162
|
+
|
1163
|
+
handle_itc_response(r.body)
|
1164
|
+
parse_response(r, 'data')
|
1165
|
+
end
|
1166
|
+
|
1149
1167
|
#####################################################
|
1150
1168
|
# @!group in-app-purchases
|
1151
1169
|
#####################################################
|
@@ -1435,20 +1453,22 @@ module Spaceship
|
|
1435
1453
|
def with_tunes_retry(tries = 5, potential_server_error_tries = 3, &_block)
|
1436
1454
|
return yield
|
1437
1455
|
rescue Spaceship::TunesClient::ITunesConnectTemporaryError => ex
|
1456
|
+
seconds_to_sleep = 60
|
1438
1457
|
unless (tries -= 1).zero?
|
1439
|
-
msg = "App Store Connect temporary error received: '#{ex.message}'. Retrying after
|
1458
|
+
msg = "App Store Connect temporary error received: '#{ex.message}'. Retrying after #{seconds_to_sleep} seconds (remaining: #{tries})..."
|
1440
1459
|
puts(msg)
|
1441
1460
|
logger.warn(msg)
|
1442
|
-
sleep(
|
1461
|
+
sleep(seconds_to_sleep) unless Object.const_defined?("SpecHelper")
|
1443
1462
|
retry
|
1444
1463
|
end
|
1445
1464
|
raise ex # re-raise the exception
|
1446
1465
|
rescue Spaceship::TunesClient::ITunesConnectPotentialServerError => ex
|
1466
|
+
seconds_to_sleep = 10
|
1447
1467
|
unless (potential_server_error_tries -= 1).zero?
|
1448
|
-
msg = "Potential server error received: '#{ex.message}'. Retrying after 10 seconds (remaining: #{
|
1468
|
+
msg = "Potential server error received: '#{ex.message}'. Retrying after 10 seconds (remaining: #{potential_server_error_tries})..."
|
1449
1469
|
puts(msg)
|
1450
1470
|
logger.warn(msg)
|
1451
|
-
sleep(
|
1471
|
+
sleep(seconds_to_sleep) unless Object.const_defined?("SpecHelper")
|
1452
1472
|
retry
|
1453
1473
|
end
|
1454
1474
|
raise ex
|
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.113.0.beta.
|
4
|
+
version: 2.113.0.beta.20181221200014
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danielle Tomlinson
|
@@ -27,7 +27,7 @@ authors:
|
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2018-12-
|
30
|
+
date: 2018-12-21 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|
@@ -1683,23 +1683,23 @@ post_install_message:
|
|
1683
1683
|
rdoc_options: []
|
1684
1684
|
require_paths:
|
1685
1685
|
- scan/lib
|
1686
|
-
- precheck/lib
|
1687
|
-
- gym/lib
|
1688
|
-
- credentials_manager/lib
|
1689
|
-
- cert/lib
|
1690
|
-
- spaceship/lib
|
1691
|
-
- fastlane_core/lib
|
1692
|
-
- screengrab/lib
|
1693
|
-
- pem/lib
|
1694
|
-
- deliver/lib
|
1695
1686
|
- supply/lib
|
1687
|
+
- deliver/lib
|
1696
1688
|
- pilot/lib
|
1689
|
+
- credentials_manager/lib
|
1690
|
+
- gym/lib
|
1691
|
+
- screengrab/lib
|
1692
|
+
- fastlane_core/lib
|
1693
|
+
- precheck/lib
|
1697
1694
|
- match/lib
|
1695
|
+
- snapshot/lib
|
1698
1696
|
- fastlane/lib
|
1697
|
+
- cert/lib
|
1698
|
+
- spaceship/lib
|
1699
|
+
- frameit/lib
|
1699
1700
|
- produce/lib
|
1701
|
+
- pem/lib
|
1700
1702
|
- sigh/lib
|
1701
|
-
- frameit/lib
|
1702
|
-
- snapshot/lib
|
1703
1703
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1704
1704
|
requirements:
|
1705
1705
|
- - ">="
|