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 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
  - - ">="