fastlane 2.133.0 → 2.136.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.
- checksums.yaml +4 -4
- data/README.md +78 -78
- data/fastlane/lib/fastlane/action.rb +1 -1
- data/fastlane/lib/fastlane/actions/actions_helper.rb +1 -1
- data/fastlane/lib/fastlane/actions/carthage.rb +7 -0
- data/fastlane/lib/fastlane/actions/cocoapods.rb +24 -2
- data/fastlane/lib/fastlane/actions/deploygate.rb +1 -1
- data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +38 -4
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +1 -1
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +4 -2
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +26 -2
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +26 -3
- data/fastlane/lib/fastlane/actions/download_from_play_store.rb +1 -1
- data/fastlane/lib/fastlane/actions/get_version_number.rb +10 -4
- data/fastlane/lib/fastlane/actions/google_play_track_version_codes.rb +5 -1
- data/fastlane/lib/fastlane/actions/sonar.rb +16 -0
- data/fastlane/lib/fastlane/actions/testfairy.rb +1 -1
- data/fastlane/lib/fastlane/actions/update_fastlane.rb +9 -49
- data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +94 -0
- data/fastlane/lib/fastlane/environment_printer.rb +9 -3
- data/fastlane/lib/fastlane/fast_file.rb +3 -2
- data/fastlane/lib/fastlane/lane_manager.rb +1 -1
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +12 -2
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +2 -0
- data/fastlane/lib/fastlane/runner.rb +2 -2
- data/fastlane/lib/fastlane/swift_fastlane_function.rb +9 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +124 -36
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +2 -2
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +22 -2
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +3 -3
- data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +1 -1
- data/fastlane_core/lib/fastlane_core/device_manager.rb +1 -1
- data/fastlane_core/lib/fastlane_core/swag.rb +1 -1
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +1 -1
- data/match/lib/match/importer.rb +1 -1
- data/scan/lib/scan/error_handler.rb +9 -4
- data/scan/lib/scan/runner.rb +1 -1
- data/screengrab/lib/screengrab/module.rb +2 -0
- data/screengrab/lib/screengrab/options.rb +33 -11
- data/screengrab/lib/screengrab/runner.rb +64 -24
- data/sigh/lib/assets/resign.sh +2 -2
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
- data/spaceship/lib/spaceship/client.rb +2 -2
- data/supply/lib/supply.rb +23 -0
- data/supply/lib/supply/.uploader.rb.swp +0 -0
- data/supply/lib/supply/client.rb +101 -55
- data/supply/lib/supply/options.rb +50 -14
- data/supply/lib/supply/release_listing.rb +18 -0
- data/supply/lib/supply/setup.rb +42 -34
- data/supply/lib/supply/uploader.rb +191 -93
- metadata +32 -37
- data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/gym/lib/gym/.runner.rb.swp +0 -0
- data/pilot/lib/pilot/.manager.rb.swp +0 -0
- data/spaceship/lib/spaceship/connect_api/.DS_Store +0 -0
- data/spaceship/lib/spaceship/portal/.certificate.rb.swp +0 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
module Supply
|
2
|
+
class ReleaseListing
|
3
|
+
attr_accessor :track
|
4
|
+
attr_accessor :version
|
5
|
+
attr_accessor :versioncodes
|
6
|
+
attr_accessor :language
|
7
|
+
attr_accessor :release_notes
|
8
|
+
|
9
|
+
# Initializes the release listing with the current listing if available
|
10
|
+
def initialize(track, version, versioncodes, language, text)
|
11
|
+
self.track = track
|
12
|
+
self.version = version
|
13
|
+
self.versioncodes = versioncodes
|
14
|
+
self.language = language
|
15
|
+
self.release_notes = text
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/supply/lib/supply/setup.rb
CHANGED
@@ -12,16 +12,22 @@ module Supply
|
|
12
12
|
|
13
13
|
client.listings.each do |listing|
|
14
14
|
store_metadata(listing)
|
15
|
-
create_screenshots_folder(listing)
|
16
15
|
download_images(listing)
|
17
16
|
end
|
18
17
|
|
19
|
-
|
20
|
-
client.
|
21
|
-
|
18
|
+
if Supply.config[:version_name].to_s == ""
|
19
|
+
latest_version = client.latest_version(Supply.config[:track])
|
20
|
+
if latest_version
|
21
|
+
Supply.config[:version_name] = latest_version.name
|
22
|
+
else
|
23
|
+
UI.user_error!("Could not find the latest version to download metadata, images, and screenshots from")
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
27
|
+
client.release_listings(Supply.config[:version_name]).each do |release_listing|
|
28
|
+
store_release_listing(release_listing)
|
29
|
+
end
|
30
|
+
|
25
31
|
client.abort_current_edit
|
26
32
|
|
27
33
|
UI.success("✅ Successfully stored metadata in '#{metadata_path}'")
|
@@ -43,25 +49,40 @@ module Supply
|
|
43
49
|
def download_images(listing)
|
44
50
|
UI.message("🖼️ Downloading images (#{listing.language})")
|
45
51
|
|
46
|
-
# We cannot download existing screenshots as they are compressed
|
47
|
-
# But we can at least download the images
|
48
52
|
require 'net/http'
|
49
53
|
|
50
|
-
IMAGES_TYPES.
|
51
|
-
if ['featureGraphic'].include?(image_type)
|
52
|
-
# we don't get all files in full resolution :(
|
53
|
-
UI.message("📵 Due to a limitation of the Google Play API, there is no way for `supply` to download your existing feature graphic. Please copy your feature graphic to `metadata/android/#{listing.language}/images/featureGraphic.png`")
|
54
|
-
next
|
55
|
-
end
|
54
|
+
allowed_imagetypes = [Supply::IMAGES_TYPES, Supply::SCREENSHOT_TYPES].flatten
|
56
55
|
|
56
|
+
allowed_imagetypes.each do |image_type|
|
57
57
|
begin
|
58
|
+
path = File.join(metadata_path, listing.language, IMAGES_FOLDER_NAME, image_type)
|
59
|
+
|
60
|
+
p = Pathname.new(path)
|
61
|
+
if IMAGES_TYPES.include?(image_type) # IMAGE_TYPES are stored in locale/images location
|
62
|
+
FileUtils.mkdir_p(p.dirname.to_s)
|
63
|
+
else # SCREENSHOT_TYPES go under their respective folders.
|
64
|
+
FileUtils.mkdir_p(p.to_s)
|
65
|
+
end
|
66
|
+
|
58
67
|
UI.message("Downloading `#{image_type}` for #{listing.language}...")
|
59
68
|
|
60
|
-
|
61
|
-
next
|
69
|
+
urls = client.fetch_images(image_type: image_type, language: listing.language)
|
70
|
+
next if urls.nil? || urls.empty?
|
71
|
+
|
72
|
+
image_counter = 1 # Used to prefix the downloaded files, so order is preserved.
|
73
|
+
urls.each do |url|
|
74
|
+
if IMAGES_TYPES.include?(image_type) # IMAGE_TYPES are stored in locale/images
|
75
|
+
file_path = "#{path}.#{FastImage.type(url)}"
|
76
|
+
else # SCREENSHOT_TYPES are stored in locale/images/<screensho_types>
|
77
|
+
file_path = File.join(path, "#{image_counter}_#{listing.language}.#{FastImage.type(url)}")
|
78
|
+
end
|
79
|
+
|
80
|
+
File.binwrite(file_path, Net::HTTP.get(URI.parse(url)))
|
81
|
+
|
82
|
+
UI.message("\tDownloaded - #{file_path}")
|
62
83
|
|
63
|
-
|
64
|
-
|
84
|
+
image_counter += 1
|
85
|
+
end
|
65
86
|
rescue => ex
|
66
87
|
UI.error(ex.to_s)
|
67
88
|
UI.error("Error downloading '#{image_type}' for #{listing.language}...")
|
@@ -69,30 +90,17 @@ module Supply
|
|
69
90
|
end
|
70
91
|
end
|
71
92
|
|
72
|
-
def
|
73
|
-
UI.message("
|
74
|
-
|
75
|
-
containing = File.join(metadata_path, listing.language)
|
76
|
-
|
77
|
-
FileUtils.mkdir_p(File.join(containing, IMAGES_FOLDER_NAME))
|
78
|
-
Supply::SCREENSHOT_TYPES.each do |screenshot_type|
|
79
|
-
FileUtils.mkdir_p(File.join(containing, IMAGES_FOLDER_NAME, screenshot_type))
|
80
|
-
end
|
81
|
-
|
82
|
-
UI.message("📵 Due to a limitation of the Google Play API, there is no way for `supply` to download your existing screenshots. Please copy your screenshots into `metadata/android/#{listing.language}/images/`")
|
83
|
-
end
|
84
|
-
|
85
|
-
def store_apk_listing(apk_listing)
|
86
|
-
UI.message("🔨 Downloading changelogs (#{apk_listing.language}, #{apk_listing.apk_version_code})")
|
93
|
+
def store_release_listing(release_listing)
|
94
|
+
UI.message("🔨 Downloading changelogs (#{release_listing.language}, #{release_listing.version})")
|
87
95
|
|
88
|
-
containing = File.join(metadata_path,
|
96
|
+
containing = File.join(metadata_path, release_listing.language, CHANGELOGS_FOLDER_NAME)
|
89
97
|
unless File.exist?(containing)
|
90
98
|
FileUtils.mkdir_p(containing)
|
91
99
|
end
|
92
100
|
|
93
|
-
path = File.join(containing, "#{
|
101
|
+
path = File.join(containing, "#{release_listing.version}.txt")
|
94
102
|
UI.message("Writing to #{path}...")
|
95
|
-
File.write(path,
|
103
|
+
File.write(path, release_listing.release_notes)
|
96
104
|
end
|
97
105
|
|
98
106
|
private
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module Supply
|
2
|
+
# rubocop:disable Metrics/ClassLength
|
2
3
|
class Uploader
|
3
4
|
def perform_upload
|
4
5
|
FastlaneCore::PrintTable.print_values(config: Supply.config, hide_keys: [:issuer], mask_keys: [:json_key_data], title: "Summary for supply #{Fastlane::VERSION}")
|
@@ -7,22 +8,6 @@ module Supply
|
|
7
8
|
|
8
9
|
verify_config!
|
9
10
|
|
10
|
-
if metadata_path
|
11
|
-
UI.user_error!("Could not find folder #{metadata_path}") unless File.directory?(metadata_path)
|
12
|
-
|
13
|
-
all_languages.each do |language|
|
14
|
-
next if language.start_with?('.') # e.g. . or .. or hidden folders
|
15
|
-
UI.message("Preparing to upload for language '#{language}'...")
|
16
|
-
|
17
|
-
listing = client.listing_for_language(language)
|
18
|
-
|
19
|
-
upload_metadata(language, listing) unless Supply.config[:skip_upload_metadata]
|
20
|
-
upload_images(language) unless Supply.config[:skip_upload_images]
|
21
|
-
upload_screenshots(language) unless Supply.config[:skip_upload_screenshots]
|
22
|
-
upload_changelogs(language) unless Supply.config[:skip_upload_metadata]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
11
|
apk_version_codes = []
|
27
12
|
apk_version_codes.concat(upload_apks) unless Supply.config[:skip_upload_apk]
|
28
13
|
apk_version_codes.concat(upload_bundles) unless Supply.config[:skip_upload_aab]
|
@@ -34,19 +19,110 @@ module Supply
|
|
34
19
|
# Updating a track with empty version codes can completely clear out a track
|
35
20
|
update_track(apk_version_codes) unless apk_version_codes.empty?
|
36
21
|
|
37
|
-
|
22
|
+
if Supply.config[:track_promote_to]
|
23
|
+
promote_track
|
24
|
+
elsif !Supply.config[:rollout].nil? && Supply.config[:track].to_s != ""
|
25
|
+
update_rollout
|
26
|
+
end
|
27
|
+
|
28
|
+
if Supply.config[:validate_only]
|
29
|
+
UI.message("Validating all track and release changes with Google Play...")
|
30
|
+
client.validate_current_edit!
|
31
|
+
UI.success("Successfully validated the upload to Google Play")
|
32
|
+
else
|
33
|
+
UI.message("Uploading all track and release changes to Google Play...")
|
34
|
+
client.commit_current_edit!
|
35
|
+
UI.success("Successfully finished the upload to Google Play")
|
36
|
+
end
|
37
|
+
|
38
|
+
perform_upload_meta(apk_version_codes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def perform_upload_meta(version_codes)
|
42
|
+
client.begin_edit(package_name: Supply.config[:package_name])
|
43
|
+
|
44
|
+
if (!Supply.config[:skip_upload_metadata] || !Supply.config[:skip_upload_images] || !Supply.config[:skip_upload_changelogs] || !Supply.config[:skip_upload_screenshots]) && metadata_path
|
45
|
+
# Use version code from config if version codes is empty and no nil or empty string
|
46
|
+
version_codes = [Supply.config[:version_code]] if version_codes.empty?
|
47
|
+
version_codes = version_codes.reject do |version_code|
|
48
|
+
version_codes.to_s == ""
|
49
|
+
end
|
50
|
+
|
51
|
+
version_codes.each do |version_code|
|
52
|
+
UI.user_error!("Could not find folder #{metadata_path}") unless File.directory?(metadata_path)
|
53
|
+
|
54
|
+
track, release = fetch_track_and_release!(Supply.config[:track], version_code)
|
55
|
+
UI.user_error!("Unable to find the requested track - '#{Supply.config[:track]}'") unless track
|
56
|
+
UI.user_error!("Could not find release for version code '#{version_code}' to update changelog") unless release
|
57
|
+
|
58
|
+
release_notes = []
|
59
|
+
all_languages.each do |language|
|
60
|
+
next if language.start_with?('.') # e.g. . or .. or hidden folders
|
61
|
+
UI.message("Preparing to upload for language '#{language}'...")
|
62
|
+
|
63
|
+
listing = client.listing_for_language(language)
|
64
|
+
|
65
|
+
upload_metadata(language, listing) unless Supply.config[:skip_upload_metadata]
|
66
|
+
upload_images(language) unless Supply.config[:skip_upload_images]
|
67
|
+
upload_screenshots(language) unless Supply.config[:skip_upload_screenshots]
|
68
|
+
release_notes << upload_changelog(language, version_code) unless Supply.config[:skip_upload_changelogs]
|
69
|
+
end
|
70
|
+
|
71
|
+
upload_changelogs(release_notes, release, track) unless release_notes.empty?
|
72
|
+
end
|
73
|
+
end
|
38
74
|
|
39
75
|
if Supply.config[:validate_only]
|
40
|
-
UI.message("Validating all changes with Google Play...")
|
76
|
+
UI.message("Validating all meta changes with Google Play...")
|
41
77
|
client.validate_current_edit!
|
42
78
|
UI.success("Successfully validated the upload to Google Play")
|
43
79
|
else
|
44
|
-
UI.message("Uploading all changes to Google Play...")
|
80
|
+
UI.message("Uploading all meta changes to Google Play...")
|
45
81
|
client.commit_current_edit!
|
46
82
|
UI.success("Successfully finished the upload to Google Play")
|
47
83
|
end
|
48
84
|
end
|
49
85
|
|
86
|
+
def fetch_track_and_release!(track, version_code, status = nil)
|
87
|
+
tracks = client.tracks(track)
|
88
|
+
return nil, nil if tracks.empty?
|
89
|
+
|
90
|
+
track = tracks.first
|
91
|
+
releases = track.releases
|
92
|
+
|
93
|
+
releases = releases.select { |r| r.status == status } if status
|
94
|
+
releases = releases.select { |r| r.version_codes.map(&:to_s).include?(version_code.to_s) } if version_code
|
95
|
+
|
96
|
+
if releases.size > 1
|
97
|
+
UI.user_error!("More than one release found in this track. Please specify with the :version_code option to select a release.")
|
98
|
+
end
|
99
|
+
|
100
|
+
return track, releases.first
|
101
|
+
end
|
102
|
+
|
103
|
+
def update_rollout
|
104
|
+
track, release = fetch_track_and_release!(Supply.config[:track], Supply.config[:version_code], Supply::ReleaseStatus::IN_PROGRESS)
|
105
|
+
UI.user_error!("Unable to find the requested track - '#{Supply.config[:track]}'") unless track
|
106
|
+
UI.user_error!("Unable to find the requested release on track - '#{Supply.config[:track]}'") unless release
|
107
|
+
|
108
|
+
version_code = release.version_codes.first
|
109
|
+
|
110
|
+
UI.message("Updating #{version_code}'s rollout to '#{Supply.config[:rollout]}' on track '#{Supply.config[:track]}'...")
|
111
|
+
|
112
|
+
if track && release
|
113
|
+
completed = Supply.config[:rollout].to_f == 1
|
114
|
+
release.user_fraction = completed ? nil : Supply.config[:rollout]
|
115
|
+
release.status = Supply::ReleaseStatus::COMPLETED if completed
|
116
|
+
|
117
|
+
# Deleted other version codes if completed because only allowed on completed version in a release
|
118
|
+
track.releases.delete_if { |r| !(r.version_codes || []).map(&:to_s).include?(version_code) } if completed
|
119
|
+
else
|
120
|
+
UI.user_error!("Unable to find version to rollout in track '#{Supply.config[:track]}'")
|
121
|
+
end
|
122
|
+
|
123
|
+
client.update_track(Supply.config[:track], track)
|
124
|
+
end
|
125
|
+
|
50
126
|
def verify_config!
|
51
127
|
unless metadata_path || Supply.config[:apk] || Supply.config[:apk_paths] || Supply.config[:aab] || Supply.config[:aab_paths] || (Supply.config[:track] && Supply.config[:track_promote_to])
|
52
128
|
UI.user_error!("No local metadata, apks, aab, or track to promote were found, make sure to run `fastlane supply init` to setup supply")
|
@@ -60,32 +136,85 @@ module Supply
|
|
60
136
|
if could_upload_apk && could_upload_aab
|
61
137
|
UI.user_error!("Cannot provide both apk(s) and aab - use `skip_upload_apk`, `skip_upload_aab`, or make sure to remove any existing .apk or .aab files that are no longer needed")
|
62
138
|
end
|
139
|
+
|
140
|
+
if Supply.config[:release_status] == Supply::ReleaseStatus::DRAFT && Supply.config[:rollout]
|
141
|
+
UI.user_error!(%(Cannot specify rollout percentage when the release status is set to 'draft'))
|
142
|
+
end
|
143
|
+
|
144
|
+
unless Supply.config[:version_codes_to_retain].nil?
|
145
|
+
Supply.config[:version_codes_to_retain] = Supply.config[:version_codes_to_retain].map(&:to_i)
|
146
|
+
end
|
63
147
|
end
|
64
148
|
|
65
149
|
def promote_track
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
client.update_track(Supply.config[:track_promote_to], Supply.config[:rollout] || 0.1, version_codes)
|
71
|
-
end
|
150
|
+
track_from = client.tracks(Supply.config[:track]).first
|
151
|
+
unless track_from
|
152
|
+
UI.user_error!("Cannot promote from track '#{Supply.config[:track]}' - track doesn't exist")
|
153
|
+
end
|
72
154
|
|
73
|
-
|
74
|
-
|
75
|
-
|
155
|
+
releases = track_from.releases
|
156
|
+
if Supply.config[:version_code].to_s != ""
|
157
|
+
releases = releases.select do |release|
|
158
|
+
release.version_codes.include?(Supply.config[:version_code].to_s)
|
159
|
+
end
|
160
|
+
else
|
161
|
+
releases = releases.select do |release|
|
162
|
+
release.status == Supply::ReleaseStatus::COMPLETED
|
163
|
+
end
|
76
164
|
end
|
77
|
-
|
78
|
-
|
165
|
+
|
166
|
+
if releases.size == 0
|
167
|
+
UI.user_error!("Track '#{Supply.config[:track]}' doesn't have any releases")
|
168
|
+
elsif releases.size > 1
|
169
|
+
UI.user_error!("Track '#{Supply.config[:track]}' has more than one release - use :version_code to filter the release to promote")
|
170
|
+
end
|
171
|
+
|
172
|
+
release = releases.first
|
173
|
+
track_to = client.tracks(Supply.config[:track_promote_to]).first
|
174
|
+
|
175
|
+
if Supply.config[:rollout]
|
176
|
+
release.status = Supply::ReleaseStatus::IN_PROGRESS
|
177
|
+
release.user_fraction = Supply.config[:rollout]
|
178
|
+
else
|
179
|
+
release.status = Supply::ReleaseStatus::COMPLETED
|
180
|
+
release.user_fraction = nil
|
79
181
|
end
|
182
|
+
|
183
|
+
if track_to
|
184
|
+
# Its okay to set releases to an array containing the newest release
|
185
|
+
# Google Play will keep previous releases there this release is a partial rollout
|
186
|
+
track_to.releases = [release]
|
187
|
+
else
|
188
|
+
track_to = AndroidPublisher::Track.new(
|
189
|
+
track: Supply.config[:track_promote_to],
|
190
|
+
releases: [release]
|
191
|
+
)
|
192
|
+
end
|
193
|
+
|
194
|
+
client.update_track(Supply.config[:track_promote_to], track_to)
|
80
195
|
end
|
81
196
|
|
82
197
|
def upload_changelog(language, version_code)
|
83
|
-
|
198
|
+
UI.user_error!("Cannot find changelog because no version code given - please specify :version_code") unless version_code
|
199
|
+
|
200
|
+
path = File.join(Supply.config[:metadata_path], language, Supply::CHANGELOGS_FOLDER_NAME, "#{version_code}.txt")
|
201
|
+
changelog_text = ''
|
84
202
|
if File.exist?(path)
|
85
|
-
UI.message("Updating changelog for
|
86
|
-
|
87
|
-
|
203
|
+
UI.message("Updating changelog for '#{version_code}' and language '#{language}'...")
|
204
|
+
changelog_text = File.read(path, encoding: 'UTF-8')
|
205
|
+
else
|
206
|
+
UI.message("Could not find changelog for '#{version_code}' and language '#{language}' at path #{path}...")
|
88
207
|
end
|
208
|
+
|
209
|
+
AndroidPublisher::LocalizedText.new({
|
210
|
+
language: language,
|
211
|
+
text: changelog_text
|
212
|
+
})
|
213
|
+
end
|
214
|
+
|
215
|
+
def upload_changelogs(release_notes, release, track)
|
216
|
+
release.release_notes = release_notes
|
217
|
+
client.upload_changelogs(track, Supply.config[:track])
|
89
218
|
end
|
90
219
|
|
91
220
|
def upload_metadata(language, listing)
|
@@ -163,14 +292,6 @@ module Supply
|
|
163
292
|
aab_paths.each do |aab_path|
|
164
293
|
UI.message("Preparing aab at path '#{aab_path}' for upload...")
|
165
294
|
bundle_version_code = client.upload_bundle(aab_path)
|
166
|
-
|
167
|
-
if metadata_path
|
168
|
-
all_languages.each do |language|
|
169
|
-
next if language.start_with?('.') # e.g. . or .. or hidden folders
|
170
|
-
upload_changelog(language, bundle_version_code)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
295
|
aab_version_codes.push(bundle_version_code)
|
175
296
|
end
|
176
297
|
|
@@ -188,6 +309,7 @@ module Supply
|
|
188
309
|
# @return [Integer] The apk version code returned after uploading, or nil if there was a problem
|
189
310
|
def upload_binary_data(apk_path)
|
190
311
|
apk_version_code = nil
|
312
|
+
|
191
313
|
if apk_path
|
192
314
|
UI.message("Preparing apk at path '#{apk_path}' for upload...")
|
193
315
|
apk_version_code = client.upload_apk(apk_path)
|
@@ -208,16 +330,11 @@ module Supply
|
|
208
330
|
end
|
209
331
|
|
210
332
|
upload_obbs(apk_path, apk_version_code)
|
211
|
-
|
212
|
-
if metadata_path
|
213
|
-
all_languages.each do |language|
|
214
|
-
next if language.start_with?('.') # e.g. . or .. or hidden folders
|
215
|
-
upload_changelog(language, apk_version_code)
|
216
|
-
end
|
217
|
-
end
|
218
333
|
else
|
219
334
|
UI.message("No apk file found, you can pass the path to your apk using the `apk` option")
|
220
335
|
end
|
336
|
+
|
337
|
+
UI.message("\tVersion Code: #{apk_version_code}")
|
221
338
|
apk_version_code
|
222
339
|
end
|
223
340
|
|
@@ -230,55 +347,35 @@ module Supply
|
|
230
347
|
end
|
231
348
|
|
232
349
|
def update_track(apk_version_codes)
|
233
|
-
|
234
|
-
check_superseded_tracks(apk_version_codes) if Supply.config[:check_superseded_tracks]
|
350
|
+
return if apk_version_codes.empty?
|
235
351
|
|
236
|
-
|
237
|
-
client.update_track(Supply.config[:track], Supply.config[:rollout] || 0.1, apk_version_codes)
|
238
|
-
else
|
239
|
-
client.update_track(Supply.config[:track], 1.0, apk_version_codes)
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
# Remove any version codes that is:
|
244
|
-
# - Lesser than the greatest of any later (i.e. production) track
|
245
|
-
# - Or lesser than the currently being uploaded if it's in an earlier (i.e. alpha) track
|
246
|
-
def check_superseded_tracks(apk_version_codes)
|
247
|
-
UI.message("Checking superseded tracks, uploading '#{apk_version_codes}' to '#{Supply.config[:track]}'...")
|
248
|
-
max_apk_version_code = apk_version_codes.max
|
249
|
-
max_tracks_version_code = nil
|
250
|
-
|
251
|
-
tracks = ["production", "rollout", "beta", "alpha", "internal"]
|
252
|
-
config_track_index = tracks.index(Supply.config[:track])
|
253
|
-
|
254
|
-
# Custom "closed" tracks are now allowed (https://support.google.com/googleplay/android-developer/answer/3131213)
|
255
|
-
# Custom tracks have an equal level with alpha (alpha is considered a closed track as well)
|
256
|
-
# If a track index is not found, we will assume is a custom track so an alpha index is given
|
257
|
-
config_track_index = tracks.index("alpha") unless config_track_index
|
258
|
-
|
259
|
-
tracks.each_index do |track_index|
|
260
|
-
track = tracks[track_index]
|
261
|
-
track_version_codes = client.track_version_codes(track).sort
|
262
|
-
UI.verbose("Found '#{track_version_codes}' on track '#{track}'")
|
263
|
-
|
264
|
-
next if track_index.eql?(config_track_index)
|
265
|
-
next if track_version_codes.empty?
|
266
|
-
|
267
|
-
if max_tracks_version_code.nil?
|
268
|
-
max_tracks_version_code = track_version_codes.max
|
269
|
-
end
|
352
|
+
UI.message("Updating track '#{Supply.config[:track]}'...")
|
270
353
|
|
271
|
-
|
272
|
-
|
273
|
-
|
354
|
+
track_release = AndroidPublisher::TrackRelease.new(
|
355
|
+
name: Supply.config[:version_name],
|
356
|
+
status: Supply.config[:release_status],
|
357
|
+
version_codes: apk_version_codes
|
358
|
+
)
|
274
359
|
|
275
|
-
|
360
|
+
if Supply.config[:rollout]
|
361
|
+
track_release.status = Supply::ReleaseStatus::IN_PROGRESS
|
362
|
+
track_release.user_fraction = Supply.config[:rollout].to_f
|
363
|
+
end
|
276
364
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
365
|
+
tracks = client.tracks(Supply.config[:track])
|
366
|
+
track = tracks.first
|
367
|
+
if track
|
368
|
+
# Its okay to set releases to an array containing the newest release
|
369
|
+
# Google Play will keep previous releases there this release is a partial rollout
|
370
|
+
track.releases = [track_release]
|
371
|
+
else
|
372
|
+
track = AndroidPublisher::Track.new(
|
373
|
+
track: Supply.config[:track],
|
374
|
+
releases: [track_release]
|
375
|
+
)
|
281
376
|
end
|
377
|
+
|
378
|
+
client.update_track(Supply.config[:track], track)
|
282
379
|
end
|
283
380
|
|
284
381
|
# returns only language directories from metadata_path
|
@@ -346,4 +443,5 @@ module Supply
|
|
346
443
|
end
|
347
444
|
end
|
348
445
|
end
|
446
|
+
# rubocop:enable Metrics/ClassLength
|
349
447
|
end
|