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

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