Skip to content

Commit cbf7f3e

Browse files
committed
Add logic to pull release information from GitHub API for download links
1 parent 773cfc3 commit cbf7f3e

File tree

3 files changed

+89
-9
lines changed

3 files changed

+89
-9
lines changed

_includes/head.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
<!-- Loads user-cards from GH API -->
3939
<script src="/javascripts/cards.js"></script>
40+
<!-- Configures special anchors to link to the most recent ev3dev release -->
41+
<script src="/javascripts/releases.js"></script>
4042
<!-- Responds to queries typed into the "Quick nav" box -->
4143
<script src="/javascripts/search.js"></script>
4244
<!-- Converts static descriptors of tab target content into live text and links -->

docs/getting-started.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ please [open an issue on GitHub](/support){: .alert-link}.
4040

4141
## Step 1: Download the latest ev3dev image file
4242

43-
Releases are posted [on GitHub][releases]. Follow the link and download the latest
44-
**Test Release** image file for your hardware. Releases for LEGO MINDSTORMS EV3
45-
start with `ev3-`, Raspberry Pi starts with `rpi-` and Raspberry Pi 2 starts
46-
with `rpi2-`.
47-
48-
For most users, downloading the `.xz` file will be the best option, but the `.zip`
49-
will work as well. If you are planning to image your card manually instead of
50-
following the recommended steps, you will need to choose based on your OS and
51-
imaging program.
43+
To get started, you will need to download the release corresponding to the platform
44+
you are using. If you are looking for older releases or other file types, you can
45+
check out the [GitHub releases page][releases].
46+
47+
Download for:
48+
<a data-release-link-platform="ev3" class="btn btn-sm btn-primary">LEGO EV3 brick</a>
49+
<a data-release-link-platform="rpi" class="btn btn-sm btn-primary">Raspberry Pi 1</a>
50+
<a data-release-link-platform="rpi2" class="btn btn-sm btn-primary">Raspberry Pi 2</a>
51+
<a data-release-link-platform="evb" class="btn btn-sm btn-primary">Fatcat Lab EVB</a>
5252

5353
## Step 2: Copy the image on to the SD card
5454

javascripts/releases.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
var ev3devRepoReleaseCacheKey = 'ev3dev-repo-release-cache';
2+
var releaseCacheTimeMillis = 1 * 24 * 60 * 60 * 1000;
3+
4+
var releasePlatformRegexes = {
5+
ev3: "ev3-[\\w\\d-]*\\.img\\.xz",
6+
rpi: "rpi-[\\w\\d-]*\\.img\\.xz",
7+
rpi2: "rpi2-[\\w\\d-]*\\.img\\.xz",
8+
evb: "evb-[\\w\\d-]*\\.img\\.xz",
9+
}
10+
11+
function supportsHtml5Storage() {
12+
try {
13+
return 'localStorage' in window && window['localStorage'] !== null;
14+
} catch (e) {
15+
return false;
16+
}
17+
}
18+
19+
$(document).ready(function () {
20+
if ($('a[data-release-link-platform]').length > 0) {
21+
function initReleaseLinks(releases) {
22+
releases.sort(function (a, b) {
23+
if (Date.parse(a['created_at']) < Date.parse(b['created_at']))
24+
return 1;
25+
if (Date.parse(a['created_at']) > Date.parse(b['created_at']))
26+
return -1;
27+
28+
return 0;
29+
});
30+
31+
$('a[data-release-link-platform]').each(function (i, element) {
32+
var $linkElem = $(element);
33+
var targetReleasePlatform = $linkElem.data('release-link-platform');
34+
if(!releasePlatformRegexes[targetReleasePlatform]) {
35+
console.error('"' + targetReleasePlatform + '" is an invalid release target.');
36+
return true;
37+
}
38+
39+
var platformRegex = new RegExp(releasePlatformRegexes[targetReleasePlatform]);
40+
41+
for(var releaseIndex in releases) {
42+
var releaseAssets = releases[releaseIndex].assets;
43+
for(var assetIndex in releaseAssets) {
44+
if(platformRegex.test(releaseAssets[assetIndex].name)) {
45+
$linkElem.attr('href', releaseAssets[assetIndex]['browser_download_url']);
46+
return true;
47+
}
48+
}
49+
}
50+
});
51+
}
52+
53+
var cacheData;
54+
try {
55+
cacheData = supportsHtml5Storage() ? JSON.parse(localStorage.getItem(ev3devRepoReleaseCacheKey)) : null;
56+
}
57+
catch(e) {
58+
// Ignore the error; if the saved JSON is invalid, we'll just request it from the server.
59+
}
60+
61+
if (cacheData && Date.now() - cacheData.dateRetrieved < releaseCacheTimeMillis) {
62+
initReleaseLinks(cacheData.releaseData);
63+
}
64+
else {
65+
console.log("No cached copy of releases found. Downloading from GitHub.");
66+
$.ajax('https://api.github.com/repos/ev3dev/ev3dev/releases').done(function (releases) {
67+
if (supportsHtml5Storage())
68+
localStorage.setItem(ev3devRepoReleaseCacheKey, JSON.stringify({
69+
dateRetrieved: Date.now(),
70+
releaseData: releases
71+
}));
72+
initReleaseLinks(releases);
73+
}).fail(function (error) {
74+
console.error("Error getting release info: " + error);
75+
});
76+
}
77+
}
78+
});

0 commit comments

Comments
 (0)