]> nos-oignons.net Git - gestion-adh.git/commitdiff
Next step in pre-commit hook implementation
authorLunar <lunar@anargeek.net>
Fri, 31 May 2013 20:30:57 +0000 (22:30 +0200)
committerLunar <lunar@anargeek.net>
Fri, 31 May 2013 20:30:57 +0000 (22:30 +0200)
bin/pre-commit-hook [new file with mode: 0755]
features/git-hooks.feature [deleted file]
features/pre-commit-hook.feature [new file with mode: 0644]
features/step_definitions/commandes.rb [deleted file]
features/step_definitions/commands.rb [new file with mode: 0644]
features/step_definitions/git.rb
features/step_definitions/subscriptions.rb
features/support/env.rb
features/support/fixtures.rb

diff --git a/bin/pre-commit-hook b/bin/pre-commit-hook
new file mode 100755 (executable)
index 0000000..aa60ccb
--- /dev/null
@@ -0,0 +1,42 @@
+#!/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
+
diff --git a/features/git-hooks.feature b/features/git-hooks.feature
deleted file mode 100644 (file)
index 29f8098..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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"
diff --git a/features/pre-commit-hook.feature b/features/pre-commit-hook.feature
new file mode 100644 (file)
index 0000000..a03fff0
--- /dev/null
@@ -0,0 +1,21 @@
+# 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"
diff --git a/features/step_definitions/commandes.rb b/features/step_definitions/commandes.rb
deleted file mode 100644 (file)
index 471f8dd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-Then /^je ne dois pas avoir eu d'erreur$/ do
-  assert_exit_status(0)
-end
diff --git a/features/step_definitions/commands.rb b/features/step_definitions/commands.rb
new file mode 100644 (file)
index 0000000..d069730
--- /dev/null
@@ -0,0 +1,7 @@
+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
index 30d6e7c544efac6c3e897202f931d20dc30a5c49..27d22a7ee1afcac3b118eee0b7afe0a1aa9e2a3b 100644 (file)
@@ -19,7 +19,12 @@ Given /^un clone du Git contenant les adhésions$/ do
   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
index 4fab6a392234dec9738b406a34a6a36eb636f622..76a4a1a1b179ab179a361c5f3f8d30e3bf4e9ce2 100644 (file)
@@ -1,6 +1,9 @@
 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
index 936dc538bf672bb66c104eabb70818979571ceea..e647e2f1cad74bbf1dfab03a69b55059e80162cd 100644 (file)
@@ -9,6 +9,8 @@ require 'safe_yaml'
 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
index d3e33536e7835af2ebde2ebe88d13488fd9a503b..47290c7b953c24db1b1fb92ba71d88dd03780384 100644 (file)
@@ -7,7 +7,7 @@ require 'yaml'
 BASE_SUBSCRIPTIONS = YAML.load(<<END_OF_YAML)
 000001:
   name: Matthieu Simon-Blavier
-  address:
+  address: |
     Domain Network Sas
     17, square Edouard VII
     75009 Paris
@@ -18,7 +18,7 @@ BASE_SUBSCRIPTIONS = YAML.load(<<END_OF_YAML)
     Il vient de `whois cogent.fr`.
 000002:
   name: Sylvain Dufier
-  address:
+  address: |
     ORANGE FRANCE
     13, rue de Javel
     75015 Paris
@@ -27,6 +27,7 @@ BASE_SUBSCRIPTIONS = YAML.load(<<END_OF_YAML)
     Il vient de `whois orange.fr`.
 000003:
   name: Salim Gasmi
+  address: |
     SDV PLURIMEDIA
     15, rue de la Nuee Bleue
     67000 Strasbourg
@@ -38,7 +39,7 @@ END_OF_YAML
 
 EXTRA_SUBSCRIPTION = YAML.load(<<END_OF_YAML)
 name: Franck Rohard
-address:
+address: |
   SOCIETE FRANCAISE DU RADIOTELEPHONE - SFR
   42, avenue de Friedland
   75008 Paris
@@ -51,8 +52,8 @@ END_OF_YAML
 SUBSCRIPTION_FILE_TEMPLATE = <<'END_OF_TEMPLATE'
 ---
 name: <%= name %>
-address:
-  <%= address %>
+address: |
+<%= address.gsub(/^/, '  ').rstrip %>
 email: <%= email %>
 mumbership_fee_paid_on: <%= membership_fee_paid_on %>
 ---
@@ -67,3 +68,8 @@ end
 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