--- /dev/null
+#!/usr/bin/ruby1.9.1
+#-*- coding: utf-8 -*-
+
+require 'rubygems'
+require 'bundler'
+Bundler.setup
+
+require 'safe_yaml'
+SafeYAML::OPTIONS[:default_mode] = :safe
+
+if system('git rev-parse --quiet --verify HEAD >/dev/null')
+  against = 'HEAD'
+else
+  # Initial commit: diff against an empty tree object
+  against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
+end
+
+def is_valid_subscription?(content)
+  content.length != 0 && YAML.load(content)
+end
+
+def is_valid_subscription_file?(file)
+  IO.popen(['git', 'show', ":#{file}"]) do |f|
+    is_valid_subscription?(f.read)
+  end
+end
+
+modified = []
+IO.popen(['git', 'diff-index', '--cached', '--name-status', against]) do |f|
+  f.readlines.each do |line|
+    status, file = line.strip.split("\t", 2)
+    # Has file been added or modified?
+    if ['A', 'M'].include?(status)
+      modified << file
+      if !is_valid_subscription_file?(file)
+        $stderr.puts "Désolé : #{file} n'a pas le bon format !"
+        exit 1
+      end
+    end
+  end
+end
+
 
+++ /dev/null
-# language: fr
-
-Fonctionnalité: Git hooks
-  En tant qu'être humain, je suis susceptible de faire des erreurs. Il faut
-  donc que Git vérifie que je ne met pas des informations incompréhensibles
-  dans la base des membres.
-
-  Contexte:
-    Soit un clone du Git contenant les adhésions
-
-  Scénario: Commit d'une nouvelle adhésion dans le format qui convient
-    Lorsque j'ajoute une fiche correcte pour une nouvelle adhésion
-    Et que je fait un `commit` du nouveau fichier
-    Alors je ne dois pas avoir eu d'erreur
-
-  Scénario: Commit d'un fichier vide
-    Lorsque j'ajoute une fiche vide
-    Et que je fais un `commit` du nouveau fichier
-    Alors je dois voir comme erreur "pas le bon format"
 
--- /dev/null
+# language: fr
+
+Fonctionnalité: pre-commit hook Git
+  En tant que membres du C.A. de Nos oignons, je dois pouvoir remplir
+  les fiches des membres sans introduire de problème dans le système.
+  Il faut donc que Git m'empêche d'enregistrer des informations
+  invalides.
+
+  Contexte:
+    Soit un clone du Git contenant les adhésions
+    Et le « pre-commit hook » correctement configuré
+
+  Scénario: Commit d'une nouvelle adhésion dans le format qui convient
+    Lorsque j'ajoute une fiche correcte pour une nouvelle adhésion
+    Et que je fais un `commit` du nouveau fichier
+    Alors je ne dois pas avoir eu d'erreur
+
+  Scénario: Commit d'un fichier vide
+    Lorsque j'ajoute une fiche vide
+    Et que je fais un `commit` du nouveau fichier
+    Alors je dois voir comme erreur "pas le bon format"
 
+++ /dev/null
-Then /^je ne dois pas avoir eu d'erreur$/ do
-  assert_exit_status(0)
-end
 
--- /dev/null
+Then /^je ne dois pas avoir eu d'erreur$/ do
+  assert_exit_status(0)
+end
+
+Then /^je dois voir comme erreur "(.*?)"$/ do |expected|
+  assert_failing_with(expected)
+end
 
   cd 'clone'
 end
 
-When /je fait un `commit` du nouveau fichier$/ do
+Given /^le « pre-commit hook » correctement configuré$/ do
+  FileUtils.ln_s File.expand_path('../../../bin/pre-commit-hook', __FILE__),
+                 "#{current_dir}/.git/hooks/pre-commit"
+end
+
+When /je fais un `commit` du nouveau fichier$/ do
   run_simple "git add #{@file}"
-  run_simple "git commit #{@file} -m 'new file'"
+  run_simple "git commit #{@file} -m 'new file'", false # do not fail on error
 end
 
 When /^j'ajoute une fiche correcte pour une nouvelle adhésion$/ do
-  new_id = Dir.glob("#{current_dir}/Membres/*.mdwn").
-    collect { |f| File.basename(f).gsub(/\.mdwn$/, '').to_i }.max + 1
   @file = subscription_filename_for_id(new_id)
   write_file @file, render_subscription_file(EXTRA_SUBSCRIPTION)
 end
+
+When /^j'ajoute une fiche vide$/ do
+  @file = subscription_filename_for_id(new_id)
+  write_file @file, ''
+end
 
 SafeYAML::OPTIONS[:default_mode] = :safe
 
 Before do
+  ENV['GIT_COMMITTER_NAME'] = ENV['GIT_AUTHOR_NAME'] = 'J. Test'
+  ENV['GIT_COMMITTER_EMAIL'] = ENV['GIT_AUTHOR_EMAIL'] = 'test@example.org'
   @tmpdir = Dir.mktmpdir('gestion-adh')
   @dirs = [@tmpdir]
 end
 
 BASE_SUBSCRIPTIONS = YAML.load(<<END_OF_YAML)
 000001:
   name: Matthieu Simon-Blavier
-  address:
+  address: |
     Domain Network Sas
     17, square Edouard VII
     75009 Paris
     Il vient de `whois cogent.fr`.
 000002:
   name: Sylvain Dufier
-  address:
+  address: |
     ORANGE FRANCE
     13, rue de Javel
     75015 Paris
     Il vient de `whois orange.fr`.
 000003:
   name: Salim Gasmi
+  address: |
     SDV PLURIMEDIA
     15, rue de la Nuee Bleue
     67000 Strasbourg
 
 EXTRA_SUBSCRIPTION = YAML.load(<<END_OF_YAML)
 name: Franck Rohard
-address:
+address: |
   SOCIETE FRANCAISE DU RADIOTELEPHONE - SFR
   42, avenue de Friedland
   75008 Paris
 SUBSCRIPTION_FILE_TEMPLATE = <<'END_OF_TEMPLATE'
 ---
 name: <%= name %>
-address:
-  <%= address %>
+address: |
+<%= address.gsub(/^/, '  ').rstrip %>
 email: <%= email %>
 mumbership_fee_paid_on: <%= membership_fee_paid_on %>
 ---
 def render_subscription_file(locals)
   ERB.new(SUBSCRIPTION_FILE_TEMPLATE).result(OpenStruct.new(locals).instance_eval { binding })
 end
+
+def new_id
+  new_id = Dir.glob("#{current_dir}/Membres/*.mdwn").
+    collect { |f| File.basename(f).gsub(/\.mdwn$/, '').to_i }.max + 1
+end