+#-*- coding: utf-8 -*-
+
+require 'nos_oignons/git'
+require 'nos_oignons/mailman'
+require 'nos_oignons/subscriptions'
+
+module NosOignons
+ # The following class methods are all meant to be called as command-line scripts
+ class << self
+ def list_emails!
+ NosOignons::Subscription.all.each do |subscription|
+ if subscription.up_to_date?
+ puts subscription.email
+ end
+ end
+ end
+
+ MEMBER_MAILING_LIST = 'ag'
+ def update_ag_subscribers!
+ current_emails = NosOignons::Mailman.list_members(MEMBER_MAILING_LIST)
+ uptodate_emails = NosOignons::Subscription.all.select(&:up_to_date?).collect(&:email)
+
+ NosOignons::Mailman.add_members(MEMBER_MAILING_LIST, uptodate_emails - current_emails)
+ NosOignons::Mailman.remove_members(MEMBER_MAILING_LIST, current_emails - uptodate_emails)
+ end
+
+ def pre_commit_hook!
+ if system('git rev-parse --quiet --verify HEAD >/dev/null')
+ against = 'HEAD'
+ else
+ # Initial commit: diff against an empty tree object
+ against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
+ end
+
+ IO.popen(['git', 'diff-index', '--cached', '--name-status', against]) do |io|
+ NosOignons::Git.handle_modified_files(io) do |file|
+ next unless file.start_with?("#{NosOignons::SUBSCRIPTIONS_ROOT}/")
+ begin
+ # Use empty ref to get the index
+ NosOignons::Subscription.read_from_git('', file)
+ rescue ArgumentError
+ $stderr.puts "Désolé : #{file} n'a pas le bon format !"
+ exit 1
+ end
+ end
+ end
+ end
+
+ def pre_receive_hook!(stdin)
+ stdin.readlines.each do |ref_line|
+ old_value, new_value, ref_name = ref_line.rstrip.split(' ', 3)
+ IO.popen(['git', 'diff', '--name-status', "#{old_value}..#{new_value}"]) do |io|
+ NosOignons::Git.handle_modified_files(io) do |file|
+ next unless file.start_with?("#{NosOignons::SUBSCRIPTIONS_ROOT}/")
+ begin
+ NosOignons::Subscription.read_from_git(new_value, file)
+ rescue ArgumentError
+ $stderr.puts "Désolé : #{file} n'a pas le bon format !"
+ exit 1
+ end
+ end
+ end
+ end
+ end
+ end
+end