blob: 8b31144e38453b9f351f60cef1e0d5ee0ce3a6ae [file]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'dart:io';
Future<Map<String, dynamic>?> getJson(String url) async {
final client = HttpClient();
try {
final request = await client.getUrl(Uri.parse(url));
final response = await request.close();
if (response.statusCode == 200) {
final content = await response.transform(utf8.decoder).join();
final dynamic decoded = json.decode(content);
if (decoded is Map<String, dynamic>) {
return decoded;
}
}
} catch (e) {
stderr.writeln('Error fetching data from $url: $e');
} finally {
client.close();
}
return null;
}
Future<String?> fetchChromeLatest() async {
final data = await getJson(
'https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions.json',
);
if (data case {'channels': {'Stable': {'version': String version}}}) {
return version;
}
return null;
}
Future<String?> fetchFirefoxLatest() async {
final data = await getJson('https://product-details.mozilla.org/1.0/firefox_versions.json');
if (data case {'LATEST_FIREFOX_VERSION': String version}) {
return version;
}
return null;
}
Future<bool> verifyChromeVersion(String version) async {
final data = await getJson(
'https://googlechromelabs.github.io/chrome-for-testing/known-good-versions.json',
);
if (data case {'versions': List versions}) {
return versions.any((v) => v is Map && v['version'] == version);
}
return false;
}
Future<bool> verifyFirefoxVersion(String version) async {
final majorReleases = await getJson(
'https://product-details.mozilla.org/1.0/firefox_history_major_releases.json',
);
if (majorReleases != null && majorReleases.keys.contains(version)) {
return true;
}
final stabilityReleases = await getJson(
'https://product-details.mozilla.org/1.0/firefox_history_stability_releases.json',
);
if (stabilityReleases != null && stabilityReleases.keys.contains(version)) {
return true;
}
return false;
}
void main(List<String> args) async {
if (args.isEmpty) {
print('Usage:');
print(' dart fetch_versions.dart latest <chrome|firefox>');
print(' dart fetch_versions.dart verify <chrome|firefox> <version>');
exit(1);
}
final cmd = args[0].toLowerCase();
if (cmd == 'latest') {
final target = args.length > 1 ? args[1].toLowerCase() : null;
if (target == 'chrome') {
print(await fetchChromeLatest());
} else if (target == 'firefox') {
print(await fetchFirefoxLatest());
} else {
final versions = {'chrome': await fetchChromeLatest(), 'firefox': await fetchFirefoxLatest()};
print(json.encode(versions));
}
} else if (cmd == 'verify') {
if (args.length < 3) {
print('Error: Missing version to verify.');
exit(1);
}
final target = args[1].toLowerCase();
final version = args[2];
bool exists = false;
if (target == 'chrome') {
exists = await verifyChromeVersion(version);
} else if (target == 'firefox') {
exists = await verifyFirefoxVersion(version);
} else {
print('Unknown target: $target');
exit(1);
}
print(exists);
} else {
print('Unknown command: $cmd');
exit(1);
}
}