fastlane 2.113.0.beta.20181220200101 → 2.113.0.beta.20181221200014
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/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
|
- - ">="
|