downloads: handle multi-page results from Azure (#19138)
This commit is contained in:
parent
680f715585
commit
02c039f102
|
@ -305,224 +305,239 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$.ajax({
|
// Create the blob retriever that iterates over all the pages of the blobstore.
|
||||||
url: 'https://gethstore.blob.core.windows.net/builds?restype=container&comp=list',
|
var blobs = [];
|
||||||
error: function() {
|
var retrieveBlobs = function(marker, finished) {
|
||||||
alert("Failed to load releases!");
|
// Generate the blob listing URL and request it from Azure
|
||||||
},
|
var url = 'https://gethstore.blob.core.windows.net/builds?restype=container&comp=list&maxresults=5000&prefix=geth-';
|
||||||
dataType: 'xml',
|
if (marker != "") {
|
||||||
success: function(data) {
|
url += "&marker=" + marker;
|
||||||
// Define the release tables
|
}
|
||||||
var releases = {
|
$.ajax({
|
||||||
stable: [],
|
url: url,
|
||||||
develop: [],
|
type: 'GET',
|
||||||
cross: []
|
error: function() {
|
||||||
};
|
alert("Failed to load releases!");
|
||||||
var signatures = {};
|
},
|
||||||
|
dataType: 'xml',
|
||||||
|
success: function(data) {
|
||||||
|
// List of blobs retrieved, acumulate them first of all
|
||||||
|
Array.prototype.push.apply(blobs, $(data).find('Blob'));
|
||||||
|
|
||||||
// Iterate over all the blobs and populate the tables
|
// If there are more pages, load them all
|
||||||
var blobs = $(data).find('Blob')
|
marker = $($(data).find('NextMarker')[0]).text();
|
||||||
for (var i = 0; i < blobs.length; i++) {
|
if (marker != "") {
|
||||||
// Gather all available resources to later inspection
|
retrieveBlobs(marker, finished);
|
||||||
var name = $($(blobs[i]).find('Name')[0]).text();
|
|
||||||
resources[name] = true;
|
|
||||||
|
|
||||||
// Skip any signatures, those are assumed implicitly
|
|
||||||
if (name.endsWith(".asc")) {
|
|
||||||
signatures[name] = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip any blobs that do not start with "geth"
|
|
||||||
if (!name.startsWith("geth")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise add an entry to one of the release tables
|
|
||||||
var parts = name.split("-");
|
|
||||||
var date = parts[parts.length-1].split(".")[0];
|
|
||||||
if (date.length != 14) {
|
|
||||||
date = parts[parts.length-2];
|
|
||||||
}
|
|
||||||
if (date.length != 14) {
|
|
||||||
date = new Date($($(blobs[i]).find('Last-Modified')[0]).text());
|
|
||||||
} else {
|
} else {
|
||||||
date = moment(date, "YYYYMMDDhhmmss").toDate();
|
finished(blobs);
|
||||||
}
|
|
||||||
var size = $($(blobs[i]).find('Content-Length')[0]).text();
|
|
||||||
|
|
||||||
var sum = window.atob($($(blobs[i]).find('Content-MD5')[0]).text());
|
|
||||||
sum = sum.split('').map(function (char) { return ('0' + char.charCodeAt(0).toString(16)).slice(-2); }).join('');
|
|
||||||
|
|
||||||
var parts = name.split("-");
|
|
||||||
var commit = parts[parts.length - 1].split(".")[0];
|
|
||||||
|
|
||||||
if (name.includes("unstable")) {
|
|
||||||
releases.develop.push({name: name, commit: commit, date: date, size: size, sum: sum});
|
|
||||||
} else {
|
|
||||||
releases.stable.push({name: name, commit: commit, date: date, size: size, sum: sum});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Generate the actual release HTML tables
|
});
|
||||||
var groups = ["stable", "develop"];
|
}
|
||||||
var oses = ["android", "ios", "linux", "darwin", "windows"];
|
// Start retrieving the release blobs and populate the page on success
|
||||||
|
retrieveBlobs("", function() {
|
||||||
|
// Define the release tables
|
||||||
|
var releases = {
|
||||||
|
stable: [],
|
||||||
|
develop: [],
|
||||||
|
cross: []
|
||||||
|
};
|
||||||
|
var signatures = {};
|
||||||
|
|
||||||
for (var i = 0; i < groups.length; i++) {
|
// Iterate over all the blobs and populate the tables
|
||||||
// Fetch and sort the releases in the given group
|
for (var i = 0; i < blobs.length; i++) {
|
||||||
var group = groups[i];
|
// Gather all available resources to later inspection
|
||||||
|
var name = $($(blobs[i]).find('Name')[0]).text();
|
||||||
|
resources[name] = true;
|
||||||
|
|
||||||
var bins = releases[group];
|
// Skip any signatures, those are assumed implicitly
|
||||||
bins.sort(function compare(a,b) { return b.date - a.date; });
|
if (name.endsWith(".asc")) {
|
||||||
|
signatures[name] = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Otherwise add an entry to one of the release tables
|
||||||
|
var parts = name.split("-");
|
||||||
|
var date = parts[parts.length-1].split(".")[0];
|
||||||
|
if (date.length != 14) {
|
||||||
|
date = parts[parts.length-2];
|
||||||
|
}
|
||||||
|
if (date.length != 14) {
|
||||||
|
date = new Date($($(blobs[i]).find('Last-Modified')[0]).text());
|
||||||
|
} else {
|
||||||
|
date = moment(date, "YYYYMMDDhhmmss").toDate();
|
||||||
|
}
|
||||||
|
var size = $($(blobs[i]).find('Content-Length')[0]).text();
|
||||||
|
|
||||||
// Split up the releases into different OSes
|
var sum = window.atob($($(blobs[i]).find('Content-MD5')[0]).text());
|
||||||
for (var j = 0; j < oses.length; j++) {
|
sum = sum.split('').map(function (char) { return ('0' + char.charCodeAt(0).toString(16)).slice(-2); }).join('');
|
||||||
var os = oses[j];
|
|
||||||
|
|
||||||
// Gather all the releases belonging to this group and operating system, split by version
|
var parts = name.split("-");
|
||||||
var versions = [];
|
var commit = parts[parts.length - 1].split(".")[0];
|
||||||
|
|
||||||
for (var k = 0; k < bins.length; k++) {
|
if (name.includes("unstable")) {
|
||||||
if (bins[k].name.includes(os)) {
|
releases.develop.push({name: name, commit: commit, date: date, size: size, sum: sum});
|
||||||
var parts = bins[k].name.split("-").slice(1);
|
} else {
|
||||||
|
releases.stable.push({name: name, commit: commit, date: date, size: size, sum: sum});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Generate the actual release HTML tables
|
||||||
|
var groups = ["stable", "develop"];
|
||||||
|
var oses = ["android", "ios", "linux", "darwin", "windows"];
|
||||||
|
|
||||||
// Assemble the name of the download with the version string
|
for (var i = 0; i < groups.length; i++) {
|
||||||
var name = "Geth ";
|
// Fetch and sort the releases in the given group
|
||||||
if (parts[0] == "alltools") {
|
var group = groups[i];
|
||||||
name += "& Tools ";
|
|
||||||
parts = parts.slice(1);
|
|
||||||
}
|
|
||||||
name += parts[2];
|
|
||||||
|
|
||||||
// Extract a user friendly archive type
|
var bins = releases[group];
|
||||||
var kind = "Archive";
|
bins.sort(function compare(a,b) { return b.date - a.date; });
|
||||||
if (os == "android" || os == "ios") {
|
|
||||||
kind = "Library";
|
|
||||||
} else if (os == "windows" && bins[k].name.split('.').pop() == "exe") {
|
|
||||||
kind = "Installer";
|
|
||||||
}
|
|
||||||
// Extract the architecture and make it user friendly
|
|
||||||
var arch = parts[1];
|
|
||||||
switch (arch) {
|
|
||||||
case "386":
|
|
||||||
arch = "32-bit";
|
|
||||||
break;
|
|
||||||
case "amd64":
|
|
||||||
arch = "64-bit";
|
|
||||||
break;
|
|
||||||
case "arm5":
|
|
||||||
arch = "ARMv5";
|
|
||||||
break;
|
|
||||||
case "arm6":
|
|
||||||
arch = "ARMv6";
|
|
||||||
break;
|
|
||||||
case "arm7":
|
|
||||||
arch = "ARMv7";
|
|
||||||
break;
|
|
||||||
case "arm64":
|
|
||||||
arch = "ARM64";
|
|
||||||
break;
|
|
||||||
case "mips":
|
|
||||||
arch = "MIPS32";
|
|
||||||
break;
|
|
||||||
case "mipsle":
|
|
||||||
arch = "MIPS32(le)";
|
|
||||||
break;
|
|
||||||
case "mips64":
|
|
||||||
arch = "MIPS64";
|
|
||||||
break;
|
|
||||||
case "mips64le":
|
|
||||||
arch = "MIPS64(le)";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var primary = (os == "android" && arch == "all") || (os == "ios" && arch == "all") ||
|
|
||||||
(os == "linux" && arch == "64-bit") || (os == "darwin" && arch == "64-bit") || (os == "windows" && arch == "64-bit" && kind == "Installer");
|
|
||||||
|
|
||||||
// Extract the commit hash from the download name
|
// Split up the releases into different OSes
|
||||||
parts = parts.slice(3);
|
for (var j = 0; j < oses.length; j++) {
|
||||||
if (parts[0] == "unstable") {
|
var os = oses[j];
|
||||||
parts = parts.slice(1);
|
|
||||||
}
|
|
||||||
var commit = parts[0].split(".")[0];
|
|
||||||
|
|
||||||
// Figure out whether a signature is available
|
// Gather all the releases belonging to this group and operating system, split by version
|
||||||
var sig = (bins[k].name+".asc") in signatures;
|
var versions = [];
|
||||||
|
|
||||||
if (versions.length == 0 || versions[versions.length - 1].commit != commit) {
|
for (var k = 0; k < bins.length; k++) {
|
||||||
versions.push({commit: commit, bins: []});
|
if (bins[k].name.includes(os)) {
|
||||||
}
|
var parts = bins[k].name.split("-").slice(1);
|
||||||
versions[versions.length - 1].bins.push({
|
|
||||||
file: bins[k].name, date: bins[k].date, sum: bins[k].sum, size: bins[k].size,
|
// Assemble the name of the download with the version string
|
||||||
name: name, commit: commit, kind: kind, arch: arch, primary: primary, sig: sig
|
var name = "Geth ";
|
||||||
});
|
if (parts[0] == "alltools") {
|
||||||
|
name += "& Tools ";
|
||||||
|
parts = parts.slice(1);
|
||||||
}
|
}
|
||||||
}
|
name += parts[2];
|
||||||
// Look up the HTML table corresponding to the [group || os] and empty it
|
|
||||||
var table = $('#table_' + group + "_" + os);
|
|
||||||
table.empty();
|
|
||||||
|
|
||||||
$("<thead><tr>" +
|
// Extract a user friendly archive type
|
||||||
" <th class='text-center'>Release</th>" +
|
var kind = "Archive";
|
||||||
" <th class='text-center'>Commit</th>" +
|
if (os == "android" || os == "ios") {
|
||||||
" <th class='text-center'>Kind</th>" +
|
kind = "Library";
|
||||||
" <th class='text-center'>Arch</th>" +
|
} else if (os == "windows" && bins[k].name.split('.').pop() == "exe") {
|
||||||
" <th class='text-center'>Size</th>" +
|
kind = "Installer";
|
||||||
" <th class='text-center'>Published</th>" +
|
}
|
||||||
" <th class='text-center'>Signature</th>" +
|
// Extract the architecture and make it user friendly
|
||||||
" <th class='text-center'>Checksum (MD5)</th>" +
|
var arch = parts[1];
|
||||||
"</tr></thead>").appendTo(table);
|
switch (arch) {
|
||||||
var body = $("<tbody></tbody>").appendTo(table);
|
case "386":
|
||||||
|
arch = "32-bit";
|
||||||
|
break;
|
||||||
|
case "amd64":
|
||||||
|
arch = "64-bit";
|
||||||
|
break;
|
||||||
|
case "arm5":
|
||||||
|
arch = "ARMv5";
|
||||||
|
break;
|
||||||
|
case "arm6":
|
||||||
|
arch = "ARMv6";
|
||||||
|
break;
|
||||||
|
case "arm7":
|
||||||
|
arch = "ARMv7";
|
||||||
|
break;
|
||||||
|
case "arm64":
|
||||||
|
arch = "ARM64";
|
||||||
|
break;
|
||||||
|
case "mips":
|
||||||
|
arch = "MIPS32";
|
||||||
|
break;
|
||||||
|
case "mipsle":
|
||||||
|
arch = "MIPS32(le)";
|
||||||
|
break;
|
||||||
|
case "mips64":
|
||||||
|
arch = "MIPS64";
|
||||||
|
break;
|
||||||
|
case "mips64le":
|
||||||
|
arch = "MIPS64(le)";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var primary = (os == "android" && arch == "all") || (os == "ios" && arch == "all") ||
|
||||||
|
(os == "linux" && arch == "64-bit") || (os == "darwin" && arch == "64-bit") || (os == "windows" && arch == "64-bit" && kind == "Installer");
|
||||||
|
|
||||||
// Generate the contents for the HTML table
|
// Extract the commit hash from the download name
|
||||||
var collapsed = false;
|
parts = parts.slice(3);
|
||||||
var entires = 0;
|
if (parts[0] == "unstable") {
|
||||||
|
parts = parts.slice(1);
|
||||||
|
}
|
||||||
|
var commit = parts[0].split(".")[0];
|
||||||
|
|
||||||
for (var k = 0; k < versions.length; k++) {
|
// Figure out whether a signature is available
|
||||||
// Sort the downloads in the version group by name and architecture
|
var sig = (bins[k].name+".asc") in signatures;
|
||||||
var verbins = versions[k].bins;
|
|
||||||
verbins.sort(function(a, b) {
|
if (versions.length == 0 || versions[versions.length - 1].commit != commit) {
|
||||||
if (a.name < b.name) return 1;
|
versions.push({commit: commit, bins: []});
|
||||||
if (a.name > b.name) return -1;
|
}
|
||||||
if (a.arch < b.arch) return -1;
|
versions[versions.length - 1].bins.push({
|
||||||
if (a.arch > b.arch) return 1;
|
file: bins[k].name, date: bins[k].date, sum: bins[k].sum, size: bins[k].size,
|
||||||
return 0;
|
name: name, commit: commit, kind: kind, arch: arch, primary: primary, sig: sig
|
||||||
});
|
});
|
||||||
// Iterate over the binaries and display them
|
}
|
||||||
for (var l = 0; l < verbins.length; l++) {
|
}
|
||||||
// Retrieve the current archive and decide on its recentness
|
// Look up the HTML table corresponding to the [group || os] and empty it
|
||||||
var bin = verbins[l];
|
var table = $('#table_' + group + "_" + os);
|
||||||
|
table.empty();
|
||||||
|
|
||||||
// Append the archive to the download table
|
$("<thead><tr>" +
|
||||||
$("<tr style='text-align: center; " + (k == 0 && bin.primary ? " font-weight: bold;" : "") + "' class='" + (group == "develop" && k == 0 ? "latest" : "") + (k >= 2 && entires >= 10 ? " collapse out" : "") + "'>" +
|
" <th class='text-center'>Release</th>" +
|
||||||
" <td><a href='https://gethstore.blob.core.windows.net/builds/" + bin.file + "' style='text-decoration: none;'>" + bin.name + "</a></td>" +
|
" <th class='text-center'>Commit</th>" +
|
||||||
" <td><a href='https://github.com/ethereum/go-ethereum/tree/" + bin.commit + "' target='_blank' style='text-decoration: none; font-family: monospace;'>" + bin.commit + "…</a></td>" +
|
" <th class='text-center'>Kind</th>" +
|
||||||
" <td>" + bin.kind + "</td>" +
|
" <th class='text-center'>Arch</th>" +
|
||||||
" <td>" + bin.arch + "</td>" +
|
" <th class='text-center'>Size</th>" +
|
||||||
" <td>" + filesize(bin.size) + "</td>" +
|
" <th class='text-center'>Published</th>" +
|
||||||
" <td>" + moment(bin.date).calendar() + "</td>" +
|
" <th class='text-center'>Signature</th>" +
|
||||||
" <td>" + (bin.sig ? "<a href='https://gethstore.blob.core.windows.net/builds/" + bin.file + ".asc' style='text-decoration: none;'>Signature</a>" : "Unavailable") + "</td>" +
|
" <th class='text-center'>Checksum (MD5)</th>" +
|
||||||
" <td style='font-family: monospace;'>" + bin.sum + "</td>" +
|
"</tr></thead>").appendTo(table);
|
||||||
"</tr>").appendTo(body);
|
var body = $("<tbody></tbody>").appendTo(table);
|
||||||
|
|
||||||
// If we've displayed at least 3 versions and the table's getting long, collapse
|
// Generate the contents for the HTML table
|
||||||
if (k >= 2 && !collapsed && entires >= 10) {
|
var collapsed = false;
|
||||||
$("<tr style='text-align: center;'>" +
|
var entires = 0;
|
||||||
" <td colspan='8'><a class='btn btn-success btn-xs'>Show older releases</a></td>" +
|
|
||||||
"</tr>").appendTo(table);
|
for (var k = 0; k < versions.length; k++) {
|
||||||
$(table.find('.btn')).click(function(){
|
// Sort the downloads in the version group by name and architecture
|
||||||
$(this).parent().parent().toggle();
|
var verbins = versions[k].bins;
|
||||||
$(this).parent().parent().parent().find('.collapse').toggle();
|
verbins.sort(function(a, b) {
|
||||||
});
|
if (a.name < b.name) return 1;
|
||||||
collapsed = true;
|
if (a.name > b.name) return -1;
|
||||||
}
|
if (a.arch < b.arch) return -1;
|
||||||
entires++;
|
if (a.arch > b.arch) return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
// Iterate over the binaries and display them
|
||||||
|
for (var l = 0; l < verbins.length; l++) {
|
||||||
|
// Retrieve the current archive and decide on its recentness
|
||||||
|
var bin = verbins[l];
|
||||||
|
|
||||||
|
// Append the archive to the download table
|
||||||
|
$("<tr style='text-align: center; " + (k == 0 && bin.primary ? " font-weight: bold;" : "") + "' class='" + (group == "develop" && k == 0 ? "latest" : "") + (k >= 2 && entires >= 10 ? " collapse out" : "") + "'>" +
|
||||||
|
" <td><a href='https://gethstore.blob.core.windows.net/builds/" + bin.file + "' style='text-decoration: none;'>" + bin.name + "</a></td>" +
|
||||||
|
" <td><a href='https://github.com/ethereum/go-ethereum/tree/" + bin.commit + "' target='_blank' style='text-decoration: none; font-family: monospace;'>" + bin.commit + "…</a></td>" +
|
||||||
|
" <td>" + bin.kind + "</td>" +
|
||||||
|
" <td>" + bin.arch + "</td>" +
|
||||||
|
" <td>" + filesize(bin.size) + "</td>" +
|
||||||
|
" <td>" + moment(bin.date).calendar() + "</td>" +
|
||||||
|
" <td>" + (bin.sig ? "<a href='https://gethstore.blob.core.windows.net/builds/" + bin.file + ".asc' style='text-decoration: none;'>Signature</a>" : "Unavailable") + "</td>" +
|
||||||
|
" <td style='font-family: monospace;'>" + bin.sum + "</td>" +
|
||||||
|
"</tr>").appendTo(body);
|
||||||
|
|
||||||
|
// If we've displayed at least 3 versions and the table's getting long, collapse
|
||||||
|
if (k >= 2 && !collapsed && entires >= 10) {
|
||||||
|
$("<tr style='text-align: center;'>" +
|
||||||
|
" <td colspan='8'><a class='btn btn-success btn-xs'>Show older releases</a></td>" +
|
||||||
|
"</tr>").appendTo(table);
|
||||||
|
$(table.find('.btn')).click(function(){
|
||||||
|
$(this).parent().parent().toggle();
|
||||||
|
$(this).parent().parent().parent().find('.collapse').toggle();
|
||||||
|
});
|
||||||
|
collapsed = true;
|
||||||
}
|
}
|
||||||
|
entires++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Mark the request done to possibly hide the loading page
|
}
|
||||||
requestDone();
|
// Mark the request done to possibly hide the loading page
|
||||||
},
|
requestDone();
|
||||||
type: 'GET'
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue