Blob of script/graph_generator (raw blob data)

1 #!/usr/bin/env ruby
2
3 require 'tmpdir'
4 require "fileutils"
5
6 LOCK_FILE_PATH = File.join(Dir.tmpdir, "gitorious_graphgenerator_lockfile")
7 if File.exist?(LOCK_FILE_PATH)
8 $stderr.puts "Lockfile '#{LOCK_FILE_PATH}' exists!"
9 exit(1)
10 end
11
12 FileUtils.touch(LOCK_FILE_PATH)
13
14 ENV["RAILS_ENV"] ||= "production"
15 require File.dirname(__FILE__) + "/../config/environment"
16
17 log = Logger.new(File.join(RAILS_ROOT, "log", "graph_generator.log"))
18 log.formatter = Logger::Formatter.new
19 log.level = Logger::INFO
20 log.formatter.datetime_format = "%Y-%m-%d %H:%M:%S"
21
22 STATUS_FILE = File.join(RAILS_ROOT, "tmp", "graph_generator.status")
23 update_status = !File.exist?(STATUS_FILE)
24 tmpdir = File.join(RAILS_ROOT, "tmp", "graph_generator")
25 if !File.directory?(tmpdir)
26 FileUtils.mkdir_p(tmpdir)
27 elsif !update_status
28 mtime = File.mtime(STATUS_FILE).utc
29
30 days = (Time.now.utc - mtime) / (3600*24)
31 if days >= 5
32 log.info "Cleaning '#{tmpdir}'..."
33 Dir.glob(File.join(tmpdir, "*.status")) do |file|
34 FileUtils.rm(file)
35 end
36
37 update_status = true
38 end
39 end
40
41 if update_status
42 FileUtils.touch(STATUS_FILE)
43 end
44
45 log.info "Starting graph generation run..."
46 Repository.find(:all).each_with_index do |repository, index|
47 begin
48 Gitorious::Graphs::Builder.generate_all_for(repository)
49 if index % 5 == 0
50 # GC every five cycles
51 GC.start
52 end
53 sleep(0.1)
54 rescue => e
55 log.fatal "Error generating graphs for repo##{repository.id}"
56 exception_backtrace_string = "#{e.class.name} #{e.message}\n#{e.backtrace.join("\n ")}"
57 log.fatal exception_backtrace_string
58 $stderr.puts exception_backtrace_string
59 # exit(1)
60 end
61 end
62 log.info "Done with graph generation run"
63
64 FileUtils.rm(LOCK_FILE_PATH)