#!/usr/bin/env ruby

require 'tmpdir'
require "fileutils"

LOCK_FILE_PATH = File.join(Dir.tmpdir, "gitorious_task_lockfile")
ENV["PATH"] = "/usr/local/bin/:/opt/local/bin:#{ENV["PATH"]}"

if File.exist?(LOCK_FILE_PATH)
    $stderr.puts "Task lockfile '#{LOCK_FILE_PATH}' exists!"
    exit(1)
end

ENV["RAILS_ENV"] ||= "production"
require File.dirname(__FILE__) + "/../config/environment"


class TaskLockError < StandardError; end

def with_lock(&block)
  begin
    if File.exist?(LOCK_FILE_PATH)
      raise TaskLockError
    end
    FileUtils.touch(LOCK_FILE_PATH)
    yield
    FileUtils.rm(LOCK_FILE_PATH)
  rescue TaskLockError
    $stderr.puts "Task lockfile exists"
    exit(1)
  end
end

with_lock do
  log = Logger.new(File.join(RAILS_ROOT, "log", "tasks.log"))
  log.formatter = Logger::Formatter.new
  log.level = Logger::INFO
  log.formatter.datetime_format = "%Y-%m-%d %H:%M:%S"
  begin
    Task.perform_all_pending!(log)
  rescue => e
    exception_backtrace_string = "#{e.class.name} #{e.message}\n#{e.backtrace.join("\n  ")}"
    log.fatal exception_backtrace_string
    $stderr.puts exception_backtrace_string
    exit(1)
  end
end