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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0c723ea75a6393582e28eaf48ec821c6e22649b
4
- data.tar.gz: a6cae670132cb19322b00068413ce5f5e3f687f3
3
+ metadata.gz: 66a3631181a2f1412c6c2cd8f8a5acf7225ab1cb
4
+ data.tar.gz: 91c673a83c9a5d68063e89aa124db692a98fc457
5
5
  SHA512:
6
- metadata.gz: 9d9381dc083d8c6c3aa871541f1f66fad4f457525d0aa8c089dc7fa14b38281f69278ff4fa247ae326bd0c96f6a7252ee4ace32ba93413d038dfa42b455db7c9
7
- data.tar.gz: 6ae65662a45067adba9fc11cc066e7f91621417e584c2b8a1385a0f1a1f3dd50a12bc741367c79b1ea2a3270f5196a2b91bc8fa86bed0932c53b754fda75c4a6
6
+ metadata.gz: 167231d8961df63f4cb2b2d7bdc37deb2d09eec995f14206c50b5b886b96b40d697511f16f0b53f479a1ee45c8bd18d1644243380624245a64f2c12b9b4564d7
7
+ data.tar.gz: eae79d697eeae551e2b10d709af45538e427286390e070f24f1917085cf0bcfb65bc0657d448793a8cdb4ac9ffe6abf20cda9037a741f02e58147afea2843aa3
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.113.0.beta.20181220200101'.freeze
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
- Helper.backticks(command, print: output)
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
@@ -15,15 +15,7 @@ module Match
15
15
  user ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
16
16
 
17
17
  [
18
- FastlaneCore::ConfigItem.new(key: :git_url,
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: :storage_mode,
39
- env_name: "MATCH_STORAGE_MODE",
40
- description: "Define where you want to store your certificates",
41
- is_string: true,
42
- short_option: "-q",
43
- default_value: 'git',
44
- verify_block: proc do |value|
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
- FastlaneCore::ConfigItem.new(key: :verbose,
108
- env_name: "MATCH_VERBOSE",
109
- description: "Print out extra information and all commands",
110
- is_string: false,
111
- default_value: false,
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
- FastlaneCore::Globals.verbose = true if value
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
- FastlaneCore::ConfigItem.new(key: :force,
116
- env_name: "MATCH_FORCE",
117
- description: "Renew the provisioning profiles every time you run match",
118
- is_string: false,
119
- default_value: false),
120
- FastlaneCore::ConfigItem.new(key: :skip_confirmation,
121
- env_name: "MATCH_SKIP_CONFIRMATION",
122
- description: "Disables confirmation prompts during nuke, answering them with yes",
123
- is_string: false,
124
- default_value: false),
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
- FastlaneCore::ConfigItem.new(key: :google_cloud_bucket_name,
162
- env_name: "MATCH_GOOGLE_CLOUD_BUCKET_NAME",
163
- description: "Name of the Google Cloud Storage bucket to use",
164
- optional: true),
165
- FastlaneCore::ConfigItem.new(key: :google_cloud_keys_file,
166
- env_name: "MATCH_GOOGLE_CLOUD_KEYS_FILE",
167
- description: "Path to the gc_keys.json file",
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
- UI.user_error!("Could not find keys file at path '#{File.expand_path(value)}'") unless File.exist?(value)
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
- .language {
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><% image_counter = 0 %><% @data.each do |language, content| %>
68
- <h1 id="<%= language %>" class="language"><%= language %></h1>
69
- <hr>
70
- <table><% content.each do |device_name, screens| %>
71
- <tr>
72
- <th colspan="<%= screens.count %>">
73
- <a id="<%= language %>-<%= device_name %>" class="deviceName" href="#<%= language %>-<%= device_name %>"><%= device_name %></a>
74
- </th>
75
- </tr>
76
- <tr><% screens.each do |screen_path| %><% next if screen_path.include?"_framed.png" %>
77
- <td><% image_counter += 1 %>
78
- <a href="<%= screen_path %>" target="_blank" class="screenshotLink">
79
- <img class="screenshot" src="<%= screen_path %>" style="width: 100%;" alt="<%= language %> <%= device_name %>" data-counter="<%= image_counter %>">
80
- </a>
81
- </td><% end %>
82
- </tr><% end %>
83
- </table><% end %>
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
- @data = {}
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 File.basename(screenshot).include?(key_name)
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
- resulting_path = File.join('.', language, File.basename(screenshot))
25
- @data[language][output_name] << resulting_path
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 60 seconds (remaining: #{tries})..."
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(60) unless Object.const_defined?("SpecHelper")
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: #{tries})..."
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(10) unless Object.const_defined?("SpecHelper")
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.20181220200101
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-20 00:00:00.000000000 Z
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
  - - ">="