fastlane 2.99.1 → 2.100.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -74
  3. data/deliver/lib/deliver/html_generator.rb +2 -1
  4. data/fastlane/lib/fastlane/actions/download_dsyms.rb +2 -2
  5. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/github_api.rb +2 -2
  7. data/fastlane/lib/fastlane/actions/jira.rb +14 -1
  8. data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +1 -0
  9. data/fastlane/lib/fastlane/actions/pod_push.rb +1 -0
  10. data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +22 -4
  11. data/fastlane/lib/fastlane/actions/run_tests.rb +5 -0
  12. data/fastlane/lib/fastlane/actions/sonar.rb +7 -1
  13. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +14 -0
  14. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +11 -3
  15. data/fastlane/lib/fastlane/helper/podspec_helper.rb +1 -1
  16. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -0
  17. data/fastlane/lib/fastlane/swift_lane_manager.rb +4 -0
  18. data/fastlane/lib/fastlane/version.rb +1 -1
  19. data/fastlane/swift/Deliverfile.swift +1 -1
  20. data/fastlane/swift/Fastlane.swift +18 -6
  21. data/fastlane/swift/Gymfile.swift +1 -1
  22. data/fastlane/swift/Matchfile.swift +1 -1
  23. data/fastlane/swift/Precheckfile.swift +1 -1
  24. data/fastlane/swift/Scanfile.swift +1 -1
  25. data/fastlane/swift/Screengrabfile.swift +1 -1
  26. data/fastlane/swift/Snapshotfile.swift +1 -1
  27. data/fastlane/swift/SnapshotfileProtocol.swift +3 -1
  28. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +23 -0
  29. data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +1 -1
  30. data/pilot/lib/pilot/options.rb +1 -1
  31. data/produce/lib/produce/developer_center.rb +2 -2
  32. data/snapshot/lib/assets/SnapshotHelper.swift +2 -2
  33. data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +11 -0
  34. data/snapshot/lib/snapshot/options.rb +7 -0
  35. data/snapshot/lib/snapshot/test_command_generator.rb +1 -1
  36. data/snapshot/lib/snapshot/test_command_generator_base.rb +18 -1
  37. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +1 -1
  38. data/spaceship/README.md +1 -1
  39. data/spaceship/lib/spaceship/portal/app_service.rb +1 -1
  40. data/spaceship/lib/spaceship/portal/portal_client.rb +0 -1
  41. data/spaceship/lib/spaceship/tunes/app_ratings.rb +1 -1
  42. data/spaceship/lib/spaceship/tunes/spaceship.rb +2 -2
  43. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
  44. data/supply/lib/supply/client.rb +10 -1
  45. data/supply/lib/supply/uploader.rb +7 -4
  46. metadata +15 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cde7fd25ec7ad1f9b2679572e27d6ec673474ebe
4
- data.tar.gz: 3671178c17764f2f9afacc484d6aeacaebcd2630
3
+ metadata.gz: 603c6c4c52a4b7e3ee28a74647967d1a164d57ec
4
+ data.tar.gz: a16ae832039304eeb3a65d8329cc5c2bfd40539f
5
5
  SHA512:
6
- metadata.gz: 6b60cd59ca4aaad546afd7fa15cf1f3ee804b04945e15e21f51b2a2f00d80395fe895301fc9f09497eeba7e742d5d1fd58088dd173ac7a24197e6a2f10599b91
7
- data.tar.gz: b1ef1b30a9aa03755a6a12dec71e27b8c803b00201b974537fcb6f155707e40f7e2e57a62edc53364c5aa05374ecc7cbc899809b3deded0a110c17d245d0202d
6
+ metadata.gz: d9a120cf0031540c113f5b796351f02988ef8868edb67c7cf1941371459ba6a8f36140293ecd4f76476856ade5a7c7287f743c63c13cfeabbd3b14ce780a73bd
7
+ data.tar.gz: 9165f7db15d367bcf5a9503a7a2d304f6c141d56873f8e7104abe5c927ad788717bac03775b84cc4a7e0506b2957d31c3cef592937addadade8ade982d419c8c
data/README.md CHANGED
@@ -32,17 +32,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
32
32
 
33
33
  <table id='team'>
34
34
  <tr>
35
+ <td id='jorge-revuelta-h'>
36
+ <a href='https://github.com/minuscorp'>
37
+ <img src='https://github.com/minuscorp.png?size=140'>
38
+ </a>
39
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
40
+ </td>
41
+ <td id='maksym-grebenets'>
42
+ <a href='https://github.com/mgrebenets'>
43
+ <img src='https://github.com/mgrebenets.png?size=140'>
44
+ </a>
45
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
46
+ </td>
35
47
  <td id='danielle-tomlinson'>
36
48
  <a href='https://github.com/DanToml'>
37
49
  <img src='https://github.com/DanToml.png?size=140'>
38
50
  </a>
39
51
  <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
40
52
  </td>
41
- <td id='jimmy-dee'>
42
- <a href='https://github.com/jdee'>
43
- <img src='https://github.com/jdee.png?size=140'>
53
+ <td id='matthew-ellis'>
54
+ <a href='https://github.com/matthewellis'>
55
+ <img src='https://github.com/matthewellis.png?size=140'>
44
56
  </a>
45
- <h4 align='center'>Jimmy Dee</h4>
57
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
58
+ </td>
59
+ <td id='helmut-januschka'>
60
+ <a href='https://github.com/hjanuschka'>
61
+ <img src='https://github.com/hjanuschka.png?size=140'>
62
+ </a>
63
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
64
+ </td>
65
+ </tr>
66
+ <tr>
67
+ <td id='luka-mirosevic'>
68
+ <a href='https://github.com/lmirosevic'>
69
+ <img src='https://github.com/lmirosevic.png?size=140'>
70
+ </a>
71
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
72
+ </td>
73
+ <td id='andrew-mcburney'>
74
+ <a href='https://github.com/AndrewMcBurney'>
75
+ <img src='https://github.com/AndrewMcBurney.png?size=140'>
76
+ </a>
77
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
46
78
  </td>
47
79
  <td id='olivier-halligon'>
48
80
  <a href='https://github.com/AliSoftware'>
@@ -50,31 +82,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
50
82
  </a>
51
83
  <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
52
84
  </td>
53
- <td id='stefan-natchev'>
54
- <a href='https://github.com/snatchev'>
55
- <img src='https://github.com/snatchev.png?size=140'>
85
+ <td id='aaron-brager'>
86
+ <a href='https://github.com/getaaron'>
87
+ <img src='https://github.com/getaaron.png?size=140'>
56
88
  </a>
57
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
89
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
58
90
  </td>
59
- <td id='iulian-onofrei'>
60
- <a href='https://github.com/revolter'>
61
- <img src='https://github.com/revolter.png?size=140'>
91
+ <td id='kohki-miki'>
92
+ <a href='https://github.com/giginet'>
93
+ <img src='https://github.com/giginet.png?size=140'>
62
94
  </a>
63
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
95
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
64
96
  </td>
65
97
  </tr>
66
98
  <tr>
67
- <td id='jorge-revuelta-h'>
68
- <a href='https://github.com/minuscorp'>
69
- <img src='https://github.com/minuscorp.png?size=140'>
99
+ <td id='jérôme-lacoste'>
100
+ <a href='https://github.com/lacostej'>
101
+ <img src='https://github.com/lacostej.png?size=140'>
70
102
  </a>
71
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
103
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
72
104
  </td>
73
- <td id='andrew-mcburney'>
74
- <a href='https://github.com/AndrewMcBurney'>
75
- <img src='https://github.com/AndrewMcBurney.png?size=140'>
105
+ <td id='iulian-onofrei'>
106
+ <a href='https://github.com/revolter'>
107
+ <img src='https://github.com/revolter.png?size=140'>
76
108
  </a>
77
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
109
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
78
110
  </td>
79
111
  <td id='joshua-liebowitz'>
80
112
  <a href='https://github.com/taquitos'>
@@ -82,37 +114,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
82
114
  </a>
83
115
  <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
84
116
  </td>
85
- <td id='fumiya-nakamura'>
86
- <a href='https://github.com/nafu'>
87
- <img src='https://github.com/nafu.png?size=140'>
117
+ <td id='stefan-natchev'>
118
+ <a href='https://github.com/snatchev'>
119
+ <img src='https://github.com/snatchev.png?size=140'>
88
120
  </a>
89
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
121
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
90
122
  </td>
91
- <td id='jan-piotrowski'>
92
- <a href='https://github.com/janpio'>
93
- <img src='https://github.com/janpio.png?size=140'>
123
+ <td id='jimmy-dee'>
124
+ <a href='https://github.com/jdee'>
125
+ <img src='https://github.com/jdee.png?size=140'>
94
126
  </a>
95
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
127
+ <h4 align='center'>Jimmy Dee</h4>
96
128
  </td>
97
129
  </tr>
98
130
  <tr>
99
- <td id='matthew-ellis'>
100
- <a href='https://github.com/matthewellis'>
101
- <img src='https://github.com/matthewellis.png?size=140'>
102
- </a>
103
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
104
- </td>
105
- <td id='aaron-brager'>
106
- <a href='https://github.com/getaaron'>
107
- <img src='https://github.com/getaaron.png?size=140'>
131
+ <td id='manu-wallner'>
132
+ <a href='https://github.com/milch'>
133
+ <img src='https://github.com/milch.png?size=140'>
108
134
  </a>
109
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
135
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
110
136
  </td>
111
- <td id='maksym-grebenets'>
112
- <a href='https://github.com/mgrebenets'>
113
- <img src='https://github.com/mgrebenets.png?size=140'>
137
+ <td id='fumiya-nakamura'>
138
+ <a href='https://github.com/nafu'>
139
+ <img src='https://github.com/nafu.png?size=140'>
114
140
  </a>
115
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
141
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
116
142
  </td>
117
143
  <td id='felix-krause'>
118
144
  <a href='https://github.com/KrauseFx'>
@@ -120,6 +146,12 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
120
146
  </a>
121
147
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
122
148
  </td>
149
+ <td id='jan-piotrowski'>
150
+ <a href='https://github.com/janpio'>
151
+ <img src='https://github.com/janpio.png?size=140'>
152
+ </a>
153
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
154
+ </td>
123
155
  <td id='josh-holtz'>
124
156
  <a href='https://github.com/joshdholtz'>
125
157
  <img src='https://github.com/joshdholtz.png?size=140'>
@@ -127,38 +159,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
127
159
  <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
128
160
  </td>
129
161
  </tr>
130
- <tr>
131
- <td id='kohki-miki'>
132
- <a href='https://github.com/giginet'>
133
- <img src='https://github.com/giginet.png?size=140'>
134
- </a>
135
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
136
- </td>
137
- <td id='helmut-januschka'>
138
- <a href='https://github.com/hjanuschka'>
139
- <img src='https://github.com/hjanuschka.png?size=140'>
140
- </a>
141
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
142
- </td>
143
- <td id='jérôme-lacoste'>
144
- <a href='https://github.com/lacostej'>
145
- <img src='https://github.com/lacostej.png?size=140'>
146
- </a>
147
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
148
- </td>
149
- <td id='manu-wallner'>
150
- <a href='https://github.com/milch'>
151
- <img src='https://github.com/milch.png?size=140'>
152
- </a>
153
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
154
- </td>
155
- <td id='luka-mirosevic'>
156
- <a href='https://github.com/lmirosevic'>
157
- <img src='https://github.com/lmirosevic.png?size=140'>
158
- </a>
159
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
160
- </td>
161
- </tr>
162
162
  </table>
163
163
 
164
164
  Special thanks to all [contributors](https://github.com/fastlane/fastlane/graphs/contributors) for extending and improving _fastlane_.
@@ -9,7 +9,8 @@ module Deliver
9
9
 
10
10
  def run(options, screenshots)
11
11
  begin
12
- html_path = self.render(options, screenshots, '.')
12
+ fastlane_path = FastlaneCore::FastlaneFolder.path
13
+ html_path = self.render(options, screenshots, fastlane_path)
13
14
  rescue => ex
14
15
  UI.error(ex.inspect)
15
16
  UI.error(ex.backtrace.join("\n"))
@@ -120,7 +120,7 @@ module Fastlane
120
120
  #####################################################
121
121
 
122
122
  def self.description
123
- "Download dSYM files from Apple App Store Connect for Bitcode apps"
123
+ "Download dSYM files from App Store Connect for Bitcode apps"
124
124
  end
125
125
 
126
126
  def self.details
@@ -135,7 +135,7 @@ module Fastlane
135
135
  SAMPLE
136
136
 
137
137
  [
138
- "This action downloads dSYM files from Apple App Store Connect after the ipa gets re-compiled by Apple. Useful if you have Bitcode enabled.".markdown_preserve_newlines,
138
+ "This action downloads dSYM files from App Store Connect after the ipa gets re-compiled by Apple. Useful if you have Bitcode enabled.".markdown_preserve_newlines,
139
139
  sample
140
140
  ].join("\n")
141
141
  end
@@ -9,7 +9,7 @@ module Fastlane
9
9
  branch = params[:branch]
10
10
  branch_expr = /#{branch}/
11
11
  if Actions.git_branch =~ branch_expr
12
- UI.success("Git branch match `#{branch}`, all good! 💪")
12
+ UI.success("Git branch matches `#{branch}`, all good! 💪")
13
13
  else
14
14
  UI.user_error!("Git is not on a branch matching `#{branch}`. Current branch is `#{Actions.git_branch}`! Please ensure the repo is checked out to the correct branch.")
15
15
  end
@@ -16,7 +16,7 @@ module Fastlane
16
16
  headers = construct_headers(params[:api_token], params[:headers])
17
17
  payload = construct_body(params[:body], params[:raw_body])
18
18
  error_handlers = params[:error_handlers] || {}
19
- secure = params[:secure] || true
19
+ secure = params[:secure]
20
20
 
21
21
  response = call_endpoint(
22
22
  url,
@@ -140,7 +140,7 @@ module Fastlane
140
140
  FastlaneCore::ConfigItem.new(key: :secure,
141
141
  env_name: "FL_GITHUB_API_SECURE",
142
142
  description: "Optionally disable secure requests (ssl_verify_peer)",
143
- is_string: false,
143
+ type: Boolean,
144
144
  default_value: true,
145
145
  optional: true)
146
146
  ]
@@ -6,8 +6,8 @@ module Fastlane
6
6
  require 'jira-ruby'
7
7
 
8
8
  site = params[:url]
9
- context_path = ""
10
9
  auth_type = :basic
10
+ context_path = params[:context_path]
11
11
  username = params[:username]
12
12
  password = params[:password]
13
13
  ticket_id = params[:ticket_id]
@@ -43,6 +43,11 @@ module Fastlane
43
43
  verify_block: proc do |value|
44
44
  UI.user_error!("No url for Jira given, pass using `url: 'url'`") if value.to_s.length == 0
45
45
  end),
46
+ FastlaneCore::ConfigItem.new(key: :context_path,
47
+ env_name: "FL_JIRA_CONTEXT_PATH",
48
+ description: "Appends to the url (ex: \"/jira\")",
49
+ optional: true,
50
+ default_value: ""),
46
51
  FastlaneCore::ConfigItem.new(key: :username,
47
52
  env_name: "FL_JIRA_USERNAME",
48
53
  description: "Username for JIRA instance",
@@ -90,6 +95,14 @@ module Fastlane
90
95
  password: "Your password",
91
96
  ticket_id: "Ticket ID, i.e. IOS-123",
92
97
  comment_text: "Text to post as a comment"
98
+ )',
99
+ 'jira(
100
+ url: "https://yourserverdomain.com",
101
+ context_path: "/jira",
102
+ username: "Your username",
103
+ password: "Your password",
104
+ ticket_id: "Ticket ID, i.e. IOS-123",
105
+ comment_text: "Text to post as a comment"
93
106
  )'
94
107
  ]
95
108
  end
@@ -61,6 +61,7 @@ module Fastlane
61
61
  description: "The sources of repos you want the pod spec to lint with, separated by commas",
62
62
  optional: true,
63
63
  is_string: false,
64
+ type: Array,
64
65
  verify_block: proc do |value|
65
66
  UI.user_error!("Sources must be an array.") unless value.kind_of?(Array)
66
67
  end),
@@ -80,6 +80,7 @@ module Fastlane
80
80
  description: "The sources of repos you want the pod spec to lint with, separated by commas",
81
81
  optional: true,
82
82
  is_string: false,
83
+ type: Array,
83
84
  verify_block: proc do |value|
84
85
  UI.user_error!("Sources must be an array.") unless value.kind_of?(Array)
85
86
  end),
@@ -2,13 +2,31 @@ module Fastlane
2
2
  module Actions
3
3
  class ResetSimulatorContentsAction < Action
4
4
  def self.run(params)
5
+ ios_versions = params[:ios]
6
+
5
7
  if Helper.xcode_at_least?("9")
6
- UI.important("Resetting simulators currently doesn't work with Xcode 9, stay tuned as we are working to add support for all new tools.")
7
- return
8
+ reset_xcode9_and_higher(ios_versions)
9
+ else
10
+ reset_up_to_xcode8(ios_versions)
11
+ end
12
+ end
13
+
14
+ def self.reset_xcode9_and_higher(ios_versions)
15
+ UI.verbose("Resetting simulator contents for Xcode 9 and later")
16
+ simulators = FastlaneCore::DeviceManager.simulators('iOS')
17
+ if ios_versions
18
+ simulators.select! { |s| ios_versions.include?(s.os_version) }
19
+ end
20
+ simulators.each do |simulator|
21
+ FastlaneCore::Simulator.reset(udid: simulator.udid)
8
22
  end
23
+ UI.success('Simulators reset')
24
+ end
9
25
 
10
- if params[:ios]
11
- params[:ios].each do |os_version|
26
+ def self.reset_up_to_xcode8(ios_versions)
27
+ UI.verbose("Resetting simulator contents for Xcode 8 and earlier")
28
+ if ios_versions
29
+ ios_versions.each do |os_version|
12
30
  FastlaneCore::Simulator.reset_all_by_version(os_version: os_version)
13
31
  end
14
32
  else
@@ -22,6 +22,11 @@ module Fastlane
22
22
  Scan::Manager.new.work(values)
23
23
 
24
24
  return true
25
+ rescue FastlaneCore::Interface::FastlaneBuildFailure => ex
26
+ # Specifically catching FastlaneBuildFailure to prevent build/compile errors from being
27
+ # silenced when :fail_build is set to false
28
+ # :fail_build should only suppress testing failures
29
+ raise ex
25
30
  rescue => ex
26
31
  if values[:fail_build]
27
32
  raise ex
@@ -19,6 +19,7 @@ module Fastlane
19
19
  sonar_scanner_args << "-Dsonar.language=\"#{params[:project_language]}\"" if params[:project_language]
20
20
  sonar_scanner_args << "-Dsonar.sourceEncoding=\"#{params[:source_encoding]}\"" if params[:source_encoding]
21
21
  sonar_scanner_args << "-Dsonar.login=\"#{params[:sonar_login]}\"" if params[:sonar_login]
22
+ sonar_scanner_args << "-Dsonar.host.url=\"#{params[:sonar_url]}\"" if params[:sonar_url]
22
23
  sonar_scanner_args << params[:sonar_runner_args] if params[:sonar_runner_args]
23
24
 
24
25
  command = [
@@ -91,7 +92,12 @@ module Fastlane
91
92
  description: "Pass the Sonar Login token (e.g: xxxxxxprivate_token_XXXXbXX7e)",
92
93
  optional: true,
93
94
  is_string: true,
94
- sensitive: true)
95
+ sensitive: true),
96
+ FastlaneCore::ConfigItem.new(key: :sonar_url,
97
+ env_name: "FL_SONAR_URL",
98
+ description: "Pass the url of the Sonar server",
99
+ optional: true,
100
+ is_string: true)
95
101
  ]
96
102
  end
97
103
 
@@ -18,6 +18,9 @@ module Fastlane
18
18
  dsym_paths << params[:dsym_path] if params[:dsym_path]
19
19
  dsym_paths += Actions.lane_context[SharedValues::DSYM_PATHS] if Actions.lane_context[SharedValues::DSYM_PATHS]
20
20
 
21
+ # Allows adding of additional multiple dsym_paths since :dsym_path can be autoset by other actions
22
+ dsym_paths += params[:dsym_paths] if params[:dsym_paths]
23
+
21
24
  if dsym_paths.count == 0
22
25
  UI.error("Couldn't find any dSYMs, please pass them using the dsym_path option")
23
26
  return nil
@@ -151,6 +154,17 @@ module Fastlane
151
154
  UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
152
155
  UI.user_error!("Symbolication file needs to be dSYM or zip") unless value.end_with?(".zip", ".dSYM")
153
156
  end),
157
+ FastlaneCore::ConfigItem.new(key: :dsym_paths,
158
+ env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_DSYM_PATHS",
159
+ description: "Paths to the DSYM files or zips to upload",
160
+ optional: true,
161
+ type: Array,
162
+ verify_block: proc do |values|
163
+ values.each do |value|
164
+ UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
165
+ UI.user_error!("Symbolication file needs to be dSYM or zip") unless value.end_with?(".zip", ".dSYM")
166
+ end
167
+ end),
154
168
  FastlaneCore::ConfigItem.new(key: :api_token,
155
169
  env_name: "CRASHLYTICS_API_TOKEN",
156
170
  sensitive: true,
@@ -8,8 +8,13 @@ module Fastlane
8
8
  path = params[:crashlytics_path]
9
9
 
10
10
  # Finding submit binary inside of given Crashlytics path (for backwards compatability)
11
- if path && File.basename(path) == "Crashlytics.framework"
12
- path = Dir[File.join(path, '**', 'submit')].last
11
+ if path
12
+ if File.basename(path) != "submit"
13
+ path = Dir[File.join(path, '**', 'submit')].last
14
+ UI.verbose(":crashlytics_path passed through parameters did not point to a submit binary. Using this submit binary on that path instead: '#{path}'")
15
+ else
16
+ UI.verbose("Using :crashlytics_path passed in through parameters: '#{path}'")
17
+ end
13
18
  end
14
19
 
15
20
  # Check for submit binary outside of Crashlytics.framework (for Crashlytics 3.4.1 and over)
@@ -20,7 +25,7 @@ module Fastlane
20
25
  path ||= Dir["./**/Crashlytics.framework/submit"].last
21
26
 
22
27
  if path && path.downcase.include?("crashlytics.framework")
23
- UI.deprecated("Crashlytics has removed support for the submit binary in Crashlytics.framework as of 3.4.1. Please change :crashlytics_path to `<PODS_ROOT>/Crashlytics/submit`")
28
+ UI.deprecated("Crashlytics has moved the submit binary outside of Crashlytics.framework directory as of 3.4.1. Please change :crashlytics_path to `<PODS_ROOT>/Crashlytics/submit`")
24
29
  end
25
30
 
26
31
  return path
@@ -31,6 +36,9 @@ module Fastlane
31
36
  unless submit_binary
32
37
  UI.user_error!("Couldn't find Crashlytics' submit binary in current directory. Make sure to add the 'Crashlytics' pod to your 'Podfile' and run `pod update`")
33
38
  end
39
+ if File.basename(submit_binary) != "submit"
40
+ UI.user_error!("Invalid crashlytics path was detected with '#{submit_binary}'. Path must point to the `submit` binary (example: './Pods/Crashlytics/submit')")
41
+ end
34
42
  submit_binary = "Crashlytics.framework/submit" if Helper.test?
35
43
 
36
44
  command = []
@@ -10,7 +10,7 @@ module Fastlane
10
10
  def initialize(path = nil, require_variable_prefix = true)
11
11
  version_var_name = 'version'
12
12
  variable_prefix = require_variable_prefix ? /\w\./ : //
13
- @version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?)(?<end>['"])/i
13
+ @version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?(-(?<prerelease>(.+)))?)(?<end>['"])/i
14
14
 
15
15
  return unless (path || '').length > 0
16
16
  UI.user_error!("Could not find podspec file at path '#{path}'") unless File.exist?(path)
@@ -158,6 +158,7 @@ Style/MethodCallWithArgsParentheses:
158
158
  IgnoredMethods:
159
159
  - require
160
160
  - require_relative
161
+ - fastlane_require
161
162
  - gem
162
163
  - program
163
164
  - command
@@ -10,6 +10,10 @@ module Fastlane
10
10
  UI.user_error!("lane must be a string") unless lane.kind_of?(String) || lane.nil?
11
11
  UI.user_error!("parameters must be a hash") unless parameters.kind_of?(Hash) || parameters.nil?
12
12
 
13
+ # Sets environment variable and lane context for lane name
14
+ ENV["FASTLANE_LANE_NAME"] = lane
15
+ Actions.lane_context[Actions::SharedValues::LANE_NAME] = lane
16
+
13
17
  # xcodeproj has a bug in certain versions that causes it to change directories
14
18
  # and not return to the original working directory
15
19
  # https://github.com/CocoaPods/Xcodeproj/issues/426
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.99.1'.freeze
2
+ VERSION = '2.100.0'.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
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -724,6 +724,7 @@ func captureIosScreenshots(workspace: String? = nil,
724
724
  numberOfRetries: Int = 1,
725
725
  stopAfterFirstError: Bool = false,
726
726
  derivedDataPath: String? = nil,
727
+ resultBundle: Bool = false,
727
728
  testTargetName: String? = nil,
728
729
  namespaceLogFiles: String? = nil,
729
730
  concurrentSimulators: Bool = true) {
@@ -756,6 +757,7 @@ func captureIosScreenshots(workspace: String? = nil,
756
757
  RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
757
758
  RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
758
759
  RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
760
+ RubyCommand.Argument(name: "result_bundle", value: resultBundle),
759
761
  RubyCommand.Argument(name: "test_target_name", value: testTargetName),
760
762
  RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
761
763
  RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
@@ -790,6 +792,7 @@ func captureScreenshots(workspace: String? = nil,
790
792
  numberOfRetries: Int = 1,
791
793
  stopAfterFirstError: Bool = false,
792
794
  derivedDataPath: String? = nil,
795
+ resultBundle: Bool = false,
793
796
  testTargetName: String? = nil,
794
797
  namespaceLogFiles: String? = nil,
795
798
  concurrentSimulators: Bool = true) {
@@ -822,6 +825,7 @@ func captureScreenshots(workspace: String? = nil,
822
825
  RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
823
826
  RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
824
827
  RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
828
+ RubyCommand.Argument(name: "result_bundle", value: resultBundle),
825
829
  RubyCommand.Argument(name: "test_target_name", value: testTargetName),
826
830
  RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
827
831
  RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
@@ -1968,11 +1972,13 @@ func jazzy(config: String? = nil) {
1968
1972
  _ = runner.executeCommand(command)
1969
1973
  }
1970
1974
  func jira(url: String,
1975
+ contextPath: String = "",
1971
1976
  username: String,
1972
1977
  password: String,
1973
1978
  ticketId: String,
1974
1979
  commentText: String) {
1975
1980
  let command = RubyCommand(commandID: "", methodName: "jira", className: nil, args: [RubyCommand.Argument(name: "url", value: url),
1981
+ RubyCommand.Argument(name: "context_path", value: contextPath),
1976
1982
  RubyCommand.Argument(name: "username", value: username),
1977
1983
  RubyCommand.Argument(name: "password", value: password),
1978
1984
  RubyCommand.Argument(name: "ticket_id", value: ticketId),
@@ -2340,7 +2346,7 @@ func pluginScores(outputPath: String,
2340
2346
  func podLibLint(useBundleExec: Bool = true,
2341
2347
  verbose: String? = nil,
2342
2348
  allowWarnings: String? = nil,
2343
- sources: String? = nil,
2349
+ sources: [String]? = nil,
2344
2350
  useLibraries: Bool = false,
2345
2351
  failFast: Bool = false,
2346
2352
  `private`: Bool = false,
@@ -2360,7 +2366,7 @@ func podPush(useBundleExec: Bool = false,
2360
2366
  repo: String? = nil,
2361
2367
  allowWarnings: String? = nil,
2362
2368
  useLibraries: String? = nil,
2363
- sources: String? = nil,
2369
+ sources: [String]? = nil,
2364
2370
  swiftVersion: String? = nil,
2365
2371
  verbose: Bool = false) {
2366
2372
  let command = RubyCommand(commandID: "", methodName: "pod_push", className: nil, args: [RubyCommand.Argument(name: "use_bundle_exec", value: useBundleExec),
@@ -3134,6 +3140,7 @@ func snapshot(workspace: String? = snapshotfile.workspace,
3134
3140
  numberOfRetries: Int = snapshotfile.numberOfRetries,
3135
3141
  stopAfterFirstError: Bool = snapshotfile.stopAfterFirstError,
3136
3142
  derivedDataPath: String? = snapshotfile.derivedDataPath,
3143
+ resultBundle: Bool = snapshotfile.resultBundle,
3137
3144
  testTargetName: String? = snapshotfile.testTargetName,
3138
3145
  namespaceLogFiles: String? = snapshotfile.namespaceLogFiles,
3139
3146
  concurrentSimulators: Bool = snapshotfile.concurrentSimulators) {
@@ -3166,6 +3173,7 @@ func snapshot(workspace: String? = snapshotfile.workspace,
3166
3173
  RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
3167
3174
  RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
3168
3175
  RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
3176
+ RubyCommand.Argument(name: "result_bundle", value: resultBundle),
3169
3177
  RubyCommand.Argument(name: "test_target_name", value: testTargetName),
3170
3178
  RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
3171
3179
  RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
@@ -3179,7 +3187,8 @@ func sonar(projectConfigurationPath: String? = nil,
3179
3187
  projectLanguage: String? = nil,
3180
3188
  sourceEncoding: String? = nil,
3181
3189
  sonarRunnerArgs: String? = nil,
3182
- sonarLogin: String? = nil) {
3190
+ sonarLogin: String? = nil,
3191
+ sonarUrl: String? = nil) {
3183
3192
  let command = RubyCommand(commandID: "", methodName: "sonar", className: nil, args: [RubyCommand.Argument(name: "project_configuration_path", value: projectConfigurationPath),
3184
3193
  RubyCommand.Argument(name: "project_key", value: projectKey),
3185
3194
  RubyCommand.Argument(name: "project_name", value: projectName),
@@ -3188,7 +3197,8 @@ func sonar(projectConfigurationPath: String? = nil,
3188
3197
  RubyCommand.Argument(name: "project_language", value: projectLanguage),
3189
3198
  RubyCommand.Argument(name: "source_encoding", value: sourceEncoding),
3190
3199
  RubyCommand.Argument(name: "sonar_runner_args", value: sonarRunnerArgs),
3191
- RubyCommand.Argument(name: "sonar_login", value: sonarLogin)])
3200
+ RubyCommand.Argument(name: "sonar_login", value: sonarLogin),
3201
+ RubyCommand.Argument(name: "sonar_url", value: sonarUrl)])
3192
3202
  _ = runner.executeCommand(command)
3193
3203
  }
3194
3204
  func splunkmint(dsym: String? = nil,
@@ -3581,13 +3591,15 @@ func updateUrlSchemes(path: String,
3581
3591
  RubyCommand.Argument(name: "update_url_schemes", value: updateUrlSchemes)])
3582
3592
  _ = runner.executeCommand(command)
3583
3593
  }
3584
- func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji.dSYM.zip",
3594
+ func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji2.dSYM",
3595
+ dsymPaths: [String]? = nil,
3585
3596
  apiToken: String? = nil,
3586
3597
  gspPath: String? = nil,
3587
3598
  binaryPath: String? = nil,
3588
3599
  platform: String = "ios",
3589
3600
  dsymWorkerThreads: Int = 1) {
3590
3601
  let command = RubyCommand(commandID: "", methodName: "upload_symbols_to_crashlytics", className: nil, args: [RubyCommand.Argument(name: "dsym_path", value: dsymPath),
3602
+ RubyCommand.Argument(name: "dsym_paths", value: dsymPaths),
3591
3603
  RubyCommand.Argument(name: "api_token", value: apiToken),
3592
3604
  RubyCommand.Argument(name: "gsp_path", value: gspPath),
3593
3605
  RubyCommand.Argument(name: "binary_path", value: binaryPath),
@@ -4051,4 +4063,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
4051
4063
  let snapshotfile: Snapshotfile = Snapshotfile()
4052
4064
  // Please don't remove the lines below
4053
4065
  // They are used to detect outdated files
4054
- // FastlaneRunnerAPIVersion [0.9.22]
4066
+ // FastlaneRunnerAPIVersion [0.9.23]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -28,6 +28,7 @@ protocol SnapshotfileProtocol: class {
28
28
  var numberOfRetries: Int { get }
29
29
  var stopAfterFirstError: Bool { get }
30
30
  var derivedDataPath: String? { get }
31
+ var resultBundle: Bool { get }
31
32
  var testTargetName: String? { get }
32
33
  var namespaceLogFiles: String? { get }
33
34
  var concurrentSimulators: Bool { get }
@@ -63,6 +64,7 @@ extension SnapshotfileProtocol {
63
64
  var numberOfRetries: Int { return 1 }
64
65
  var stopAfterFirstError: Bool { return false }
65
66
  var derivedDataPath: String? { return nil }
67
+ var resultBundle: Bool { return false }
66
68
  var testTargetName: String? { return nil }
67
69
  var namespaceLogFiles: String? { return nil }
68
70
  var concurrentSimulators: Bool { return true }
@@ -70,4 +72,4 @@ extension SnapshotfileProtocol {
70
72
 
71
73
  // Please don't remove the lines below
72
74
  // They are used to detect outdated files
73
- // FastlaneRunnerAPIVersion [0.9.3]
75
+ // FastlaneRunnerAPIVersion [0.9.4]
@@ -19,6 +19,10 @@ module FastlaneCore
19
19
  end
20
20
 
21
21
  def action_launched(launch_context: nil)
22
+ unless did_show_message?
23
+ show_message
24
+ end
25
+
22
26
  if @launch_event_sent || launch_context.p_hash.nil?
23
27
  return
24
28
  end
@@ -40,6 +44,25 @@ module FastlaneCore
40
44
  def action_completed(completion_context: nil)
41
45
  end
42
46
 
47
+ def show_message
48
+ UI.message("Sending anonymous analytics information")
49
+ UI.message("Learn more at https://docs.fastlane.tools/#metrics")
50
+ UI.message("No personal or sensitive data is sent.")
51
+ UI.message("You can disable this by adding `opt_out_usage` at the top of your Fastfile")
52
+ end
53
+
54
+ def did_show_message?
55
+ file_name = ".did_show_opt_info"
56
+
57
+ new_path = File.join(FastlaneCore.fastlane_user_dir, file_name)
58
+ did_show = File.exist?(new_path)
59
+
60
+ return did_show if did_show
61
+
62
+ File.write(new_path, '1')
63
+ false
64
+ end
65
+
43
66
  def finalize_session
44
67
  @threads.map(&:join)
45
68
  end
@@ -43,7 +43,7 @@ module FastlaneCore
43
43
 
44
44
  begin
45
45
  # rubocop:disable Security/Eval
46
- puts(eval(content)) # this is okay in this case
46
+ eval(content) # this is okay in this case
47
47
  # rubocop:enable Security/Eval
48
48
 
49
49
  print_resulting_config_values unless skip_printing_values # only on success
@@ -77,7 +77,7 @@ module Pilot
77
77
  deprecated: true,
78
78
  short_option: "-x",
79
79
  env_name: "PILOT_UPDATE_BUILD_INFO_ON_UPLOAD",
80
- description: "Update build info immediately after validation. This is deprecated and will be removed in a future release. iTunesConnect no longer supports setting build info until after build processing has completed, which is when build info is updated by default",
80
+ description: "Update build info immediately after validation. This is deprecated and will be removed in a future release. App Store Connect no longer supports setting build info until after build processing has completed, which is when build info is updated by default",
81
81
  is_string: false,
82
82
  default_value: false),
83
83
  FastlaneCore::ConfigItem.new(key: :apple_id,
@@ -81,8 +81,8 @@ module Produce
81
81
  app_service = Spaceship.app_service
82
82
  enabled_clean_options = {}
83
83
 
84
- # "enable_services" was deprecated in favor of "enable_services"
85
- config_enabled_services = Produce.config[:enable_services] || Produce.config[:enable_services]
84
+ # "enabled_features" was deprecated in favor of "enable_services"
85
+ config_enabled_services = Produce.config[:enable_services] || Produce.config[:enabled_features]
86
86
 
87
87
  config_enabled_services.each do |k, v|
88
88
  if k.to_sym == :data_protection
@@ -257,7 +257,7 @@ private extension XCUIElementQuery {
257
257
  }
258
258
 
259
259
  var deviceStatusBars: XCUIElementQuery {
260
- let deviceWidth = XCUIApplication().frame.width
260
+ let deviceWidth = XCUIApplication().windows.firstMatch.frame.width
261
261
 
262
262
  let isStatusBar = NSPredicate { (evaluatedObject, _) in
263
263
  guard let element = evaluatedObject as? XCUIElementAttributes else { return false }
@@ -277,4 +277,4 @@ private extension CGFloat {
277
277
 
278
278
  // Please don't remove the lines below
279
279
  // They are used to detect outdated configuration files
280
- // SnapshotHelperVersion [1.10]
280
+ // SnapshotHelperVersion [1.11]
@@ -10,6 +10,17 @@ module Snapshot
10
10
  UI.verbose("Patching simulator to work with secure text fields")
11
11
 
12
12
  Helper.backticks("defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0", print: FastlaneCore::Globals.verbose?)
13
+
14
+ # For > Xcode 9
15
+ # https://stackoverflow.com/questions/38010494/is-it-possible-to-toggle-software-keyboard-via-the-code-in-ui-test/47820883#47820883
16
+ Helper.backticks("/usr/libexec/PlistBuddy "\
17
+ "-c \"Print :DevicePreferences\" ~/Library/Preferences/com.apple.iphonesimulator.plist | "\
18
+ "perl -lne 'print $1 if /^ (\\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy "\
19
+ "-c \"Set :DevicePreferences:$a:ConnectHardwareKeyboard false\" "\
20
+ "~/Library/Preferences/com.apple.iphonesimulator.plist "\
21
+ "|| /usr/libexec/PlistBuddy "\
22
+ "-c \"Add :DevicePreferences:$a:ConnectHardwareKeyboard bool false\" "\
23
+ "~/Library/Preferences/com.apple.iphonesimulator.plist; done", print: FastlaneCore::Globals.verbose?)
13
24
  end
14
25
  end
15
26
  end
@@ -195,6 +195,13 @@ module Snapshot
195
195
  env_name: "SNAPSHOT_DERIVED_DATA_PATH",
196
196
  description: "The directory where build products and other derived data will go",
197
197
  optional: true),
198
+ FastlaneCore::ConfigItem.new(key: :result_bundle,
199
+ short_option: "-z",
200
+ env_name: "SNAPSHOT_RESULT_BUNDLE",
201
+ is_string: false,
202
+ description: "Should an Xcode result bundle be generated in the output directory",
203
+ default_value: false,
204
+ optional: true),
198
205
  FastlaneCore::ConfigItem.new(key: :test_target_name,
199
206
  env_name: "SNAPSHOT_TEST_TARGET_NAME",
200
207
  description: "The name of the target you want to test (if you desire to override the Target Application from Xcode)",
@@ -11,7 +11,7 @@ module Snapshot
11
11
  def generate(devices: nil, language: nil, locale: nil, log_path: nil)
12
12
  parts = prefix
13
13
  parts << "xcodebuild"
14
- parts += options
14
+ parts += options(language, locale)
15
15
  parts += destination(devices)
16
16
  parts += build_settings
17
17
  parts += actions
@@ -17,12 +17,15 @@ module Snapshot
17
17
  UI.user_error!("No project/workspace found")
18
18
  end
19
19
 
20
- def options
20
+ def options(language, locale)
21
21
  config = Snapshot.config
22
+ result_bundle_path = resolve_result_bundle_path(language, locale) if config[:result_bundle]
23
+
22
24
  options = []
23
25
  options += project_path_array
24
26
  options << "-sdk '#{config[:sdk]}'" if config[:sdk]
25
27
  options << "-derivedDataPath '#{derived_data_path}'"
28
+ options << "-resultBundlePath '#{result_bundle_path}'" if result_bundle_path
26
29
  options << config[:xcargs] if config[:xcargs]
27
30
  return options
28
31
  end
@@ -80,6 +83,20 @@ module Snapshot
80
83
  Snapshot.cache[:derived_data_path] ||= (Snapshot.config[:derived_data_path] || Dir.mktmpdir("snapshot_derived"))
81
84
  end
82
85
 
86
+ def resolve_result_bundle_path(language, locale)
87
+ Snapshot.cache[:result_bundle_path] = {}
88
+ language_key = locale || language
89
+
90
+ unless Snapshot.cache[:result_bundle_path][language_key]
91
+ path = File.join(Snapshot.config[:output_directory], "test_output", language_key, Snapshot.config[:scheme]) + ".test_result"
92
+ if File.directory?(path)
93
+ FileUtils.remove_dir(path)
94
+ end
95
+ Snapshot.cache[:result_bundle_path][language_key] = path
96
+ end
97
+ return Snapshot.cache[:result_bundle_path][language_key]
98
+ end
99
+
83
100
  def initialize
84
101
  not_implemented(__method__)
85
102
  end
@@ -12,7 +12,7 @@ module Snapshot
12
12
  def generate(device_type: nil, language: nil, locale: nil)
13
13
  parts = prefix
14
14
  parts << "xcodebuild"
15
- parts += options
15
+ parts += options(language, locale)
16
16
  parts += destination(device_type)
17
17
  parts += build_settings
18
18
  parts += actions
@@ -109,7 +109,7 @@ This requires you to install `pry` using `sudo gem install pry`. `pry` is not in
109
109
 
110
110
  ## App Store Connect API
111
111
 
112
- ##### Open [iTunesConnect.md](docs/iTunesConnect.md) for code samples
112
+ ##### Open [AppStoreConnect.md](docs/AppStoreConnect.md) for code samples
113
113
 
114
114
  ## 2 Step Verification
115
115
 
@@ -63,7 +63,7 @@ module Spaceship
63
63
  PushNotification = AppService.new_service("push")
64
64
  SiriKit = AppService.new_service("SI015DKUHP")
65
65
  VPNConfiguration = AppService.new_service("V66P55NK2I")
66
- Wallet = AppService.new_service("passbook")
66
+ Wallet = AppService.new_service("pass")
67
67
  WirelessAccessory = AppService.new_service("WC421J6T7P")
68
68
 
69
69
  constants.each do |c|
@@ -184,7 +184,6 @@ module Spaceship
184
184
  {
185
185
  type: 'explicit',
186
186
  identifier: bundle_id,
187
- push: 'on',
188
187
  inAppPurchase: 'on',
189
188
  gameCenter: 'on'
190
189
  }
@@ -2,7 +2,7 @@ require_relative 'app_review'
2
2
 
3
3
  module Spaceship
4
4
  module Tunes
5
- # Represents app ratings from iTunesConnect
5
+ # Represents app ratings from App Store Connect
6
6
  class AppRatings < TunesBase
7
7
  # @return (Spaceship::Tunes::Application) A reference to the application
8
8
  # this version is for
@@ -29,8 +29,8 @@ module Spaceship
29
29
  # If the user is in multiple teams, a team selection is shown.
30
30
  # The user can then select a team by entering the number
31
31
  #
32
- # @param team_id (String) (optional): The ID of a iTunesConnect team
33
- # @param team_name (String) (optional): The name of a iTunesConnect team
32
+ # @param team_id (String) (optional): The ID of an App Store Connect team
33
+ # @param team_name (String) (optional): The name of an App Store Connect team
34
34
  def select_team(team_id: nil, team_name: nil)
35
35
  @client.select_team(team_id: team_id, team_name: team_name)
36
36
  end
@@ -56,8 +56,8 @@ module Spaceship
56
56
  # Shows a team selection for the user in the terminal. This should not be
57
57
  # called on CI systems
58
58
  #
59
- # @param team_id (String) (optional): The ID of a iTunesConnect team
60
- # @param team_name (String) (optional): The name of a iTunesConnect team
59
+ # @param team_id (String) (optional): The ID of an App Store Connect team
60
+ # @param team_name (String) (optional): The name of an App Store Connect team
61
61
  def select_team(team_id: nil, team_name: nil)
62
62
  t_id = (team_id || ENV['FASTLANE_ITC_TEAM_ID'] || '').strip
63
63
  t_name = (team_name || ENV['FASTLANE_ITC_TEAM_NAME'] || '').strip
@@ -156,7 +156,7 @@ module Supply
156
156
  end
157
157
  end
158
158
 
159
- # Get a list of all apks verion codes - returns the list of version codes
159
+ # Get a list of all APK version codes - returns the list of version codes
160
160
  def apks_version_codes
161
161
  ensure_active_edit!
162
162
 
@@ -165,6 +165,15 @@ module Supply
165
165
  return Array(result.apks).map(&:version_code)
166
166
  end
167
167
 
168
+ # Get a list of all AAB version codes - returns the list of version codes
169
+ def aab_version_codes
170
+ ensure_active_edit!
171
+
172
+ result = call_google_api { android_publisher.list_edit_bundles(current_package_name, current_edit.id) }
173
+
174
+ return Array(result.bundles).map(&:version_code)
175
+ end
176
+
168
177
  # Get a list of all apk listings (changelogs) - returns the list
169
178
  def apk_listings(apk_version_code)
170
179
  ensure_active_edit!
@@ -66,13 +66,16 @@ module Supply
66
66
  client.apks_version_codes.each do |apk_version_code|
67
67
  upload_changelog(language, apk_version_code)
68
68
  end
69
+ client.aab_version_codes.each do |aab_version_code|
70
+ upload_changelog(language, aab_version_code)
71
+ end
69
72
  end
70
73
 
71
- def upload_changelog(language, apk_version_code)
72
- path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{apk_version_code}.txt")
74
+ def upload_changelog(language, version_code)
75
+ path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{version_code}.txt")
73
76
  if File.exist?(path)
74
- UI.message("Updating changelog for code version '#{apk_version_code}' and language '#{language}'...")
75
- apk_listing = ApkListing.new(File.read(path, encoding: 'UTF-8'), language, apk_version_code)
77
+ UI.message("Updating changelog for code version '#{version_code}' and language '#{language}'...")
78
+ apk_listing = ApkListing.new(File.read(path, encoding: 'UTF-8'), language, version_code)
76
79
  client.update_apk_listing_for_language(apk_listing)
77
80
  end
78
81
  end
metadata CHANGED
@@ -1,33 +1,33 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.99.1
4
+ version: 2.100.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Aaron Brager
8
+ - Jorge Revuelta H
9
+ - Joshua Liebowitz
10
+ - Maksym Grebenets
7
11
  - Jimmy Dee
8
- - Josh Holtz
12
+ - Helmut Januschka
13
+ - Fumiya Nakamura
9
14
  - Stefan Natchev
10
- - Felix Krause
15
+ - Andrew McBurney
16
+ - Josh Holtz
17
+ - Luka Mirosevic
11
18
  - Manu Wallner
12
- - Joshua Liebowitz
19
+ - Kohki Miki
20
+ - Olivier Halligon
13
21
  - Jan Piotrowski
14
- - Aaron Brager
15
22
  - Iulian Onofrei
16
- - Danielle Tomlinson
17
- - Fumiya Nakamura
18
- - Olivier Halligon
19
- - Helmut Januschka
20
- - Luka Mirosevic
21
- - Maksym Grebenets
22
- - Jorge Revuelta H
23
23
  - Matthew Ellis
24
+ - Danielle Tomlinson
25
+ - Felix Krause
24
26
  - Jérôme Lacoste
25
- - Andrew McBurney
26
- - Kohki Miki
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2018-07-11 00:00:00.000000000 Z
30
+ date: 2018-07-19 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier