fastlane 2.29.0.beta.20170421010107 → 2.29.0.beta.20170422010059

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: 85014dfb38ec08df2e882b67dab2873104d1f82c
4
- data.tar.gz: 64afaa9217e93f86628361b8725f164e8dffcf69
3
+ metadata.gz: f85a8ff166aada2f5880282f788d5ca55570c8e8
4
+ data.tar.gz: 77e4d79e50faa96548ad1c3d66c00254d1c3dd03
5
5
  SHA512:
6
- metadata.gz: 7d03cc1e1d52bb69d4ed64e05a28bd5917c888c419825e382e72d90df0ccb19ede70fe3e9bc43f416bdcbabe196ebfac64290a5be9c4236da0dfe8cf854868a8
7
- data.tar.gz: e625dec851c79be6c9821c4a7c799b73daf3d7cdd7f9687298ca84c31cac38d25691dc817da05cc3a1fd3f9eadc242586b761fd64a4cc24c3d7807a263798d7f
6
+ metadata.gz: d1b022a57aafbe041d6bed0e82309916051986c0884e29b56349b67244a309eb221d4e2dabe9c0589e0642827626d672d6d0ebb8145d0bddbe3c9d9bff11d5b1
7
+ data.tar.gz: cd676af5aba1efa09c616b158ae72009970d99d50fd4d2b6cedfa718f66695dd1a8d101c830c80ef3f360699e1d35c91e4bfd06f036745850ac0aead6b7e5987
@@ -107,6 +107,9 @@
107
107
  margin-left: 10px;
108
108
  margin-right: 10px;
109
109
  }
110
+ .app-icons {
111
+ overflow: hidden;
112
+ }
110
113
  .app-icons img {
111
114
  width: 150px;
112
115
  }
@@ -1,6 +1,6 @@
1
1
  Style/PercentLiteralDelimiters:
2
2
  Enabled: false
3
-
3
+
4
4
  # kind_of? is a good way to check a type
5
5
  Style/ClassCheck:
6
6
  EnforcedStyle: kind_of?
@@ -16,6 +16,12 @@ Style/SafeNavigation:
16
16
  Performance/RegexpMatch:
17
17
  Enabled: false
18
18
 
19
+ # This suggests use of `tr` instead of `gsub`. While this might be more performant,
20
+ # these methods are not at all interchangable, and behave very differently. This can
21
+ # lead to people making the substitution without considering the differences.
22
+ Performance/StringReplacement:
23
+ Enabled: false
24
+
19
25
  # .length == 0 is also good, we don't always want .zero?
20
26
  Style/NumericPredicate:
21
27
  Enabled: false
@@ -23,7 +29,7 @@ Style/NumericPredicate:
23
29
  # this would cause errors with long lanes
24
30
  Metrics/BlockLength:
25
31
  Enabled: false
26
-
32
+
27
33
  # this is a bit buggy
28
34
  Metrics/ModuleLength:
29
35
  Enabled: false
@@ -36,23 +42,23 @@ Style/VariableNumber:
36
42
  Style/MethodMissing:
37
43
  Enabled: false
38
44
 
39
- #
45
+ #
40
46
  # File.chmod(0777, f)
41
- #
47
+ #
42
48
  # is easier to read than
43
- #
49
+ #
44
50
  # File.chmod(0o777, f)
45
- #
51
+ #
46
52
  Style/NumericLiteralPrefix:
47
53
  Enabled: false
48
54
 
49
- #
55
+ #
50
56
  # command = (!clean_expired.nil? || !clean_pattern.nil?) ? CLEANUP : LIST
51
- #
57
+ #
52
58
  # is easier to read than
53
- #
59
+ #
54
60
  # command = !clean_expired.nil? || !clean_pattern.nil? ? CLEANUP : LIST
55
- #
61
+ #
56
62
  Style/TernaryParentheses:
57
63
  Enabled: false
58
64
 
@@ -1,4 +1,4 @@
1
1
  module Fastlane
2
- VERSION = '2.29.0.beta.20170421010107'.freeze
2
+ VERSION = '2.29.0.beta.20170422010059'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  end
@@ -213,6 +213,13 @@ module FastlaneCore
213
213
  keychain_path
214
214
  end
215
215
 
216
+ # @return true if XCode version is higher than 8.3
217
+ def self.xcode_at_least?(version)
218
+ FastlaneCore::UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if xcode_version.nil?
219
+ v = xcode_version
220
+ Gem::Version.new(v) >= Gem::Version.new(version)
221
+ end
222
+
216
223
  # @return the full path to the iTMSTransporter executable
217
224
  def self.itms_path
218
225
  return ENV["FASTLANE_ITUNES_TRANSPORTER_PATH"] if FastlaneCore::Env.truthy?("FASTLANE_ITUNES_TRANSPORTER_PATH")
@@ -44,7 +44,7 @@ module FastlaneCore
44
44
  value = ""
45
45
  array.each do |l|
46
46
  colored_line = l
47
- colored_line = "#{colors.first[0]}#{l}#{colors.last[0]}" if colors.length > 0
47
+ colored_line = "#{colors.first}#{l}#{colors.last}" if colors.length > 0
48
48
  value << colored_line
49
49
  value << "\n"
50
50
  end
@@ -68,15 +68,10 @@ module FastlaneCore
68
68
  return value.middle_truncate(max_value_length)
69
69
  elsif transform == :newline
70
70
  # remove all fixed newlines as it may mess up the output
71
- value.tr!("\n", " ") if value.kind_of?(String)
71
+ value.gsub!("\n", " ") if value.kind_of?(String)
72
72
  if value.length >= max_value_length
73
- colors = value.scan(/(\e\[.*?m)/)
74
- if colors && colors.length > 0
75
- colors.each do |color|
76
- value.delete!(color.first)
77
- value.delete!(color.last)
78
- end
79
- end
73
+ colors = value.scan(/\e\[.*?m/)
74
+ colors.each { |color| value.gsub!(color, '') }
80
75
  lines = value.wordwrap(max_value_length)
81
76
  return colorize_array(lines, colors)
82
77
  end
@@ -279,9 +279,14 @@ module FastlaneCore
279
279
  def build_xcodebuild_showbuildsettings_command
280
280
  # We also need to pass the workspace and scheme to this command.
281
281
  #
282
- # The 'clean' portion of this command is a workaround for an xcodebuild bug with Core Data projects.
282
+ # The 'clean' portion of this command was a workaround for an xcodebuild bug with Core Data projects.
283
+ # This xcodebuild bug is fixed in Xcode 8.3 so 'clean' it's not necessary anymore
283
284
  # See: https://github.com/fastlane/fastlane/pull/5626
284
- command = "xcodebuild clean -showBuildSettings #{xcodebuild_parameters.join(' ')}"
285
+ if FastlaneCore::Helper.xcode_at_least?('8.3')
286
+ command = "xcodebuild -showBuildSettings #{xcodebuild_parameters.join(' ')}"
287
+ else
288
+ command = "xcodebuild clean -showBuildSettings #{xcodebuild_parameters.join(' ')}"
289
+ end
285
290
  command += " 2> /dev/null" if xcodebuild_suppress_stderr
286
291
  command
287
292
  end
@@ -103,18 +103,18 @@ module Commander
103
103
  FastlaneCore::UI.important("pilot crashed")
104
104
  FastlaneCore::UI.important("-------------")
105
105
  FastlaneCore::UI.error("Unfortunately the TestFlight update from 11th April 2017 changed")
106
- FastlaneCore::UI.error("the way Testers, Groups and Builds are managed on iTunes connect.")
107
- FastlaneCore::UI.error("We're busy working on migrating _pilot_ to work with the new system")
108
- FastlaneCore::UI.error("however it requires lots of changes and refactors from our side")
109
- FastlaneCore::UI.error("to ensure that everything keeps working for you as it did before")
106
+ FastlaneCore::UI.error("the way Testers, Groups, and Builds are managed on iTunesConnect.")
107
+ FastlaneCore::UI.error("We have already fixed a number of features including submitting")
108
+ FastlaneCore::UI.error("builds for testing, adding and removing testers from groups, and")
109
+ FastlaneCore::UI.error("waiting for builds to process.")
110
110
  FastlaneCore::UI.error("")
111
- FastlaneCore::UI.error("Please follow the WIP pull request on GitHub to stay up to date: https://github.com/fastlane/fastlane/pull/8871")
111
+ FastlaneCore::UI.error("Please stay tuned for more updates from _fastlane_ as we fix more issues!")
112
112
  FastlaneCore::UI.error("")
113
- FastlaneCore::UI.error("Original error message: #{e}")
114
113
  if FastlaneCore::Globals.verbose?
115
114
  raise e # on verbose mode, we want to show the original stack trace
116
115
  else
117
- FastlaneCore::UI.user_error!("pilot doesn't work with the latest TestFlight yet, we're busy working on upgrading it!")
116
+ FastlaneCore::UI.error("Original error message:")
117
+ FastlaneCore::UI.user_error!(e.message)
118
118
  end
119
119
  end
120
120
 
@@ -100,6 +100,11 @@ module Gym
100
100
  env_name: "GYM_CODE_SIGNING_IDENTITY",
101
101
  description: "The name of the code signing identity to use. It has to match the name exactly. e.g. 'iPhone Distribution: SunApps GmbH'",
102
102
  optional: true),
103
+ FastlaneCore::ConfigItem.new(key: :skip_package_ipa,
104
+ env_name: "GYM_SKIP_PACKAGE_IPA",
105
+ description: "Should we skip packaging the ipa?",
106
+ is_string: false,
107
+ default_value: false),
103
108
  FastlaneCore::ConfigItem.new(key: :include_symbols,
104
109
  short_option: "-m",
105
110
  env_name: "GYM_INCLUDE_SYMBOLS",
@@ -16,6 +16,8 @@ module Gym
16
16
 
17
17
  if Gym.project.ios? || Gym.project.tvos?
18
18
  fix_generic_archive # See https://github.com/fastlane/fastlane/pull/4325
19
+ return BuildCommandGenerator.archive_path if Gym.config[:skip_package_ipa]
20
+
19
21
  package_app
20
22
  fix_package
21
23
  compress_and_move_dsym
data/gym/lib/gym/xcode.rb CHANGED
@@ -18,9 +18,7 @@ module Gym
18
18
  end
19
19
 
20
20
  def legacy_api_deprecated?
21
- UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if xcode_version.nil?
22
- v = xcode_version
23
- Gem::Version.new(v) >= Gem::Version.new('8.3.0')
21
+ FastlaneCore::Helper.xcode_at_least?('8.3')
24
22
  end
25
23
  end
26
24
  end
@@ -29,7 +29,8 @@ module Pilot
29
29
  begin
30
30
  mgr.public_send(action, config)
31
31
  rescue => ex
32
- message = "[#{address}]: #{ex}"
32
+ # no need to show the email address in the message if only one specified
33
+ message = (args.count > 1) ? "[#{address}]: #{ex}" : ex
33
34
  failures << message
34
35
  UI.error(message)
35
36
  end
@@ -7,40 +7,39 @@ module Pilot
7
7
  def add_tester(options)
8
8
  start(options)
9
9
 
10
- if config[:groups]
11
- UI.important("Currently pilot doesn't support groups yet, we're working on restoring that functionality")
12
- config[:groups] = nil
13
- end
14
-
15
10
  begin
16
- tester = Spaceship::Tunes::Tester::Internal.find(config[:email])
17
- tester ||= Spaceship::Tunes::Tester::External.find(config[:email])
18
-
11
+ tester = Spaceship::Tunes::Tester::External.find(config[:email])
19
12
  if tester
20
13
  UI.success("Existing tester #{tester.email}")
21
14
  else
15
+ # make sure the user isn't already an internal tester, because we don't support those
16
+ internal_tester = Spaceship::Tunes::Tester::Internal.find(config[:email])
17
+ UI.user_error!("#{internal_tester.email} is an internal tester; pilot does not support internal testers") unless internal_tester.nil?
18
+
22
19
  tester = Spaceship::Tunes::Tester::External.create!(email: config[:email],
23
20
  first_name: config[:first_name],
24
21
  last_name: config[:last_name])
25
- UI.success("Successfully invited tester: #{tester.email}")
26
- end
27
-
28
- app_filter = (config[:apple_id] || config[:app_identifier])
29
- if app_filter
30
- begin
31
- app = Spaceship::Application.find(app_filter)
32
- UI.user_error!("Couldn't find app with '#{app_filter}'") unless app
33
- app.default_external_group.add_tester!(tester)
34
- UI.success("Successfully added tester to app #{app_filter}")
35
- rescue => ex
36
- UI.error("Could not add #{tester.email} to app: #{ex}")
37
- raise ex
38
- end
22
+ UI.success("Successfully added tester: #{tester.email} to your account")
39
23
  end
40
24
  rescue => ex
41
25
  UI.error("Could not create tester #{config[:email]}")
42
26
  raise ex
43
27
  end
28
+
29
+ app_filter = (config[:apple_id] || config[:app_identifier])
30
+ if app_filter
31
+ begin
32
+ app = Spaceship::Application.find(app_filter)
33
+ UI.user_error!("Couldn't find app with '#{app_filter}'") unless app
34
+
35
+ groups = add_tester_to_groups!(tester: tester, app: app, groups: config[:groups])
36
+ group_names = groups.map(&:name).join(", ")
37
+ UI.success("Successfully added tester to app #{app_filter} in group(s) #{group_names}")
38
+ rescue => ex
39
+ UI.error("Could not add #{tester.email} to app: #{app.name}")
40
+ raise ex
41
+ end
42
+ end
44
43
  end
45
44
 
46
45
  def find_tester(options)
@@ -59,7 +58,6 @@ module Pilot
59
58
  start(options)
60
59
 
61
60
  tester = Spaceship::Tunes::Tester::External.find(config[:email])
62
- tester ||= Spaceship::Tunes::Tester::Internal.find(config[:email])
63
61
 
64
62
  if tester
65
63
  app_filter = (config[:apple_id] || config[:app_identifier])
@@ -67,8 +65,9 @@ module Pilot
67
65
  begin
68
66
  app = Spaceship::Application.find(app_filter)
69
67
  UI.user_error!("Couldn't find app with '#{app_filter}'") unless app
70
- app.default_external_group.remove_tester!(tester)
71
- UI.success("Successfully removed tester #{tester.email} from app #{app_filter}")
68
+ groups = remove_tester_from_groups!(tester: tester, app: app, groups: config[:groups])
69
+ group_names = groups.map(&:name).join(", ")
70
+ UI.success("Successfully removed tester #{tester.email} from app #{app_filter} in group(s) #{group_names}")
72
71
  rescue => ex
73
72
  UI.error("Could not remove #{tester.email} from app: #{ex}")
74
73
  raise ex
@@ -78,7 +77,10 @@ module Pilot
78
77
  UI.success("Successfully removed tester #{tester.email}")
79
78
  end
80
79
  else
81
- UI.error("Tester not found: #{config[:email]}")
80
+ internal_tester = Spaceship::Tunes::Tester::Internal.find(config[:email])
81
+ UI.user_error!("#{internal_tester.email} is an internal tester; pilot does not support internal testers") unless internal_tester.nil?
82
+
83
+ UI.user_error!("Tester not found: #{config[:email]}")
82
84
  end
83
85
  end
84
86
 
@@ -93,7 +95,33 @@ module Pilot
93
95
  end
94
96
  end
95
97
 
96
- # private
98
+ private
99
+
100
+ def perform_for_groups_in_app(app: nil, groups: nil, &block)
101
+ if groups.nil?
102
+ default_external_group = app.default_external_group
103
+ if default_external_group.nil?
104
+ UI.user_error!("The app #{app.name} does not have a default external group. Please make sure to pass group names to the `:groups` option.")
105
+ end
106
+ test_flight_groups = [default_external_group]
107
+ else
108
+ test_flight_groups = Spaceship::TestFlight::Group.filter_groups(app_id: app.apple_id) do |group|
109
+ groups.include?(group.name)
110
+ end
111
+
112
+ UI.user_error!("There are no groups available matching the names passed to the `:groups` option.") if test_flight_groups.empty?
113
+ end
114
+
115
+ test_flight_groups.each(&block)
116
+ end
117
+
118
+ def add_tester_to_groups!(tester: nil, app: nil, groups: nil)
119
+ perform_for_groups_in_app(app: app, groups: groups) { |group| group.add_tester!(tester) }
120
+ end
121
+
122
+ def remove_tester_from_groups!(tester: nil, app: nil, groups: nil)
123
+ perform_for_groups_in_app(app: app, groups: groups) { |group| group.remove_tester!(tester) }
124
+ end
97
125
 
98
126
  def list_testers_by_app(app_filter)
99
127
  app = Spaceship::Application.find(app_filter)
@@ -27,8 +27,8 @@ module Spaceship::TestFlight
27
27
  req.url url
28
28
  req.body = {
29
29
  "email" => tester.email,
30
- "firstName" => tester.last_name,
31
- "lastName" => tester.first_name
30
+ "firstName" => tester.first_name,
31
+ "lastName" => tester.last_name
32
32
  }.to_json
33
33
  req.headers['Content-Type'] = 'application/json'
34
34
  end
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.29.0.beta.20170421010107
4
+ version: 2.29.0.beta.20170422010059
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
@@ -15,7 +15,7 @@ authors:
15
15
  autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
- date: 2017-04-21 00:00:00.000000000 Z
18
+ date: 2017-04-22 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: slack-notifier
@@ -1341,23 +1341,23 @@ metadata:
1341
1341
  post_install_message:
1342
1342
  rdoc_options: []
1343
1343
  require_paths:
1344
- - frameit/lib
1345
- - deliver/lib
1346
- - supply/lib
1344
+ - pem/lib
1345
+ - produce/lib
1346
+ - gym/lib
1347
+ - sigh/lib
1347
1348
  - cert/lib
1348
1349
  - screengrab/lib
1349
- - fastlane_core/lib
1350
1350
  - match/lib
1351
- - snapshot/lib
1352
- - gym/lib
1353
- - credentials_manager/lib
1354
- - scan/lib
1355
- - produce/lib
1356
- - sigh/lib
1357
- - fastlane/lib
1358
1351
  - spaceship/lib
1359
- - pem/lib
1352
+ - scan/lib
1360
1353
  - pilot/lib
1354
+ - fastlane_core/lib
1355
+ - snapshot/lib
1356
+ - fastlane/lib
1357
+ - deliver/lib
1358
+ - frameit/lib
1359
+ - supply/lib
1360
+ - credentials_manager/lib
1361
1361
  required_ruby_version: !ruby/object:Gem::Requirement
1362
1362
  requirements:
1363
1363
  - - ">="