fastlane 2.28.2 → 2.28.3

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: 8bc110a25ada7ed90b962155121451a2dada56cc
4
- data.tar.gz: 1bba629e783315e0a35241346f52f99befa2cf0c
3
+ metadata.gz: 132c1e0c8db40d3853f4576395288e72daa87566
4
+ data.tar.gz: 7ee3eda821ffa5c322b26e71353ddc85f88762db
5
5
  SHA512:
6
- metadata.gz: d4d17ea68a83a530910d5eb2f08cec09fe1f76858790f9be0f31694482380ecc332aa68ee76a5a82feaf284c0ee99e1b3672aca1152215460ca4251e3669aabc
7
- data.tar.gz: a6308319bbf37809c7f33f292587a6ca0ca88cb38f1bb97126d62d6815db9cf8e12d2a27f5aebd3dce8cfa7fb7aaac027cb2ee18f4a97339b627b30eec3443d2
6
+ metadata.gz: c6c0218b29725f2712368bb9509dbfaac34ec395f97025cf9d8d61b22d310449b77496e17d17ccd03524b55aab62c96cc0c3ca29e958bdeaf06bd03c675f9141
7
+ data.tar.gz: 3ac754b83ddcea678f21538cc171c05072668cb8ceed8c315f56452d2dcfe2f65d9a364847a67aff55ab0135de5a1004819eb5953543b0aca52dd100043ce4c9
@@ -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.28.2'.freeze
2
+ VERSION = '2.28.3'.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
@@ -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.28.2
4
+ version: 2.28.3
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-20 00:00:00.000000000 Z
18
+ date: 2017-04-21 00:00:00.000000000 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: slack-notifier