--- /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