-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
archive.js
110 lines (95 loc) · 4.31 KB
/
archive.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// TODO(chalin): package archive.js as its own top-level js so that it can be loaded independently
// Number of releases to show by default (rest will be behind a "show all" link).
var releasesToShow = 99999;
// Fetches Flutter release JSON for the given OS and calls the callback once the data is available.
var fetchFlutterReleases = function (os, callback, errorCallback) {
// OS: windows, macos, linux
var url = "https://storage.googleapis.com/flutter_infra_release/releases/releases_" + os + ".json";
$.ajax({
type: "GET",
url: url,
dataType: "json",
success: function (data) { callback(data, os); },
error: function (xhr, textStatus, errorThrown) {
if (errorCallback) errorCallback(os);
}
})
}
function updateTable(releases, os) {
var releaseData = releases.releases;
for (var channel in releases.current_release) {
var table = $("#downloads-" + os + "-" + channel);
table.addClass("collapsed").find(".loading").remove();
var releasesForChannel = releaseData.filter(function (release) {
return release.channel == channel;
});
releasesForChannel.forEach(function (release, index) {
// If this is the first row after the cut-off, insert the "Show more..." link.
if (index === releasesToShow) {
var showAll = $("<a />").text("Show all...").attr("href", "#").click(function (event) {
$(this).closest("table").removeClass("collapsed");
$(this).closest("tr").remove();
event.preventDefault();
});
$("<tr>").append($("<td colspan=\"3\"></td></tr>").append(showAll)).appendTo(table);
}
var className = index >= releasesToShow ? "overflow" : "";
var url = releases.base_url + "/" + release.archive;
var row = $("<tr />").addClass(className).appendTo(table);
var hashLabel = $("<span />").text(release.hash.substr(0, 7)).addClass("git-hash");
var downloadLink = $("<a />").attr("href", url).text(release.version);
var date = new Date(Date.parse(release.release_date));
$("<td />").append(downloadLink).appendTo(row);
$("<td />").append(hashLabel).appendTo(row);
$("<td />").addClass("date").text(date.toLocaleDateString()).appendTo(row);
});
}
}
function updateTableFailed(os) {
var tab = $("#tab-os-" + os);
tab.find(".loading").text("Failed to load releases. Refresh page to try again.");
}
function updateDownloadLink(releases, os) {
var channel = "stable";
var releasesForChannel = releases.releases.filter(function (release) {
return release.channel == channel;
});
if (!releasesForChannel.length)
return;
var release = releasesForChannel[0];
var linkSegments = release.archive.split("/");
var archiveFilename = linkSegments[linkSegments.length - 1]; // Just the filename part of url
var downloadLink = $(".download-latest-link-" + os);
downloadLink
.text(archiveFilename)
.attr("href", releases.base_url + "/" + release.archive);
// Update download-filename placeholders:
$(".download-latest-link-filename-" + os).text(archiveFilename);
$(".download-latest-link-filename").text(archiveFilename);
// Update inlined filenames in <code> element text nodes:
var fileNamePrefix = 'flutter_';
var code = $('code:contains("' + fileNamePrefix + '")');
var textNode = $(code).contents().filter(function() {
return this.nodeType == 3 && this.textContent.includes(fileNamePrefix);
});
var text = $(textNode).text();
var newText = text.replace(new RegExp('^(.*?)\\b' + fileNamePrefix + '\\w+_v.*'), '$1' + archiveFilename);
$(textNode).replaceWith(newText);
}
function updateDownloadLinkFailed(os) {
$(".download-latest-link-" + os).text("(failed)");
}
// Send requests to render the tables.
$(function () {
if ($("#sdk-archives").length) {
fetchFlutterReleases("windows", updateTable, updateTableFailed);
fetchFlutterReleases("macos", updateTable, updateTableFailed);
fetchFlutterReleases("linux", updateTable, updateTableFailed);
}
if ($(".download-latest-link-windows").length)
fetchFlutterReleases("windows", updateDownloadLink, updateDownloadLinkFailed);
if ($(".download-latest-link-macos").length)
fetchFlutterReleases("macos", updateDownloadLink, updateDownloadLinkFailed);
if ($(".download-latest-link-linux").length)
fetchFlutterReleases("linux", updateDownloadLink, updateDownloadLinkFailed);
});