fastlane 2.137.0 → 2.138.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +66 -66
  3. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  4. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +19 -0
  5. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +4 -2
  6. data/fastlane/lib/fastlane/actions/get_version_number.rb +7 -2
  7. data/fastlane/lib/fastlane/actions/increment_version_number.rb +6 -3
  8. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +2 -2
  9. data/fastlane/lib/fastlane/actions/register_devices.rb +5 -1
  10. data/fastlane/lib/fastlane/actions/verify_build.rb +1 -1
  11. data/fastlane/lib/fastlane/actions/xcode_select.rb +6 -1
  12. data/fastlane/lib/fastlane/helper/adb_helper.rb +13 -4
  13. data/fastlane/lib/fastlane/version.rb +1 -1
  14. data/fastlane/swift/Deliverfile.swift +1 -1
  15. data/fastlane/swift/Fastlane.swift +16 -7
  16. data/fastlane/swift/Gymfile.swift +1 -1
  17. data/fastlane/swift/Matchfile.swift +1 -1
  18. data/fastlane/swift/MatchfileProtocol.swift +5 -1
  19. data/fastlane/swift/Precheckfile.swift +1 -1
  20. data/fastlane/swift/Scanfile.swift +1 -1
  21. data/fastlane/swift/Screengrabfile.swift +1 -1
  22. data/fastlane/swift/Snapshotfile.swift +1 -1
  23. data/fastlane_core/lib/fastlane_core/helper.rb +1 -1
  24. data/match/lib/match/options.rb +8 -0
  25. data/match/lib/match/runner.rb +1 -0
  26. data/match/lib/match/storage/git_storage.rb +7 -2
  27. data/screengrab/lib/screengrab/runner.rb +11 -19
  28. data/spaceship/lib/spaceship/client.rb +9 -4
  29. data/spaceship/lib/spaceship/connect_api.rb +2 -0
  30. data/spaceship/lib/spaceship/connect_api/models/app.rb +11 -0
  31. data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +71 -0
  32. data/spaceship/lib/spaceship/connect_api/models/beta_screenshot.rb +18 -0
  33. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +9 -0
  34. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -5
  35. data/supply/lib/supply/client.rb +1 -0
  36. data/supply/lib/supply/uploader.rb +7 -1
  37. metadata +22 -28
  38. data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
  39. data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
  40. data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
  41. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  42. data/pilot/lib/pilot/.manager.rb.swp +0 -0
  43. data/spaceship/lib/spaceship/connect_api/.DS_Store +0 -0
  44. data/spaceship/lib/spaceship/portal/.certificate.rb.swp +0 -0
  45. data/supply/lib/supply/.uploader.rb.swp +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e98cccac212ef4e62bb965cb317a392b45406a68d6bef49162b330d0932fef1
4
- data.tar.gz: cf08d09dabcba42869fec0a717ebf2ca95f92adf449862a525b5ff4a7e829698
3
+ metadata.gz: fe11c3d8b7afcbbe9c3bc070c3455d220e64200ab52ce4f1322deac1026c1581
4
+ data.tar.gz: c9e3ddf13fa0cdd2e648151851986a404d3075e89bc1a7492cb7027fc68a1814
5
5
  SHA512:
6
- metadata.gz: 6e4e1c20b2b5a2487b6aa4862f1dcaaec73b55e5ccc08761e21d4969b4b5c5e4940a85b31c3550711715335b7e91dba748c343ea3ecbff049356bcb9dc694b01
7
- data.tar.gz: 25ea98cf73f137c63bc9f2be91d714d6aaca52617cd562690d75f9aa356055eacc5cb46a64e14b26c396dc7a21a7e87f7745d14ab07b06eae1149e7153976765
6
+ metadata.gz: c0b6291a3720ff53673da4c7c9091e2cd4688dbc4322ba48892abae02e3db40c6f6a1b19dd66cb927cd8d8fdffb750a4a196c6a813bb133beefdca97316433ee
7
+ data.tar.gz: 41bb5e5b8faa0bbf5f9126b7a8cd73a74309cc1fd68affaedda41b12d87e5994de45e90206c30a7047d20c05d3165490c9e9f9faeab9f94736ad4428084cf50f
data/README.md CHANGED
@@ -34,23 +34,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
34
34
  <!-- This table is regenerated and resorted on each release -->
35
35
  <table id='team'>
36
36
  <tr>
37
- <td id='manu-wallner'>
38
- <a href='https://github.com/milch'>
39
- <img src='https://github.com/milch.png?size=140'>
37
+ <td id='jérôme-lacoste'>
38
+ <a href='https://github.com/lacostej'>
39
+ <img src='https://github.com/lacostej.png?size=140'>
40
40
  </a>
41
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
41
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
42
42
  </td>
43
- <td id='helmut-januschka'>
44
- <a href='https://github.com/hjanuschka'>
45
- <img src='https://github.com/hjanuschka.png?size=140'>
43
+ <td id='olivier-halligon'>
44
+ <a href='https://github.com/AliSoftware'>
45
+ <img src='https://github.com/AliSoftware.png?size=140'>
46
46
  </a>
47
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
47
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
48
48
  </td>
49
- <td id='josh-holtz'>
50
- <a href='https://github.com/joshdholtz'>
51
- <img src='https://github.com/joshdholtz.png?size=140'>
49
+ <td id='andrew-mcburney'>
50
+ <a href='https://github.com/armcburney'>
51
+ <img src='https://github.com/armcburney.png?size=140'>
52
52
  </a>
53
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
53
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
54
54
  </td>
55
55
  <td id='fumiya-nakamura'>
56
56
  <a href='https://github.com/nafu'>
@@ -66,29 +66,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
66
66
  </td>
67
67
  </tr>
68
68
  <tr>
69
- <td id='iulian-onofrei'>
70
- <a href='https://github.com/revolter'>
71
- <img src='https://github.com/revolter.png?size=140'>
72
- </a>
73
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
74
- </td>
75
- <td id='jérôme-lacoste'>
76
- <a href='https://github.com/lacostej'>
77
- <img src='https://github.com/lacostej.png?size=140'>
78
- </a>
79
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
80
- </td>
81
69
  <td id='jorge-revuelta-h'>
82
70
  <a href='https://github.com/minuscorp'>
83
71
  <img src='https://github.com/minuscorp.png?size=140'>
84
72
  </a>
85
73
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
86
74
  </td>
87
- <td id='aaron-brager'>
88
- <a href='https://github.com/getaaron'>
89
- <img src='https://github.com/getaaron.png?size=140'>
75
+ <td id='jan-piotrowski'>
76
+ <a href='https://github.com/janpio'>
77
+ <img src='https://github.com/janpio.png?size=140'>
90
78
  </a>
91
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
79
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
80
+ </td>
81
+ <td id='jimmy-dee'>
82
+ <a href='https://github.com/jdee'>
83
+ <img src='https://github.com/jdee.png?size=140'>
84
+ </a>
85
+ <h4 align='center'>Jimmy Dee</h4>
92
86
  </td>
93
87
  <td id='matthew-ellis'>
94
88
  <a href='https://github.com/matthewellis'>
@@ -96,51 +90,69 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
96
90
  </a>
97
91
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
98
92
  </td>
93
+ <td id='josh-holtz'>
94
+ <a href='https://github.com/joshdholtz'>
95
+ <img src='https://github.com/joshdholtz.png?size=140'>
96
+ </a>
97
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
98
+ </td>
99
99
  </tr>
100
100
  <tr>
101
- <td id='luka-mirosevic'>
102
- <a href='https://github.com/lmirosevic'>
103
- <img src='https://github.com/lmirosevic.png?size=140'>
101
+ <td id='joshua-liebowitz'>
102
+ <a href='https://github.com/taquitos'>
103
+ <img src='https://github.com/taquitos.png?size=140'>
104
104
  </a>
105
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
105
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
106
106
  </td>
107
- <td id='kohki-miki'>
108
- <a href='https://github.com/giginet'>
109
- <img src='https://github.com/giginet.png?size=140'>
107
+ <td id='helmut-januschka'>
108
+ <a href='https://github.com/hjanuschka'>
109
+ <img src='https://github.com/hjanuschka.png?size=140'>
110
110
  </a>
111
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
111
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
112
112
  </td>
113
- <td id='jimmy-dee'>
114
- <a href='https://github.com/jdee'>
115
- <img src='https://github.com/jdee.png?size=140'>
113
+ <td id='danielle-tomlinson'>
114
+ <a href='https://github.com/endocrimes'>
115
+ <img src='https://github.com/endocrimes.png?size=140'>
116
116
  </a>
117
- <h4 align='center'>Jimmy Dee</h4>
117
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
118
118
  </td>
119
- <td id='jan-piotrowski'>
120
- <a href='https://github.com/janpio'>
121
- <img src='https://github.com/janpio.png?size=140'>
119
+ <td id='manu-wallner'>
120
+ <a href='https://github.com/milch'>
121
+ <img src='https://github.com/milch.png?size=140'>
122
122
  </a>
123
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
123
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
124
+ </td>
125
+ <td id='aaron-brager'>
126
+ <a href='https://github.com/getaaron'>
127
+ <img src='https://github.com/getaaron.png?size=140'>
128
+ </a>
129
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
124
130
  </td>
131
+ </tr>
132
+ <tr>
125
133
  <td id='maksym-grebenets'>
126
134
  <a href='https://github.com/mgrebenets'>
127
135
  <img src='https://github.com/mgrebenets.png?size=140'>
128
136
  </a>
129
137
  <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
130
138
  </td>
131
- </tr>
132
- <tr>
133
- <td id='danielle-tomlinson'>
134
- <a href='https://github.com/endocrimes'>
135
- <img src='https://github.com/endocrimes.png?size=140'>
139
+ <td id='luka-mirosevic'>
140
+ <a href='https://github.com/lmirosevic'>
141
+ <img src='https://github.com/lmirosevic.png?size=140'>
136
142
  </a>
137
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
143
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
138
144
  </td>
139
- <td id='olivier-halligon'>
140
- <a href='https://github.com/AliSoftware'>
141
- <img src='https://github.com/AliSoftware.png?size=140'>
145
+ <td id='iulian-onofrei'>
146
+ <a href='https://github.com/revolter'>
147
+ <img src='https://github.com/revolter.png?size=140'>
142
148
  </a>
143
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
149
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
150
+ </td>
151
+ <td id='kohki-miki'>
152
+ <a href='https://github.com/giginet'>
153
+ <img src='https://github.com/giginet.png?size=140'>
154
+ </a>
155
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
144
156
  </td>
145
157
  <td id='felix-krause'>
146
158
  <a href='https://github.com/KrauseFx'>
@@ -148,18 +160,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
148
160
  </a>
149
161
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
150
162
  </td>
151
- <td id='joshua-liebowitz'>
152
- <a href='https://github.com/taquitos'>
153
- <img src='https://github.com/taquitos.png?size=140'>
154
- </a>
155
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
156
- </td>
157
- <td id='andrew-mcburney'>
158
- <a href='https://github.com/armcburney'>
159
- <img src='https://github.com/armcburney.png?size=140'>
160
- </a>
161
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
162
- </td>
163
163
  </tr>
164
164
  </table>
165
165
 
@@ -24,7 +24,7 @@ module Fastlane
24
24
  Spaceship::Tunes.select_team(team_id: params[:team_id], team_name: params[:team_name])
25
25
  UI.message("Login successful")
26
26
 
27
- app = Spaceship::Tunes::Application.find(params[:app_identifier])
27
+ app = Spaceship::Tunes::Application.find(params[:app_identifier], mac: params[:platform] == "osx")
28
28
  UI.user_error!("Could not find an app on App Store Connect with app_identifier: #{params[:app_identifier]}") unless app
29
29
  if params[:live]
30
30
  UI.message("Fetching the latest build number for live-version")
@@ -111,6 +111,25 @@ match
111
111
 
112
112
  You can find more information about GitHub basic authentication and personal token generation here: [https://developer.github.com/v3/auth/#basic-authentication](https://developer.github.com/v3/auth/#basic-authentication)
113
113
 
114
+ ##### Git Storage on Azure Devops
115
+
116
+ If you're running a pipeline on Azure Devops and using git storage in a another repository on the same project, you might want to use `bearer` token authentication.
117
+
118
+ Using parameter:
119
+
120
+ ```
121
+ match(git_bearer_authorization: '<YOUR TOKEN>')
122
+ ```
123
+
124
+ Using environment variable:
125
+
126
+ ```
127
+ ENV['MATCH_GIT_BEARER_AUTHORIZATION'] = '<YOUR TOKEN>'
128
+ match
129
+ ```
130
+
131
+ You can find more information about this use case here: [https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml#authorize-access-to-your-repositories](https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml#authorize-access-to-your-repositories)
132
+
114
133
  #### Google Cloud Storage
115
134
 
116
135
  Use [Google Cloud Storage](https://cloud.google.com/storage/) for a fully hosted solution for your code signing identities. Certificates are stored on Google Cloud, encrypted using Google managed keys. Everything will be stored on your Google account, inside a storage bucket you provide. You can also directly access the files using the web console.
@@ -136,7 +136,7 @@ Note that these will replace the current images and screenshots on the play stor
136
136
 
137
137
  ## Changelogs (What's new)
138
138
 
139
- You can add changelog files under the `changelogs/` directory for each locale. The filename should exactly match the [version code](https://developer.android.com/studio/publish/versioning#appversioning) of the APK that it represents. `fastlane supply init` will populate changelog files from existing data on Google Play if no `metadata/` directory exists when it is run.
139
+ You can add changelog files under the `changelogs/` directory for each locale. The filename should exactly match the [version code](https://developer.android.com/studio/publish/versioning#appversioning) of the APK that it represents. You can also provide default notes that will be used if no files match the version code by adding a `default.txt` file. `fastlane supply init` will populate changelog files from existing data on Google Play if no `metadata/` directory exists when it is run.
140
140
 
141
141
  ```no-highlight
142
142
  └── fastlane
@@ -144,10 +144,12 @@ You can add changelog files under the `changelogs/` directory for each locale. T
144
144
  └── android
145
145
  ├── en-US
146
146
  │ └── changelogs
147
+ │ ├── default.txt
147
148
  │ ├── 100000.txt
148
149
  │ └── 100100.txt
149
150
  └── fr-FR
150
151
  └── changelogs
152
+ ├── default.txt
151
153
  └── 100100.txt
152
154
  ```
153
155
 
@@ -168,7 +170,7 @@ Before performing a new APK upload you may want to check existing track version
168
170
  - Used when uploading with `:apk_path`, `:apk_paths`, `:aab_path`, and `:aab_paths`
169
171
  - Can be any string such (example: "October Release" or "Awesome New Feature")
170
172
  - Defaults to the version name in app/build.gradle or AndroidManifest.xml
171
- - `:release_status`
173
+ - `:release_status`
172
174
  - Used when uploading with `:apk_path`, `:apk_paths`, `:aab_path`, and `:aab_paths`
173
175
  - Can set as "draft" to complete the release at some other time
174
176
  - Defaults to "completed"
@@ -91,7 +91,7 @@ module Fastlane
91
91
  end
92
92
 
93
93
  def self.get_plist!(folder, target, configuration = nil)
94
- plist_files = target.resolved_build_setting("INFOPLIST_FILE")
94
+ plist_files = target.resolved_build_setting("INFOPLIST_FILE", true)
95
95
  plist_files_count = plist_files.values.compact.uniq.count
96
96
 
97
97
  # Get plist file for specified configuration
@@ -113,7 +113,12 @@ module Fastlane
113
113
  plist_file.gsub!("$(SRCROOT)/", "")
114
114
  end
115
115
 
116
- plist_file = File.absolute_path(File.join(folder, plist_file))
116
+ # plist_file can be `Relative` or `Absolute` path.
117
+ # Make to `Absolute` path when plist_file is `Relative` path
118
+ unless File.exist?(plist_file)
119
+ plist_file = File.absolute_path(File.join(folder, plist_file))
120
+ end
121
+
117
122
  UI.user_error!("Cannot find plist file: #{plist_file}") unless File.exist?(plist_file)
118
123
 
119
124
  plist_file
@@ -43,6 +43,9 @@ module Fastlane
43
43
  version_array = current_version.split(".").map(&:to_i)
44
44
 
45
45
  case params[:bump_type]
46
+ when "bump"
47
+ version_array[-1] = version_array[-1] + 1
48
+ next_version_number = version_array.join(".")
46
49
  when "patch"
47
50
  UI.user_error!(version_token_error) if version_array.count < 3
48
51
  version_array[2] = version_array[2] + 1
@@ -109,9 +112,9 @@ module Fastlane
109
112
  FastlaneCore::ConfigItem.new(key: :bump_type,
110
113
  env_name: "FL_VERSION_NUMBER_BUMP_TYPE",
111
114
  description: "The type of this version bump. Available: patch, minor, major",
112
- default_value: "patch",
115
+ default_value: "bump",
113
116
  verify_block: proc do |value|
114
- UI.user_error!("Available values are 'patch', 'minor' and 'major'") unless ['patch', 'minor', 'major'].include?(value)
117
+ UI.user_error!("Available values are 'patch', 'minor' and 'major'") unless ['bump', 'patch', 'minor', 'major'].include?(value)
115
118
  end),
116
119
  FastlaneCore::ConfigItem.new(key: :version_number,
117
120
  env_name: "FL_VERSION_NUMBER_VERSION_NUMBER",
@@ -148,7 +151,7 @@ module Fastlane
148
151
 
149
152
  def self.example_code
150
153
  [
151
- 'increment_version_number # Automatically increment patch version number',
154
+ 'increment_version_number # Automatically increment version number',
152
155
  'increment_version_number(
153
156
  bump_type: "patch" # Automatically increment patch version number
154
157
  )',
@@ -64,7 +64,7 @@ module Fastlane
64
64
  is_string: true,
65
65
  default_value: "ios",
66
66
  verify_block: proc do |value|
67
- UI.user_error!("The platform can only be ios, or appletvos") unless %('ios', 'appletvos').include?(value)
67
+ UI.user_error!("The platform can only be ios, osx, or appletvos") unless %('osx', ios', 'appletvos').include?(value)
68
68
  end),
69
69
  FastlaneCore::ConfigItem.new(key: :initial_build_number,
70
70
  env_name: "INITIAL_BUILD_NUMBER",
@@ -110,7 +110,7 @@ module Fastlane
110
110
  end
111
111
 
112
112
  def self.is_supported?(platform)
113
- platform == :ios
113
+ [:ios, :mac].include?(platform)
114
114
  end
115
115
 
116
116
  def self.example_code
@@ -25,7 +25,11 @@ module Fastlane
25
25
  end
26
26
 
27
27
  new_devices = devices_file.drop(1).map do |row|
28
- UI.user_error!("Invalid device line, please provide a file according to the Apple Sample UDID file (https://developer.apple.com/account/resources/downloads/Multiple-Upload-Samples.zip)") unless (2..3).cover?(row.count)
28
+ if row.count == 1
29
+ UI.user_error!("Invalid device line, ensure you are using tabs (NOT spaces). See Apple's sample/spec here: https://developer.apple.com/account/resources/downloads/Multiple-Upload-Samples.zip")
30
+ elsif !(2..3).cover?(row.count)
31
+ UI.user_error!("Invalid device line, please provide a file according to the Apple Sample UDID file (https://developer.apple.com/account/resources/downloads/Multiple-Upload-Samples.zip)")
32
+ end
29
33
  row
30
34
  end
31
35
  else
@@ -92,7 +92,7 @@ module Fastlane
92
92
 
93
93
  def self.evaulate(params, values)
94
94
  if params[:provisioning_type]
95
- UI.user_error!("Mismatched provisioning_type. Required: '#{params[:provisioning_type]}''; Found: '#{values['provisioning_type']}'") unless params[:provisioning_type] == values['provisioning_type']
95
+ UI.user_error!("Mismatched provisioning_type. Required: '#{params[:provisioning_type]}'; Found: '#{values['provisioning_type']}'") unless params[:provisioning_type] == values['provisioning_type']
96
96
  end
97
97
  if params[:provisioning_uuid]
98
98
  UI.user_error!("Mismatched provisioning_uuid. Required: '#{params[:provisioning_uuid]}'; Found: '#{values['provisioning_uuid']}'") unless params[:provisioning_uuid] == values['provisioning_uuid']
@@ -38,7 +38,12 @@ module Fastlane
38
38
  end
39
39
 
40
40
  def self.details
41
- "Select and build with the Xcode installed at the provided path. Use the `xcversion` action if you want to select an Xcode based on a version specifier or you don't have known, stable paths as may happen in a CI environment."
41
+ [
42
+ "Select and build with the Xcode installed at the provided path.",
43
+ "Use the `xcversion` action if you want to select an Xcode:",
44
+ "- Based on a version specifier or",
45
+ "- You don't have known, stable paths, as may happen in a CI environment."
46
+ ].join("\n")
42
47
  end
43
48
 
44
49
  def self.author
@@ -12,21 +12,30 @@ module Fastlane
12
12
  # Path to the adb binary
13
13
  attr_accessor :adb_path
14
14
 
15
+ # Path to the adb binary
16
+ attr_accessor :adb_host
17
+
15
18
  # All available devices
16
19
  attr_accessor :devices
17
20
 
18
- def initialize(adb_path: nil)
21
+ def initialize(adb_path: nil, adb_host: nil)
19
22
  android_home = ENV['ANDROID_HOME'] || ENV['ANDROID_SDK_ROOT'] || ENV['ANDROID_SDK']
20
23
  if (adb_path.nil? || adb_path == "adb") && android_home
21
24
  adb_path = File.join(android_home, "platform-tools", "adb")
22
25
  end
26
+
23
27
  self.adb_path = adb_path
28
+ self.adb_host = adb_host
29
+ end
30
+
31
+ def host_option
32
+ return self.adb_host ? "-H #{adb_host}" : nil
24
33
  end
25
34
 
26
35
  # Run a certain action
27
36
  def trigger(command: nil, serial: nil)
28
37
  android_serial = serial != "" ? "ANDROID_SERIAL=#{serial}" : nil
29
- command = [android_serial, adb_path.shellescape, command].join(" ").strip
38
+ command = [android_serial, adb_path.shellescape, host_option, command].compact.join(" ").strip
30
39
  Action.sh(command)
31
40
  end
32
41
 
@@ -43,10 +52,10 @@ module Fastlane
43
52
  def load_all_devices
44
53
  self.devices = []
45
54
 
46
- command = [adb_path.shellescape, "devices"].join(" ")
55
+ command = [adb_path.shellescape, host_option, "devices -l"].compact.join(" ")
47
56
  output = Actions.sh(command, log: false)
48
57
  output.split("\n").each do |line|
49
- if (result = line.match(/(.*)\tdevice$/))
58
+ if (result = line.match(/^(\S+)(\s+)(device )/))
50
59
  self.devices << AdbDevice.new(serial: result[1])
51
60
  end
52
61
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.137.0'.freeze
2
+ VERSION = '2.138.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.137.0
21
+ // Generated with fastlane 2.138.0
@@ -2577,7 +2577,7 @@ func downloadDsyms(username: String,
2577
2577
  func downloadFromPlayStore(packageName: String,
2578
2578
  versionName: String? = nil,
2579
2579
  track: String = "production",
2580
- metadataPath: String = "./metadata",
2580
+ metadataPath: String? = nil,
2581
2581
  key: String? = nil,
2582
2582
  issuer: String? = nil,
2583
2583
  jsonKey: String? = nil,
@@ -3878,7 +3878,7 @@ func importCertificate(certificatePath: String,
3878
3878
  This action will increment the version number.
3879
3879
  You first have to set up your Xcode project, if you haven't done it already: [https://developer.apple.com/library/ios/qa/qa1827/_index.html](https://developer.apple.com/library/ios/qa/qa1827/_index.html).
3880
3880
  */
3881
- @discardableResult func incrementVersionNumber(bumpType: String = "patch",
3881
+ @discardableResult func incrementVersionNumber(bumpType: String = "bump",
3882
3882
  versionNumber: String? = nil,
3883
3883
  xcodeproj: String? = nil) -> String {
3884
3884
  let command = RubyCommand(commandID: "", methodName: "increment_version_number", className: nil, args: [RubyCommand.Argument(name: "bump_type", value: bumpType),
@@ -4233,6 +4233,7 @@ func makeChangelogFromJenkins(fallbackChangelog: String = "",
4233
4233
  - shallowClone: Make a shallow clone of the repository (truncate the history to 1 revision)
4234
4234
  - cloneBranchDirectly: Clone just the branch specified, instead of the whole repo. This requires that the branch already exists. Otherwise the command will fail
4235
4235
  - gitBasicAuthorization: Use a basic authorization header to access the git repo (e.g.: access via HTTPS, GitHub Actions, etc), usually a string in Base64
4236
+ - gitBearerAuthorization: Use a bearer authorization header to access the git repo (e.g.: access to an Azure Devops repository), usually a string in Base64
4236
4237
  - googleCloudBucketName: Name of the Google Cloud Storage bucket to use
4237
4238
  - googleCloudKeysFile: Path to the gc_keys.json file
4238
4239
  - googleCloudProjectId: ID of the Google Cloud project to use for authentication
@@ -4265,6 +4266,7 @@ func match(type: Any = matchfile.type,
4265
4266
  shallowClone: Bool = matchfile.shallowClone,
4266
4267
  cloneBranchDirectly: Bool = matchfile.cloneBranchDirectly,
4267
4268
  gitBasicAuthorization: Any? = matchfile.gitBasicAuthorization,
4269
+ gitBearerAuthorization: Any? = matchfile.gitBearerAuthorization,
4268
4270
  googleCloudBucketName: Any? = matchfile.googleCloudBucketName,
4269
4271
  googleCloudKeysFile: Any? = matchfile.googleCloudKeysFile,
4270
4272
  googleCloudProjectId: Any? = matchfile.googleCloudProjectId,
@@ -4294,6 +4296,7 @@ func match(type: Any = matchfile.type,
4294
4296
  RubyCommand.Argument(name: "shallow_clone", value: shallowClone),
4295
4297
  RubyCommand.Argument(name: "clone_branch_directly", value: cloneBranchDirectly),
4296
4298
  RubyCommand.Argument(name: "git_basic_authorization", value: gitBasicAuthorization),
4299
+ RubyCommand.Argument(name: "git_bearer_authorization", value: gitBearerAuthorization),
4297
4300
  RubyCommand.Argument(name: "google_cloud_bucket_name", value: googleCloudBucketName),
4298
4301
  RubyCommand.Argument(name: "google_cloud_keys_file", value: googleCloudKeysFile),
4299
4302
  RubyCommand.Argument(name: "google_cloud_project_id", value: googleCloudProjectId),
@@ -6720,7 +6723,7 @@ func supply(packageName: String,
6720
6723
  releaseStatus: String = "completed",
6721
6724
  track: String = "production",
6722
6725
  rollout: String? = nil,
6723
- metadataPath: String = "./metadata",
6726
+ metadataPath: String? = nil,
6724
6727
  key: String? = nil,
6725
6728
  issuer: String? = nil,
6726
6729
  jsonKey: String? = nil,
@@ -6849,6 +6852,7 @@ func swiftlint(mode: Any = "lint",
6849
6852
  - shallowClone: Make a shallow clone of the repository (truncate the history to 1 revision)
6850
6853
  - cloneBranchDirectly: Clone just the branch specified, instead of the whole repo. This requires that the branch already exists. Otherwise the command will fail
6851
6854
  - gitBasicAuthorization: Use a basic authorization header to access the git repo (e.g.: access via HTTPS, GitHub Actions, etc), usually a string in Base64
6855
+ - gitBearerAuthorization: Use a bearer authorization header to access the git repo (e.g.: access to an Azure Devops repository), usually a string in Base64
6852
6856
  - googleCloudBucketName: Name of the Google Cloud Storage bucket to use
6853
6857
  - googleCloudKeysFile: Path to the gc_keys.json file
6854
6858
  - googleCloudProjectId: ID of the Google Cloud project to use for authentication
@@ -6881,6 +6885,7 @@ func syncCodeSigning(type: String = "development",
6881
6885
  shallowClone: Bool = false,
6882
6886
  cloneBranchDirectly: Bool = false,
6883
6887
  gitBasicAuthorization: String? = nil,
6888
+ gitBearerAuthorization: String? = nil,
6884
6889
  googleCloudBucketName: String? = nil,
6885
6890
  googleCloudKeysFile: String? = nil,
6886
6891
  googleCloudProjectId: String? = nil,
@@ -6910,6 +6915,7 @@ func syncCodeSigning(type: String = "development",
6910
6915
  RubyCommand.Argument(name: "shallow_clone", value: shallowClone),
6911
6916
  RubyCommand.Argument(name: "clone_branch_directly", value: cloneBranchDirectly),
6912
6917
  RubyCommand.Argument(name: "git_basic_authorization", value: gitBasicAuthorization),
6918
+ RubyCommand.Argument(name: "git_bearer_authorization", value: gitBearerAuthorization),
6913
6919
  RubyCommand.Argument(name: "google_cloud_bucket_name", value: googleCloudBucketName),
6914
6920
  RubyCommand.Argument(name: "google_cloud_keys_file", value: googleCloudKeysFile),
6915
6921
  RubyCommand.Argument(name: "google_cloud_project_id", value: googleCloudProjectId),
@@ -7745,7 +7751,7 @@ func uploadToPlayStore(packageName: String,
7745
7751
  releaseStatus: String = "completed",
7746
7752
  track: String = "production",
7747
7753
  rollout: String? = nil,
7748
- metadataPath: String = "./metadata",
7754
+ metadataPath: String? = nil,
7749
7755
  key: String? = nil,
7750
7756
  issuer: String? = nil,
7751
7757
  jsonKey: String? = nil,
@@ -8087,7 +8093,10 @@ func xcexport() {
8087
8093
  /**
8088
8094
  Change the xcode-path to use. Useful for beta versions of Xcode
8089
8095
 
8090
- Select and build with the Xcode installed at the provided path. Use the `xcversion` action if you want to select an Xcode based on a version specifier or you don't have known, stable paths as may happen in a CI environment.
8096
+ Select and build with the Xcode installed at the provided path.
8097
+ Use the `xcversion` action if you want to select an Xcode:
8098
+ - Based on a version specifier or
8099
+ - You don't have known, stable paths, as may happen in a CI environment.
8091
8100
  */
8092
8101
  func xcodeSelect() {
8093
8102
  let command = RubyCommand(commandID: "", methodName: "xcode_select", className: nil, args: [])
@@ -8202,7 +8211,7 @@ func xcov(workspace: String? = nil,
8202
8211
  coverallsServiceJobId: String? = nil,
8203
8212
  coverallsRepoToken: String? = nil,
8204
8213
  xcconfig: String? = nil,
8205
- ideFoundationPath: String = "/Applications/Xcode-11.2.1.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
8214
+ ideFoundationPath: String = "/Applications/Xcode-11.2.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
8206
8215
  legacySupport: Bool = false) {
8207
8216
  let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
8208
8217
  RubyCommand.Argument(name: "project", value: project),
@@ -8347,4 +8356,4 @@ let snapshotfile: Snapshotfile = Snapshotfile()
8347
8356
 
8348
8357
  // Please don't remove the lines below
8349
8358
  // They are used to detect outdated files
8350
- // FastlaneRunnerAPIVersion [0.9.65]
8359
+ // FastlaneRunnerAPIVersion [0.9.66]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.137.0
21
+ // Generated with fastlane 2.138.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.137.0
21
+ // Generated with fastlane 2.138.0
@@ -48,6 +48,9 @@ protocol MatchfileProtocol: class {
48
48
  /// Use a basic authorization header to access the git repo (e.g.: access via HTTPS, GitHub Actions, etc), usually a string in Base64
49
49
  var gitBasicAuthorization: String? { get }
50
50
 
51
+ /// Use a bearer authorization header to access the git repo (e.g.: access to an Azure Devops repository), usually a string in Base64
52
+ var gitBearerAuthorization: String? { get }
53
+
51
54
  /// Name of the Google Cloud Storage bucket to use
52
55
  var googleCloudBucketName: String? { get }
53
56
 
@@ -105,6 +108,7 @@ extension MatchfileProtocol {
105
108
  var shallowClone: Bool { return false }
106
109
  var cloneBranchDirectly: Bool { return false }
107
110
  var gitBasicAuthorization: String? { return nil }
111
+ var gitBearerAuthorization: String? { return nil }
108
112
  var googleCloudBucketName: String? { return nil }
109
113
  var googleCloudKeysFile: String? { return nil }
110
114
  var googleCloudProjectId: String? { return nil }
@@ -122,4 +126,4 @@ extension MatchfileProtocol {
122
126
 
123
127
  // Please don't remove the lines below
124
128
  // They are used to detect outdated files
125
- // FastlaneRunnerAPIVersion [0.9.11]
129
+ // FastlaneRunnerAPIVersion [0.9.12]
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.137.0
21
+ // Generated with fastlane 2.138.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.137.0
21
+ // Generated with fastlane 2.138.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.137.0
21
+ // Generated with fastlane 2.138.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.137.0
21
+ // Generated with fastlane 2.138.0
@@ -72,7 +72,7 @@ module FastlaneCore
72
72
  # @return [boolean] true if building in a known CI environment
73
73
  def self.ci?
74
74
  # Check for Jenkins, Travis CI, ... environment variables
75
- ['JENKINS_HOME', 'JENKINS_URL', 'TRAVIS', 'CIRCLECI', 'CI', 'APPCENTER_BUILD_ID', 'TEAMCITY_VERSION', 'GO_PIPELINE_NAME', 'bamboo_buildKey', 'GITLAB_CI', 'XCS', 'TF_BUILD', 'GITHUB_ACTION', 'GITHUB_ACTIONS'].each do |current|
75
+ ['JENKINS_HOME', 'JENKINS_URL', 'TRAVIS', 'CIRCLECI', 'CI', 'APPCENTER_BUILD_ID', 'TEAMCITY_VERSION', 'GO_PIPELINE_NAME', 'bamboo_buildKey', 'GITLAB_CI', 'XCS', 'TF_BUILD', 'GITHUB_ACTION', 'GITHUB_ACTIONS', 'BITRISE_IO'].each do |current|
76
76
  return true if ENV.key?(current)
77
77
  end
78
78
  return false
@@ -125,6 +125,14 @@ module Match
125
125
  env_name: "MATCH_GIT_BASIC_AUTHORIZATION",
126
126
  sensitive: true,
127
127
  description: "Use a basic authorization header to access the git repo (e.g.: access via HTTPS, GitHub Actions, etc), usually a string in Base64",
128
+ conflicting_options: [:git_bearer_authorization],
129
+ optional: true,
130
+ default_value: nil),
131
+ FastlaneCore::ConfigItem.new(key: :git_bearer_authorization,
132
+ env_name: "MATCH_GIT_BEARER_AUTHORIZATION",
133
+ sensitive: true,
134
+ description: "Use a bearer authorization header to access the git repo (e.g.: access to an Azure Devops repository), usually a string in Base64",
135
+ conflicting_options: [:git_basic_authorization],
128
136
  optional: true,
129
137
  default_value: nil),
130
138
 
@@ -38,6 +38,7 @@ module Match
38
38
  git_user_email: params[:git_user_email],
39
39
  clone_branch_directly: params[:clone_branch_directly],
40
40
  git_basic_authorization: params[:git_basic_authorization],
41
+ git_bearer_authorization: params[:git_bearer_authorization],
41
42
  type: params[:type].to_s,
42
43
  generate_apple_certs: params[:generate_apple_certs],
43
44
  platform: params[:platform].to_s,
@@ -18,6 +18,7 @@ module Match
18
18
  attr_accessor :type
19
19
  attr_accessor :platform
20
20
  attr_accessor :git_basic_authorization
21
+ attr_accessor :git_bearer_authorization
21
22
 
22
23
  def self.configure(params)
23
24
  return self.new(
@@ -30,7 +31,8 @@ module Match
30
31
  git_full_name: params[:git_full_name],
31
32
  git_user_email: params[:git_user_email],
32
33
  clone_branch_directly: params[:clone_branch_directly],
33
- git_basic_authorization: params[:git_basic_authorization]
34
+ git_basic_authorization: params[:git_basic_authorization],
35
+ git_bearer_authorization: params[:git_bearer_authorization]
34
36
  )
35
37
  end
36
38
 
@@ -43,7 +45,8 @@ module Match
43
45
  git_full_name: nil,
44
46
  git_user_email: nil,
45
47
  clone_branch_directly: false,
46
- git_basic_authorization: nil)
48
+ git_basic_authorization: nil,
49
+ git_bearer_authorization: nil)
47
50
  self.git_url = git_url
48
51
  self.shallow_clone = shallow_clone
49
52
  self.skip_docs = skip_docs
@@ -52,6 +55,7 @@ module Match
52
55
  self.git_user_email = git_user_email
53
56
  self.clone_branch_directly = clone_branch_directly
54
57
  self.git_basic_authorization = git_basic_authorization
58
+ self.git_bearer_authorization = git_bearer_authorization
55
59
 
56
60
  self.type = type if type
57
61
  self.platform = platform if platform
@@ -70,6 +74,7 @@ module Match
70
74
 
71
75
  command = "git clone #{self.git_url.shellescape} #{self.working_directory.shellescape}"
72
76
  command << " -c http.extraheader='AUTHORIZATION: basic #{self.git_basic_authorization}'" unless self.git_basic_authorization.nil?
77
+ command << " -c http.extraheader='AUTHORIZATION: bearer #{self.git_bearer_authorization}'" unless self.git_bearer_authorization.nil?
73
78
 
74
79
  if self.shallow_clone
75
80
  command << " --depth 1 --no-single-branch"
@@ -1,5 +1,6 @@
1
1
  require 'fastlane_core/print_table'
2
2
  require 'fastlane_core/command_executor'
3
+ require 'fastlane/helper/adb_helper'
3
4
  require_relative 'reports_generator'
4
5
  require_relative 'module'
5
6
 
@@ -84,35 +85,26 @@ module Screengrab
84
85
  end
85
86
 
86
87
  def select_device
87
- devices = run_adb_command("devices -l", print_all: true, print_command: true).split("\n")
88
- # the first output by adb devices is "List of devices attached" so remove that and any adb startup output
89
- devices.reject! do |device|
90
- [
91
- 'server is out of date', # The adb server is out of date and must be restarted
92
- 'unauthorized', # The device has not yet accepted ADB control
93
- 'offline', # The device is offline, skip it
94
- '* daemon', # Messages printed when the daemon is starting up
95
- 'List of devices attached', # Header of table for data we want
96
- "doesn't match this client" # Message printed when there is an ADB client/server version mismatch
97
- ].any? { |status| device.include?(status) }
98
- end
88
+ adb = Fastlane::Helper::AdbHelper.new(adb_host: @config[:adb_host])
89
+ devices = adb.load_all_devices
99
90
 
100
91
  UI.user_error!('There are no connected and authorized devices or emulators') if devices.empty?
101
92
 
102
- devices.select! { |d| d.include?(@config[:specific_device]) } if @config[:specific_device]
93
+ specific_device = @config[:specific_device]
94
+ if specific_device
95
+ devices.select! do |d|
96
+ d.serial.include?(specific_device)
97
+ end
98
+ end
103
99
 
104
- UI.user_error!("No connected devices matched your criteria: #{@config[:specific_device]}") if devices.empty?
100
+ UI.user_error!("No connected devices matched your criteria: #{specific_device}") if devices.empty?
105
101
 
106
102
  if devices.length > 1
107
103
  UI.important("Multiple connected devices, selecting the first one")
108
104
  UI.important("To specify which connected device to use, use the -s (specific_device) config option")
109
105
  end
110
106
 
111
- # grab the serial number. the lines of output can look like these:
112
- # 00c22d4d84aec525 device usb:2148663295X product:bullhead model:Nexus_5X device:bullhead
113
- # 192.168.1.100:5555 device usb:2148663295X product:bullhead model:Nexus_5X device:genymotion
114
- # emulator-5554 device usb:2148663295X product:bullhead model:Nexus_5X device:emulator
115
- devices[0].match(/^\S+/)[0]
107
+ devices.first.serial
116
108
  end
117
109
 
118
110
  def select_app_apk(discovered_apk_paths)
@@ -563,10 +563,15 @@ module Spaceship
563
563
  #####################################################
564
564
 
565
565
  def load_session_from_file
566
- if File.exist?(persistent_cookie_path)
567
- puts("Loading session from '#{persistent_cookie_path}'") if Spaceship::Globals.verbose?
568
- @cookie.load(persistent_cookie_path)
569
- return true
566
+ begin
567
+ if File.exist?(persistent_cookie_path)
568
+ puts("Loading session from '#{persistent_cookie_path}'") if Spaceship::Globals.verbose?
569
+ @cookie.load(persistent_cookie_path)
570
+ return true
571
+ end
572
+ rescue => ex
573
+ puts(ex.to_s)
574
+ puts("Continuing with normal login.")
570
575
  end
571
576
  return false
572
577
  end
@@ -20,7 +20,9 @@ require 'spaceship/connect_api/models/beta_build_localization'
20
20
  require 'spaceship/connect_api/models/beta_build_metric'
21
21
  require 'spaceship/connect_api/models/beta_app_review_detail'
22
22
  require 'spaceship/connect_api/models/beta_app_review_submission'
23
+ require 'spaceship/connect_api/models/beta_feedback'
23
24
  require 'spaceship/connect_api/models/beta_group'
25
+ require 'spaceship/connect_api/models/beta_screenshot'
24
26
  require 'spaceship/connect_api/models/beta_tester'
25
27
  require 'spaceship/connect_api/models/beta_tester_metric'
26
28
  require 'spaceship/connect_api/models/build'
@@ -45,6 +45,17 @@ module Spaceship
45
45
  return Spaceship::ConnectAPI.get_app(app_id: app_id, includes: includes).first
46
46
  end
47
47
 
48
+ #
49
+ # Beta Feedback
50
+
51
+ def get_beta_feedback(filter: {}, includes: "tester,build,screenshots", limit: nil, sort: nil)
52
+ filter ||= {}
53
+ filter["build.app"] = id
54
+
55
+ resps = Spaceship::ConnectAPI.get_beta_feedback(filter: filter, includes: includes, limit: limit, sort: sort).all_pages
56
+ return resps.flat_map(&:to_models)
57
+ end
58
+
48
59
  #
49
60
  # Beta Testers
50
61
  #
@@ -0,0 +1,71 @@
1
+ require_relative '../model'
2
+ module Spaceship
3
+ class ConnectAPI
4
+ class BetaFeedback
5
+ include Spaceship::ConnectAPI::Model
6
+
7
+ attr_accessor :timestamp
8
+ attr_accessor :comment
9
+ attr_accessor :email_address
10
+ attr_accessor :device_model
11
+ attr_accessor :os_version
12
+ attr_accessor :bookmarked
13
+ attr_accessor :locale
14
+ attr_accessor :carrier
15
+ attr_accessor :timezone
16
+ attr_accessor :architecture
17
+ attr_accessor :connection_status
18
+ attr_accessor :paired_apple_watch
19
+ attr_accessor :app_up_time_millis
20
+ attr_accessor :available_disk_bytes
21
+ attr_accessor :total_disk_bytes
22
+ attr_accessor :network_type
23
+ attr_accessor :battery_percentage
24
+ attr_accessor :screen_width
25
+ attr_accessor :screen_height
26
+
27
+ attr_accessor :build
28
+ attr_accessor :tester
29
+ attr_accessor :screenshots
30
+
31
+ attr_mapping({
32
+ "timestamp" => "timestamp",
33
+ "comment" => "comment",
34
+ "emailAddress" => "email_address",
35
+ "contactEmail" => "contact_email",
36
+ "deviceModel" => "device_model",
37
+ "osVersion" => "os_version",
38
+ "bookmarked" => "bookmarked",
39
+ "locale" => "locale",
40
+ "carrier" => "carrier",
41
+ "timezone" => "timezone",
42
+ "architecture" => "architecture",
43
+ "connectionStatus" => "connection_status",
44
+ "pairedAppleWatch" => "paired_apple_watch",
45
+ "appUpTimeMillis" => "app_up_time_millis",
46
+ "availableDiskBytes" => "available_disk_bytes",
47
+ "totalDiskBytes" => "total_disk_bytes",
48
+ "networkType" => "network_type",
49
+ "batteryPercentage" => "battery_percentage",
50
+ "screenWidth" => "screen_width",
51
+ "screenHeight" => "screen_height",
52
+
53
+ "build" => "build",
54
+ "tester" => "tester",
55
+ "screenshots" => "screenshots"
56
+ })
57
+
58
+ def self.type
59
+ return "betaFeedbacks"
60
+ end
61
+
62
+ #
63
+ # API
64
+ #
65
+
66
+ def self.all(filter: {}, includes: "tester,build,screenshots", limit: nil, sort: nil)
67
+ return Spaceship::ConnectAPI.get_beta_feedback(filter: filter, includes: includes, limit: limit, sort: sort)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../model'
2
+ module Spaceship
3
+ class ConnectAPI
4
+ class BetaScreenshot
5
+ include Spaceship::ConnectAPI::Model
6
+
7
+ attr_accessor :image_assets
8
+
9
+ attr_mapping({
10
+ "imageAssets" => "image_assets"
11
+ })
12
+
13
+ def self.type
14
+ return "betaScreenshots"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -317,6 +317,15 @@ module Spaceship
317
317
  params = Client.instance.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
318
318
  Client.instance.get("preReleaseVersions", params)
319
319
  end
320
+
321
+ #
322
+ # betaFeedbacks (private API as of end 2019)
323
+ #
324
+
325
+ def get_beta_feedback(filter: {}, includes: nil, limit: nil, sort: nil)
326
+ params = Client.instance.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
327
+ Client.instance.get("betaFeedbacks", params)
328
+ end
320
329
  end
321
330
  end
322
331
  end
@@ -784,11 +784,8 @@ module Spaceship
784
784
  end
785
785
 
786
786
  def available_languages
787
- r = request(:get, "ra/apps/storePreview/regionCountryLanguage")
788
- response = parse_response(r, 'data')
789
- response.flat_map { |region| region["storeFronts"] }
790
- .flat_map { |storefront| storefront["supportedLocaleCodes"] }
791
- .uniq
787
+ r = request(:get, "ra/ref")
788
+ parse_response(r, 'data')['detailLocales']
792
789
  end
793
790
 
794
791
  #####################################################
@@ -345,6 +345,7 @@ module Supply
345
345
  ensure_active_edit!
346
346
 
347
347
  all_tracks = call_google_api { client.list_edit_tracks(current_package_name, current_edit.id) }.tracks
348
+ all_tracks = [] unless all_tracks
348
349
 
349
350
  if tracknames.length > 0
350
351
  all_tracks = all_tracks.select { |track| tracknames.include?(track.track) }
@@ -195,7 +195,13 @@ module Supply
195
195
  UI.message("Updating changelog for '#{version_code}' and language '#{language}'...")
196
196
  changelog_text = File.read(path, encoding: 'UTF-8')
197
197
  else
198
- UI.message("Could not find changelog for '#{version_code}' and language '#{language}' at path #{path}...")
198
+ default_changelog_path = File.join(Supply.config[:metadata_path], language, Supply::CHANGELOGS_FOLDER_NAME, "default.txt")
199
+ if File.exist?(default_changelog_path)
200
+ UI.message("Updating changelog for '#{version_code}' and language '#{language}' to default changelog...")
201
+ changelog_text = File.read(default_changelog_path, encoding: 'UTF-8')
202
+ else
203
+ UI.message("Could not find changelog for '#{version_code}' and language '#{language}' at path #{path}...")
204
+ end
199
205
  end
200
206
 
201
207
  AndroidPublisher::LocalizedText.new({
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.137.0
4
+ version: 2.138.0
5
5
  platform: ruby
6
6
  authors:
7
- - Josh Holtz
8
- - Olivier Halligon
7
+ - Jorge Revuelta H
9
8
  - Joshua Liebowitz
10
- - Aaron Brager
11
- - Andrew McBurney
9
+ - Josh Holtz
10
+ - Danielle Tomlinson
12
11
  - Kohki Miki
13
- - Manu Wallner
14
- - Felix Krause
15
12
  - Luka Mirosevic
16
- - Stefan Natchev
17
13
  - Iulian Onofrei
18
- - Danielle Tomlinson
19
- - Jimmy Dee
20
- - Jérôme Lacoste
21
- - Jan Piotrowski
14
+ - Stefan Natchev
15
+ - Maksym Grebenets
16
+ - Manu Wallner
17
+ - Aaron Brager
22
18
  - Matthew Ellis
19
+ - Felix Krause
20
+ - Jan Piotrowski
21
+ - Jérôme Lacoste
23
22
  - Helmut Januschka
24
23
  - Fumiya Nakamura
25
- - Maksym Grebenets
26
- - Jorge Revuelta H
24
+ - Andrew McBurney
25
+ - Olivier Halligon
26
+ - Jimmy Dee
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2019-11-22 00:00:00.000000000 Z
30
+ date: 2019-12-19 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier
@@ -55,7 +55,7 @@ dependencies:
55
55
  requirements:
56
56
  - - ">="
57
57
  - !ruby/object:Gem::Version
58
- version: 1.8.1
58
+ version: 1.13.0
59
59
  - - "<"
60
60
  - !ruby/object:Gem::Version
61
61
  version: 2.0.0
@@ -65,7 +65,7 @@ dependencies:
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 1.8.1
68
+ version: 1.13.0
69
69
  - - "<"
70
70
  - !ruby/object:Gem::Version
71
71
  version: 2.0.0
@@ -325,7 +325,7 @@ dependencies:
325
325
  requirements:
326
326
  - - ">="
327
327
  - !ruby/object:Gem::Version
328
- version: 0.45.0
328
+ version: 0.71.0
329
329
  - - "<"
330
330
  - !ruby/object:Gem::Version
331
331
  version: 1.0.0
@@ -335,7 +335,7 @@ dependencies:
335
335
  requirements:
336
336
  - - ">="
337
337
  - !ruby/object:Gem::Version
338
- version: 0.45.0
338
+ version: 0.71.0
339
339
  - - "<"
340
340
  - !ruby/object:Gem::Version
341
341
  version: 1.0.0
@@ -986,9 +986,6 @@ files:
986
986
  - fastlane/lib/fastlane.rb
987
987
  - fastlane/lib/fastlane/action.rb
988
988
  - fastlane/lib/fastlane/action_collector.rb
989
- - fastlane/lib/fastlane/actions/.hockey.rb.swp
990
- - fastlane/lib/fastlane/actions/.slack.rb.swp
991
- - fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp
992
989
  - fastlane/lib/fastlane/actions/README.md
993
990
  - fastlane/lib/fastlane/actions/actions_helper.rb
994
991
  - fastlane/lib/fastlane/actions/adb.rb
@@ -1317,7 +1314,6 @@ files:
1317
1314
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj
1318
1315
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
1319
1316
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
1320
- - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate
1321
1317
  - fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme
1322
1318
  - fastlane/swift/FastlaneSwiftRunner/README.txt
1323
1319
  - fastlane/swift/Gymfile.swift
@@ -1472,7 +1468,6 @@ files:
1472
1468
  - pem/lib/pem/options.rb
1473
1469
  - pilot/README.md
1474
1470
  - pilot/lib/pilot.rb
1475
- - pilot/lib/pilot/.manager.rb.swp
1476
1471
  - pilot/lib/pilot/build_manager.rb
1477
1472
  - pilot/lib/pilot/commands_generator.rb
1478
1473
  - pilot/lib/pilot/features.rb
@@ -1604,7 +1599,6 @@ files:
1604
1599
  - spaceship/lib/spaceship/client.rb
1605
1600
  - spaceship/lib/spaceship/commands_generator.rb
1606
1601
  - spaceship/lib/spaceship/connect_api.rb
1607
- - spaceship/lib/spaceship/connect_api/.DS_Store
1608
1602
  - spaceship/lib/spaceship/connect_api/client.rb
1609
1603
  - spaceship/lib/spaceship/connect_api/model.rb
1610
1604
  - spaceship/lib/spaceship/connect_api/models/app.rb
@@ -1613,7 +1607,9 @@ files:
1613
1607
  - spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb
1614
1608
  - spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb
1615
1609
  - spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb
1610
+ - spaceship/lib/spaceship/connect_api/models/beta_feedback.rb
1616
1611
  - spaceship/lib/spaceship/connect_api/models/beta_group.rb
1612
+ - spaceship/lib/spaceship/connect_api/models/beta_screenshot.rb
1617
1613
  - spaceship/lib/spaceship/connect_api/models/beta_tester.rb
1618
1614
  - spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb
1619
1615
  - spaceship/lib/spaceship/connect_api/models/build.rb
@@ -1645,7 +1641,6 @@ files:
1645
1641
  - spaceship/lib/spaceship/launcher.rb
1646
1642
  - spaceship/lib/spaceship/module.rb
1647
1643
  - spaceship/lib/spaceship/playground.rb
1648
- - spaceship/lib/spaceship/portal/.certificate.rb.swp
1649
1644
  - spaceship/lib/spaceship/portal/app.rb
1650
1645
  - spaceship/lib/spaceship/portal/app_group.rb
1651
1646
  - spaceship/lib/spaceship/portal/app_service.rb
@@ -1738,7 +1733,6 @@ files:
1738
1733
  - spaceship/lib/spaceship/ui.rb
1739
1734
  - supply/README.md
1740
1735
  - supply/lib/supply.rb
1741
- - supply/lib/supply/.uploader.rb.swp
1742
1736
  - supply/lib/supply/apk_listing.rb
1743
1737
  - supply/lib/supply/client.rb
1744
1738
  - supply/lib/supply/commands_generator.rb
@@ -1786,7 +1780,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1786
1780
  - !ruby/object:Gem::Version
1787
1781
  version: '0'
1788
1782
  requirements: []
1789
- rubygems_version: 3.0.3
1783
+ rubygems_version: 3.0.6
1790
1784
  signing_key:
1791
1785
  specification_version: 4
1792
1786
  summary: The easiest way to automate beta deployments and releases for your iOS and