1
+ require 'fileutils'
1
2
require 'json'
3
+ require 'open-uri'
2
4
3
5
module Downloads
4
6
# repositories returns a list of all repositories with releases.
5
7
def self . repositories
6
- @repositories ||= begin
8
+ @_repositories ||= begin
7
9
repos = Dir . glob ( 'downloads/*' ) . map { |dir | Repository . new ( dir ) }
8
10
repos . sort_by { |r | r . name == 'prometheus' ? '0' : r . name }
9
11
end
@@ -13,18 +15,46 @@ def self.repositories
13
15
# provided for.
14
16
def self . operating_systems
15
17
repositories . inject ( [ ] ) do |list , repo |
16
- list += repo . releases . map { |r | r . assets . map ( &:os ) } . flatten
18
+ list += repo . releases . map { |r | r . binaries . map ( &:os ) } . flatten
17
19
end . uniq . sort
18
20
end
19
21
20
22
# architectures returns a list of all architectures downloads can be
21
23
# provided for.
22
24
def self . architectures
23
25
repositories . inject ( [ ] ) do |list , repo |
24
- list += repo . releases . map { |r | r . assets . map ( &:arch ) } . flatten
26
+ list += repo . releases . map { |r | r . binaries . map ( &:arch ) } . flatten
25
27
end . uniq . sort
26
28
end
27
29
30
+ # checksum returns the checksum for a given filename of a given release. It
31
+ # might try to download the sha256sums.txt from the given release if available
32
+ # and not already cached.
33
+ def self . checksum ( release , name )
34
+ @_checksums ||= { }
35
+ @_checksums [ release . id ] ||= begin
36
+ asset = release . assets . find { |a | a [ 'name' ] == 'sha256sums.txt' }
37
+
38
+ if asset
39
+ cache = [ 'downloads' , '.cache' , release . id , 'sha256sums.txt' ] . join ( '/' )
40
+ unless File . exists? ( cache )
41
+ FileUtils . mkdir_p ( File . dirname ( cache ) )
42
+ File . open ( cache , 'wb' ) do |file |
43
+ file . write ( URI . parse ( asset [ 'browser_download_url' ] ) . read )
44
+ end
45
+ end
46
+
47
+ File . readlines ( cache ) . each_with_object ( { } ) do |line , memo |
48
+ checksum , filename = line . split ( /\s +/ )
49
+ memo [ filename ] = checksum
50
+ end
51
+ else
52
+ { }
53
+ end
54
+ end
55
+ @_checksums [ release . id ] [ name ]
56
+ end
57
+
28
58
class Repository
29
59
def initialize ( dir )
30
60
@repo = JSON . parse ( File . read ( File . join ( dir , 'repo.json' ) ) )
@@ -66,6 +96,10 @@ def initialize(data)
66
96
@data = data
67
97
end
68
98
99
+ def id
100
+ @data [ 'id' ]
101
+ end
102
+
69
103
def name
70
104
@data [ 'name' ]
71
105
end
@@ -79,11 +113,17 @@ def prerelease
79
113
end
80
114
81
115
def assets
82
- @data [ 'assets' ] . map { |d | Asset . new ( d ) }
116
+ @data [ 'assets' ]
117
+ end
118
+
119
+ def binaries
120
+ assets .
121
+ select { |d | d [ 'name' ] && %w[ .tar.gz .zip ] . any? { |ext | d [ 'name' ] . end_with? ( ext ) } } .
122
+ map { |d | Binary . new ( d ) }
83
123
end
84
124
end
85
125
86
- class Asset
126
+ class Binary
87
127
def initialize ( data )
88
128
@data = data
89
129
end
0 commit comments