c4c09e6ec199d8bacfab269af3ba01a595270240
[packages.grml.org.git] / update.rb
1 #!/usr/bin/env ruby
2 require 'git'
3 require 'erb'
4 require 'yaml'
5
6 def build_used_package_list(source_files)
7   source_files.map do |source_file|
8     File.read(source_file).split("\n").reject do |l|
9       l.strip.start_with?('#') or l.strip == ""
10     end
11   end.flatten
12 end
13
14 used_packages = {
15   :full => build_used_package_list(['grml-live/etc/grml/fai/config/package_config/GRMLBASE', 'grml-live/etc/grml/fai/config/package_config/GRML_FULL']),
16 }
17
18 def build_package_list(packages, used)
19   data = {}
20   packages.each do |pkg|
21     next if not File.exists?(File.join(pkg, 'debian'))
22     begin
23       g = Git.open(working_dir = pkg)
24       #g.pull(Git::Repo, Git::Branch) # fetch and a merge
25     rescue ArgumentError
26       g = Git.bare(working_dir = pkg)
27     end
28
29     current_head = g.gcommit('HEAD')
30     next if not current_head.parent
31
32     p = {
33       :head_is_tagged => false,
34       :used => {},
35       :name => pkg,
36       :version => nil,
37       :has_tags => false,
38     }
39     used.each do |dist,l|
40       p[:used][dist] = l.include?(pkg)
41     end
42
43     for tag in g.tags.reverse
44       p[:has_tags] = true
45       t = g.gcommit(tag.name)
46       next if not t.parent
47       #$stderr.puts "#{pkg}: Checking tag #{tag.name}: tag parent: #{t.parent.sha} HEAD: #{current_head.parent.sha}"
48       if t.parent.sha === current_head.parent.sha
49         p[:head_is_tagged] = true
50         p[:version] = tag.name
51         break
52       end
53     end
54
55     data[pkg] = p
56   end
57   data.values.sort { |x,y| x[:name] <=> y[:name] }
58 end
59
60 packages = build_package_list(ARGV, used_packages)
61
62 template = ERB.new <<-EOF
63 <!doctype html>
64 <head>
65   <meta charset="utf-8">
66   <title>Grml.org Package Index</title>
67   <link rel="stylesheet" href="style.css">
68 </head>
69 <body>
70   <header>
71   <h1>All Grml packages</h1>
72   <p>Last update: <%= Time.now.to_s %></p>
73   </header>
74   <div id="main">
75   <table>
76   <tr>
77   <th>Package</th><th>Git</th><th>Download</th><th>Fresh?</th><th>In FULL?</th>
78   </tr>
79   <% packages.each do |p| %>
80   <tr>
81   <td><%= p[:name] %></td>
82   <td class="git"><a href="http://git.grml.org/?p=<%= p[:name] %>.git;a=summary">Git</a></td>
83   <td class="download">
84     <% if p[:has_tags] %>
85     <a href="http://deb.grml.org/pool/main/<%= p[:name][0..0] %>/<%= p[:name] %>/">Download</a>
86     <% end %>
87   </td>
88   <% if p[:head_is_tagged] %>
89   <td class="ok">Version <%= p[:version] %></td>
90   <% else %>
91   <td class="error <% if p[:used][:full] %>important<% end %>">Untagged changes</td>
92   <% end %>
93   <td class="installed"><%= p[:used][:full] ? "Yes" : "No" %></td>
94   </tr>
95   <% end %>
96   </table>
97   </div>
98   <footer>
99   </footer>
100 </body>
101 </html>
102 EOF
103 File.open('index.html.new','w') do |f|
104   f.write template.result(binding)
105 end
106 File.open('packages.yaml.new','w') do |f|
107   f.write packages.to_yaml
108 end
109
110 FileUtils.mv 'index.html.new', 'index.html'
111 FileUtils.mv 'packages.yaml.new', 'packages.yaml'
112