fastlane 2.192.0 → 2.195.0

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +86 -86
  3. data/cert/lib/cert/options.rb +1 -1
  4. data/deliver/lib/deliver/options.rb +1 -1
  5. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +1 -1
  7. data/fastlane/lib/fastlane/actions/gradle.rb +16 -3
  8. data/fastlane/lib/fastlane/actions/last_git_commit.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  10. data/fastlane/lib/fastlane/actions/notarize.rb +27 -18
  11. data/fastlane/lib/fastlane/actions/prompt.rb +1 -1
  12. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  14. data/fastlane/lib/fastlane/actions/set_changelog.rb +1 -1
  15. data/fastlane/lib/fastlane/actions/slather.rb +6 -0
  16. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +3 -1
  18. data/fastlane/lib/fastlane/actions/zip.rb +2 -2
  19. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +11 -5
  20. data/fastlane/lib/fastlane/version.rb +1 -1
  21. data/fastlane/swift/Deliverfile.swift +1 -1
  22. data/fastlane/swift/DeliverfileProtocol.swift +2 -2
  23. data/fastlane/swift/Fastlane.swift +89 -98
  24. data/fastlane/swift/Gymfile.swift +1 -1
  25. data/fastlane/swift/GymfileProtocol.swift +1 -1
  26. data/fastlane/swift/Matchfile.swift +1 -1
  27. data/fastlane/swift/MatchfileProtocol.swift +11 -3
  28. data/fastlane/swift/Precheckfile.swift +1 -1
  29. data/fastlane/swift/PrecheckfileProtocol.swift +2 -2
  30. data/fastlane/swift/Scanfile.swift +1 -1
  31. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  32. data/fastlane/swift/Screengrabfile.swift +1 -1
  33. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  34. data/fastlane/swift/Snapshotfile.swift +1 -1
  35. data/fastlane/swift/SnapshotfileProtocol.swift +2 -2
  36. data/fastlane/swift/formatting/Brewfile.lock.json +5 -5
  37. data/fastlane_core/lib/fastlane_core/build_watcher.rb +25 -6
  38. data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +5 -0
  39. data/match/lib/match/generator.rb +2 -1
  40. data/match/lib/match/options.rb +12 -2
  41. data/match/lib/match/runner.rb +100 -15
  42. data/pilot/lib/pilot/build_manager.rb +14 -3
  43. data/pilot/lib/pilot/manager.rb +3 -1
  44. data/pilot/lib/pilot/options.rb +21 -2
  45. data/precheck/lib/precheck/options.rb +1 -1
  46. data/sigh/lib/assets/resign.sh +1 -1
  47. data/sigh/lib/sigh/options.rb +6 -1
  48. data/sigh/lib/sigh/runner.rb +2 -2
  49. data/snapshot/lib/snapshot/options.rb +1 -1
  50. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +9 -1
  51. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +1 -1
  52. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -0
  53. data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +4 -0
  54. data/supply/lib/supply/uploader.rb +9 -6
  55. metadata +22 -25
  56. data/fastlane/lib/fastlane/actions/crashlytics.rb +0 -207
  57. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +0 -157
  58. data/spaceship/lib/spaceship/connect_api/testflight/.testflight.rb.swp +0 -0
@@ -112,7 +112,7 @@ module Spaceship
112
112
 
113
113
  # @deprecated
114
114
  def fetch_age_rating_declaration(client: nil)
115
- raise 'AppStoreVersion no longer as AgeRatingDelcaration as of App Store Connect API 1.3 - Use AppInfo instead'
115
+ raise 'AppStoreVersion no longer as AgeRatingDeclaration as of App Store Connect API 1.3 - Use AppInfo instead'
116
116
  end
117
117
 
118
118
  #
@@ -86,6 +86,10 @@ module Spaceship
86
86
  return build_beta_detail.nil? == false && build_beta_detail.ready_for_internal_testing?
87
87
  end
88
88
 
89
+ def ready_for_external_testing?
90
+ return build_beta_detail.nil? == false && build_beta_detail.ready_for_external_testing?
91
+ end
92
+
89
93
  def ready_for_beta_submission?
90
94
  raise "No build_beta_detail included" unless build_beta_detail
91
95
  return build_beta_detail.ready_for_beta_submission?
@@ -53,6 +53,10 @@ module Spaceship
53
53
  return internal_build_state == InternalState::READY_FOR_BETA_TESTING
54
54
  end
55
55
 
56
+ def processed?
57
+ return internal_build_state != InternalState::PROCESSING && external_build_state != ExternalState::PROCESSING
58
+ end
59
+
56
60
  def ready_for_beta_submission?
57
61
  return external_build_state == ExternalState::READY_FOR_BETA_SUBMISSION
58
62
  end
@@ -13,6 +13,8 @@ module Supply
13
13
  apk_version_codes.concat(upload_bundles) unless Supply.config[:skip_upload_aab]
14
14
  upload_mapping(apk_version_codes)
15
15
 
16
+ track_to_update = Supply.config[:track]
17
+
16
18
  apk_version_codes.concat(Supply.config[:version_codes_to_retain]) if Supply.config[:version_codes_to_retain]
17
19
 
18
20
  if !apk_version_codes.empty?
@@ -23,13 +25,14 @@ module Supply
23
25
  else
24
26
  # Only promote or rollout if we don't have version codes
25
27
  if Supply.config[:track_promote_to]
28
+ track_to_update = Supply.config[:track_promote_to]
26
29
  promote_track
27
30
  elsif !Supply.config[:rollout].nil? && Supply.config[:track].to_s != ""
28
31
  update_rollout
29
32
  end
30
33
  end
31
34
 
32
- perform_upload_meta(apk_version_codes)
35
+ perform_upload_meta(apk_version_codes, track_to_update)
33
36
 
34
37
  if Supply.config[:validate_only]
35
38
  UI.message("Validating all changes with Google Play...")
@@ -70,7 +73,7 @@ module Supply
70
73
  end
71
74
  end
72
75
 
73
- def perform_upload_meta(version_codes)
76
+ def perform_upload_meta(version_codes, track_name)
74
77
  if (!Supply.config[:skip_upload_metadata] || !Supply.config[:skip_upload_images] || !Supply.config[:skip_upload_changelogs] || !Supply.config[:skip_upload_screenshots]) && metadata_path
75
78
  # Use version code from config if version codes is empty and no nil or empty string
76
79
  version_codes = [Supply.config[:version_code]] if version_codes.empty?
@@ -81,7 +84,7 @@ module Supply
81
84
  version_codes.each do |version_code|
82
85
  UI.user_error!("Could not find folder #{metadata_path}") unless File.directory?(metadata_path)
83
86
 
84
- track, release = fetch_track_and_release!(Supply.config[:track], version_code)
87
+ track, release = fetch_track_and_release!(track_name, version_code)
85
88
  UI.user_error!("Unable to find the requested track - '#{Supply.config[:track]}'") unless track
86
89
  UI.user_error!("Could not find release for version code '#{version_code}' to update changelog") unless release
87
90
 
@@ -98,7 +101,7 @@ module Supply
98
101
  release_notes << upload_changelog(language, version_code) unless Supply.config[:skip_upload_changelogs]
99
102
  end
100
103
 
101
- upload_changelogs(release_notes, release, track) unless release_notes.empty?
104
+ upload_changelogs(release_notes, release, track, track_name) unless release_notes.empty?
102
105
  end
103
106
  end
104
107
  end
@@ -239,9 +242,9 @@ module Supply
239
242
  )
240
243
  end
241
244
 
242
- def upload_changelogs(release_notes, release, track)
245
+ def upload_changelogs(release_notes, release, track, track_name)
243
246
  release.release_notes = release_notes
244
- client.upload_changelogs(track, Supply.config[:track])
247
+ client.upload_changelogs(track, track_name)
245
248
  end
246
249
 
247
250
  def upload_metadata(language, listing)
metadata CHANGED
@@ -1,38 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.192.0
4
+ version: 2.195.0
5
5
  platform: ruby
6
6
  authors:
7
- - Jan Piotrowski
8
- - Manu Wallner
9
- - Jérôme Lacoste
10
- - Helmut Januschka
11
- - Daniel Jankowski
12
- - Satoshi Namai
13
- - Joshua Liebowitz
14
- - Roger Oba
15
- - Josh Holtz
16
- - Matthew Ellis
17
- - Andrew McBurney
18
- - Aaron Brager
19
7
  - Stefan Natchev
20
- - Manish Rathi
21
- - Felix Krause
8
+ - Roger Oba
9
+ - Fumiya Nakamura
10
+ - Jérôme Lacoste
11
+ - Iulian Onofrei
22
12
  - Jorge Revuelta H
23
13
  - Max Ott
24
- - Maksym Grebenets
25
- - Iulian Onofrei
14
+ - Daniel Jankowski
26
15
  - Olivier Halligon
27
- - Jimmy Dee
16
+ - Helmut Januschka
17
+ - Manish Rathi
18
+ - Jan Piotrowski
28
19
  - Danielle Tomlinson
29
- - Kohki Miki
30
- - Fumiya Nakamura
31
20
  - Luka Mirosevic
21
+ - Jimmy Dee
22
+ - Andrew McBurney
23
+ - Joshua Liebowitz
24
+ - Satoshi Namai
25
+ - Felix Krause
26
+ - Kohki Miki
27
+ - Aaron Brager
28
+ - Matthew Ellis
29
+ - Josh Holtz
30
+ - Maksym Grebenets
31
+ - Manu Wallner
32
32
  autorequire:
33
33
  bindir: bin
34
34
  cert_chain: []
35
- date: 2021-08-24 00:00:00.000000000 Z
35
+ date: 2021-09-25 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: xcodeproj
@@ -1056,7 +1056,6 @@ files:
1056
1056
  - fastlane/lib/fastlane/actions/commit_github_file.rb
1057
1057
  - fastlane/lib/fastlane/actions/commit_version_bump.rb
1058
1058
  - fastlane/lib/fastlane/actions/copy_artifacts.rb
1059
- - fastlane/lib/fastlane/actions/crashlytics.rb
1060
1059
  - fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb
1061
1060
  - fastlane/lib/fastlane/actions/create_app_online.rb
1062
1061
  - fastlane/lib/fastlane/actions/create_keychain.rb
@@ -1278,7 +1277,6 @@ files:
1278
1277
  - fastlane/lib/fastlane/features.rb
1279
1278
  - fastlane/lib/fastlane/helper/README.md
1280
1279
  - fastlane/lib/fastlane/helper/adb_helper.rb
1281
- - fastlane/lib/fastlane/helper/crashlytics_helper.rb
1282
1280
  - fastlane/lib/fastlane/helper/dotenv_helper.rb
1283
1281
  - fastlane/lib/fastlane/helper/gem_helper.rb
1284
1282
  - fastlane/lib/fastlane/helper/git_helper.rb
@@ -1713,7 +1711,6 @@ files:
1713
1711
  - spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb
1714
1712
  - spaceship/lib/spaceship/connect_api/response.rb
1715
1713
  - spaceship/lib/spaceship/connect_api/spaceship.rb
1716
- - spaceship/lib/spaceship/connect_api/testflight/.testflight.rb.swp
1717
1714
  - spaceship/lib/spaceship/connect_api/testflight/client.rb
1718
1715
  - spaceship/lib/spaceship/connect_api/testflight/testflight.rb
1719
1716
  - spaceship/lib/spaceship/connect_api/token.rb
@@ -1874,7 +1871,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1874
1871
  - !ruby/object:Gem::Version
1875
1872
  version: '0'
1876
1873
  requirements: []
1877
- rubygems_version: 3.1.4
1874
+ rubygems_version: 3.1.6
1878
1875
  signing_key:
1879
1876
  specification_version: 4
1880
1877
  summary: The easiest way to automate beta deployments and releases for your iOS and
@@ -1,207 +0,0 @@
1
- module Fastlane
2
- module Actions
3
- class CrashlyticsAction < Action
4
- def self.run(params)
5
- params.values # to validate all inputs before looking for the ipa/apk
6
- tempfiles = []
7
-
8
- # We need to store notes in a file, because the crashlytics CLI (iOS) says so
9
- if params[:notes]
10
- UI.error("Overwriting :notes_path, because you specified :notes") if params[:notes_path]
11
-
12
- changelog = Helper::CrashlyticsHelper.write_to_tempfile(params[:notes], 'changelog')
13
- tempfiles << changelog
14
- params[:notes_path] = changelog.path
15
- elsif Actions.lane_context[SharedValues::FL_CHANGELOG] && !params[:notes_path]
16
- UI.message("Sending FL_CHANGELOG as release notes to Beta by Crashlytics")
17
-
18
- changelog = Helper::CrashlyticsHelper.write_to_tempfile(
19
- Actions.lane_context[SharedValues::FL_CHANGELOG], 'changelog'
20
- )
21
- tempfiles << changelog
22
- params[:notes_path] = changelog.path
23
- end
24
-
25
- if params[:ipa_path]
26
- command = Helper::CrashlyticsHelper.generate_ios_command(params)
27
- elsif params[:apk_path]
28
- android_manifest = Helper::CrashlyticsHelper.generate_android_manifest_tempfile
29
- tempfiles << android_manifest
30
- command = Helper::CrashlyticsHelper.generate_android_command(params, android_manifest.path)
31
- else
32
- UI.user_error!("You have to either pass an ipa or an apk file to the Crashlytics action")
33
- end
34
-
35
- UI.success('Uploading the build to Crashlytics Beta. Time for some ☕️.')
36
-
37
- sanitizer = proc do |message|
38
- message.gsub(params[:api_token], '[[API_TOKEN]]')
39
- .gsub(params[:build_secret], '[[BUILD_SECRET]]')
40
- end
41
-
42
- UI.verbose(sanitizer.call(command.join(' '))) if FastlaneCore::Globals.verbose?
43
-
44
- error_callback = proc do |error|
45
- clean_error = sanitizer.call(error)
46
- UI.user_error!(clean_error)
47
- end
48
-
49
- result = Actions.sh_control_output(
50
- command.join(" "),
51
- print_command: false,
52
- print_command_output: false,
53
- error_callback: error_callback
54
- )
55
-
56
- tempfiles.each(&:unlink)
57
- return command if Helper.test?
58
-
59
- UI.verbose(sanitizer.call(result)) if FastlaneCore::Globals.verbose?
60
-
61
- UI.success('Build successfully uploaded to Crashlytics Beta 🌷')
62
- UI.success('Visit https://fabric.io/_/beta to add release notes and notify testers.')
63
- end
64
-
65
- def self.description
66
- "Refer to [Firebase App Distribution](https://appdistro.page.link/fastlane-repo)"
67
- end
68
-
69
- def self.available_options
70
- platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]
71
-
72
- if platform == :ios || platform.nil?
73
- ipa_path_default = Dir["*.ipa"].sort_by { |x| File.mtime(x) }.last
74
- end
75
-
76
- if platform == :android
77
- apk_path_default = Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "app-release.apk")].last
78
- end
79
-
80
- [
81
- # iOS Specific
82
- FastlaneCore::ConfigItem.new(key: :ipa_path,
83
- env_name: "CRASHLYTICS_IPA_PATH",
84
- description: "Path to your IPA file. Optional if you use the _gym_ or _xcodebuild_ action",
85
- default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || ipa_path_default,
86
- default_value_dynamic: true,
87
- optional: true,
88
- verify_block: proc do |value|
89
- UI.user_error!("Couldn't find ipa file at path '#{value}'") unless File.exist?(value)
90
- end),
91
- # Android Specific
92
- FastlaneCore::ConfigItem.new(key: :apk_path,
93
- env_name: "CRASHLYTICS_APK_PATH",
94
- description: "Path to your APK file",
95
- default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] || apk_path_default,
96
- default_value_dynamic: true,
97
- optional: true,
98
- verify_block: proc do |value|
99
- UI.user_error!("Couldn't find apk file at path '#{value}'") unless File.exist?(value)
100
- end),
101
- # General
102
- FastlaneCore::ConfigItem.new(key: :crashlytics_path,
103
- env_name: "CRASHLYTICS_FRAMEWORK_PATH",
104
- description: "Path to the submit binary in the Crashlytics bundle (iOS) or `crashlytics-devtools.jar` file (Android)",
105
- optional: true,
106
- verify_block: proc do |value|
107
- UI.user_error!("Couldn't find crashlytics at path '#{File.expand_path(value)}'`") unless File.exist?(File.expand_path(value))
108
- end),
109
- FastlaneCore::ConfigItem.new(key: :api_token,
110
- env_name: "CRASHLYTICS_API_TOKEN",
111
- description: "Crashlytics API Key",
112
- sensitive: true,
113
- verify_block: proc do |value|
114
- UI.user_error!("No API token for Crashlytics given, pass using `api_token: 'token'`") unless value && !value.empty?
115
- end),
116
- FastlaneCore::ConfigItem.new(key: :build_secret,
117
- env_name: "CRASHLYTICS_BUILD_SECRET",
118
- description: "Crashlytics Build Secret",
119
- sensitive: true,
120
- verify_block: proc do |value|
121
- UI.user_error!("No build secret for Crashlytics given, pass using `build_secret: 'secret'`") unless value && !value.empty?
122
- end),
123
- FastlaneCore::ConfigItem.new(key: :notes_path,
124
- env_name: "CRASHLYTICS_NOTES_PATH",
125
- description: "Path to the release notes",
126
- optional: true,
127
- verify_block: proc do |value|
128
- UI.user_error!("Path '#{value}' not found") unless File.exist?(value)
129
- end),
130
- FastlaneCore::ConfigItem.new(key: :notes,
131
- env_name: "CRASHLYTICS_NOTES",
132
- description: "The release notes as string - uses :notes_path under the hood",
133
- optional: true),
134
- FastlaneCore::ConfigItem.new(key: :groups,
135
- env_name: "CRASHLYTICS_GROUPS",
136
- description: "The groups used for distribution, separated by commas",
137
- type: Array,
138
- optional: true),
139
- FastlaneCore::ConfigItem.new(key: :emails,
140
- env_name: "CRASHLYTICS_EMAILS",
141
- description: "Pass email addresses of testers, separated by commas",
142
- type: Array,
143
- optional: true),
144
- FastlaneCore::ConfigItem.new(key: :notifications,
145
- env_name: "CRASHLYTICS_NOTIFICATIONS",
146
- description: "Crashlytics notification option (true/false)",
147
- default_value: true,
148
- type: Boolean),
149
- FastlaneCore::ConfigItem.new(key: :debug,
150
- env_name: "CRASHLYTICS_DEBUG",
151
- description: "Crashlytics debug option (true/false)",
152
- default_value: false,
153
- type: Boolean)
154
-
155
- ]
156
- end
157
-
158
- def self.is_supported?(platform)
159
- [:ios, :mac, :android].include?(platform)
160
- end
161
-
162
- def self.author
163
- ["KrauseFx", "pedrogimenez"]
164
- end
165
-
166
- def self.details
167
- [
168
- "Additionally, you can specify `notes`, `emails`, `groups` and `notifications`.",
169
- "Distributing to Groups: When using the `groups` parameter, it's important to use the group **alias** names for each group you'd like to distribute to. A group's alias can be found in the web UI. If you're viewing the Beta page, you can open the groups dialog by clicking the 'Manage Groups' button.",
170
- "This action uses the `submit` binary provided by the Crashlytics framework. If the binary is not found in its usual path, you'll need to specify the path manually by using the `crashlytics_path` option."
171
- ].join("\n")
172
- end
173
-
174
- def self.example_code
175
- [
176
- 'crashlytics',
177
- '# If you installed Crashlytics via CocoaPods
178
- crashlytics(
179
- crashlytics_path: "./Pods/Crashlytics/submit", # path to your Crashlytics submit binary.
180
- api_token: "...",
181
- build_secret: "...",
182
- ipa_path: "./app.ipa"
183
- )',
184
- '# If you installed Crashlytics via Carthage for iOS platform
185
- crashlytics(
186
- crashlytics_path: "./Carthage/Build/iOS/Crashlytics.framework/submit", # path to your Crashlytics submit binary.
187
- api_token: "...",
188
- build_secret: "...",
189
- ipa_path: "./app.ipa"
190
- )'
191
- ]
192
- end
193
-
194
- def self.category
195
- :deprecated
196
- end
197
-
198
- def self.deprecated_notes
199
- [
200
- "Crashlytics Beta has been deprecated and replaced with Firebase App Distribution.",
201
- "Beta will continue working until May 4, 2020.",
202
- "Check out the [Firebase App Distribution docs](https://github.com/fastlane/fastlane-plugin-firebase_app_distribution) to get started."
203
- ].join("\n")
204
- end
205
- end
206
- end
207
- end
@@ -1,157 +0,0 @@
1
- require 'shellwords'
2
-
3
- module Fastlane
4
- module Helper
5
- class CrashlyticsHelper
6
- class << self
7
- def discover_crashlytics_path(params)
8
- path = params[:crashlytics_path]
9
-
10
- # Finding submit binary inside of given Crashlytics path (for backwards compatibility)
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
18
- end
19
-
20
- # Check for submit binary outside of Crashlytics.framework (for Crashlytics 3.4.1 and over)
21
- path ||= Dir["./Pods/Crashlytics/submit"].first
22
-
23
- # Check for submit binary in Crashlytics.framework (for Crashlytics 3.4.1 and under)
24
- path ||= Dir["./Pods/iOS/Crashlytics/Crashlytics.framework/submit"].last
25
- path ||= Dir["./**/Crashlytics.framework/submit"].last
26
-
27
- downcase_path = path ? path.downcase : nil
28
- if downcase_path && downcase_path.include?("pods") && downcase_path.include?("crashlytics.framework")
29
- 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`")
30
- end
31
-
32
- return path
33
- end
34
-
35
- def generate_ios_command(params)
36
- submit_binary = discover_crashlytics_path(params)
37
- unless submit_binary
38
- 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`")
39
- end
40
- if File.basename(submit_binary) != "submit"
41
- UI.user_error!("Invalid crashlytics path was detected with '#{submit_binary}'. Path must point to the `submit` binary (example: './Pods/Crashlytics/submit')")
42
- end
43
- submit_binary = "Crashlytics.framework/submit" if Helper.test?
44
-
45
- command = []
46
- command << submit_binary.shellescape
47
- command << params[:api_token]
48
- command << params[:build_secret]
49
- command << "-ipaPath '#{params[:ipa_path]}'"
50
- command << "-emails '#{params[:emails].join(',')}'" if params[:emails]
51
- command << "-notesPath '#{params[:notes_path]}'" if params[:notes_path]
52
- command << "-groupAliases '#{params[:groups].join(',')}'" if params[:groups]
53
- command << "-notifications #{(params[:notifications] ? 'YES' : 'NO')}"
54
- command << "-debug #{(params[:debug] ? 'YES' : 'NO')}"
55
-
56
- return command
57
- end
58
-
59
- def generate_android_command(params, android_manifest_path)
60
- params[:crashlytics_path] = download_android_tools unless params[:crashlytics_path]
61
-
62
- UI.user_error!("The `crashlytics_path` must be a jar file for Android") unless params[:crashlytics_path].end_with?(".jar") || Helper.test?
63
-
64
- if ENV['JAVA_HOME'].nil?
65
- command = ["java"]
66
- else
67
- command = [File.join(ENV['JAVA_HOME'], "/bin/java").shellescape]
68
- end
69
- command << "-jar #{File.expand_path(params[:crashlytics_path])}"
70
- command << "-androidRes ."
71
- command << "-apiKey #{params[:api_token]}"
72
- command << "-apiSecret #{params[:build_secret]}"
73
- command << "-uploadDist #{File.expand_path(params[:apk_path]).shellescape}"
74
- command << "-androidManifest #{File.expand_path(android_manifest_path).shellescape}"
75
-
76
- # Optional
77
- command << "-betaDistributionEmails #{params[:emails].join(',').shellescape}" if params[:emails]
78
- command << "-betaDistributionReleaseNotesFilePath #{File.expand_path(params[:notes_path]).shellescape}" if params[:notes_path]
79
- command << "-betaDistributionGroupAliases #{params[:groups].join(',').shellescape}" if params[:groups]
80
- command << "-betaDistributionNotifications #{(params[:notifications] ? 'true' : 'false')}"
81
-
82
- return command
83
- end
84
-
85
- def download_android_tools
86
- containing = File.join(File.expand_path("~/Library"), "CrashlyticsAndroid")
87
- zip_path = File.join(containing, "crashlytics-devtools.zip")
88
- jar_path = File.join(containing, "crashlytics-devtools.jar")
89
-
90
- url = "https://ssl-download-crashlytics-com.s3.amazonaws.com/android/ant/crashlytics.zip"
91
- require 'net/http'
92
-
93
- FileUtils.mkdir_p(containing)
94
-
95
- begin
96
- # Work around ruby defect, where HTTP#get_response and HTTP#post_form don't use ENV proxy settings
97
- # https://bugs.ruby-lang.org/issues/12724
98
- uri = URI(url)
99
- http_conn = Net::HTTP.new(uri.host, uri.port)
100
- http_conn.use_ssl = true
101
- result = http_conn.request_head(uri.path)
102
-
103
- # ETag is returned with quotes, which net/http does not handle. Clean that up
104
- etag = result['ETag'] && result['ETag'].tr('"', '')
105
-
106
- # This is a no-op if the current version on disk matches the file on S3
107
- return jar_path if File.exist?(zip_path) && etag == Digest::MD5.file(zip_path).hexdigest
108
-
109
- UI.important("Downloading Crashlytics Support Library - this might take a minute...")
110
- result = http_conn.request_get(uri.path)
111
- UI.error("#{result.message} (#{result.code})") unless result.kind_of?(Net::HTTPSuccess)
112
- File.write(zip_path, result.body)
113
-
114
- # Now unzip the file
115
- Action.sh("unzip -o '#{zip_path}' -d '#{containing}'")
116
-
117
- UI.user_error!("Couldn't find 'crashlytics-devtools.jar'") unless File.exist?(jar_path)
118
-
119
- UI.success("Successfully downloaded Crashlytics Support Library to '#{jar_path}'")
120
- rescue => ex
121
- UI.user_error!("Error fetching remote file: #{ex}")
122
- end
123
-
124
- return jar_path
125
- end
126
-
127
- def generate_android_manifest_tempfile
128
- # We have to generate an empty XML file to make the crashlytics CLI happy :)
129
- write_to_tempfile('<?xml version="1.0" encoding="utf-8"?><manifest></manifest>', 'xml')
130
- end
131
-
132
- def write_to_tempfile(value, tempfilename)
133
- require 'tempfile'
134
-
135
- Tempfile.new(tempfilename).tap do |t|
136
- t.write(value)
137
- t.close
138
- end
139
- end
140
- end
141
- end
142
- end
143
- end
144
-
145
- # java \
146
- # -jar ~/Desktop/crashlytics-devtools.jar \
147
- # -androidRes . \
148
- # -uploadDist /Users/fkrause/AndroidStudioProjects/AppName/app/build/outputs/apk/app-release.apk \
149
- # -androidManifest /Users/fkrause/Downloads/manifest.xml \
150
- # -apiKey api_key \
151
- # -apiSecret secret_key \
152
-
153
- # -betaDistributionReleaseNotes "Yeah" \
154
- # -betaDistributionEmails "something11@krausefx.com" \
155
- # -betaDistributionGroupAliases "testgroup" \
156
- # -betaDistributionNotifications false
157
- # -projectPath . \