3c0bdb17e37cfe4ae50d7b985c47466606633eaf
[scilab.git] / git_hooks / pre-commit
1 #!/usr/bin/env sh
2 #
3 # Hook used to indent all xcos files before commiting
4 #
5
6
7 #
8 # Pre-conditions
9 #
10 if test -d ".git/rebase-merge"          || \
11    test -d ".git/rebase-apply"          || \
12    test -f ".git/MERGE_HEAD"            || \
13    test -f ".git/CHERRY_PICK_HEAD"      || \
14    test -f ".git/BISECT_LOG"            
15 then
16         exit 0
17 fi
18
19 #
20 # Configuration check
21 #
22 XMLINDENT="$(git config --get hooks.xmlindent)"
23 if test ! -x "$XMLINDENT"
24 then
25         echo "Unable to find xmlindent executable on the configuration."
26         echo
27         echo "Please configure it with :"
28         echo "  git config --global hooks.xmlindent C:/path/to/xmlindent"
29         echo " or "
30         echo "  git config --global hooks.xmlindent /usr/bin/xmlindent"
31         echo
32 fi
33
34 if test -z "$(git config --get-all xmlindent.ignored)"
35 then
36         echo "Unable to find xmlindent ignored list on the configuration, ignored"
37         echo
38         echo "You can configure it with :"
39         echo "  git config --add xmlindent.ignored 'scilab/Visual-Studio-settings/*.xml' "
40         echo "  git config --add xmlindent.ignored 'scilab/checkstyle/*.xml' "
41         echo
42         
43         XMLINDENT_IGNORED=""
44 else
45         XMLINDENT_IGNORED="$(find $(git config --get-all xmlindent.ignored))"
46 fi
47
48 ASTYLE="$(git config --get hooks.astyle)"
49 if test ! -x "$ASTYLE"
50 then
51         echo "Unable to find astyle executable on the configuration."
52         echo
53         echo "Please configure it with :"
54         echo "  git config --global hooks.astyle C:/path/to/astyle"
55         echo " or "
56         echo "  git config --global hooks.astyle /usr/bin/astyle"
57         echo
58 fi
59
60 if test -z "$(git config --get-all astyle.ignored)"
61 then
62         echo "Unable to find astyle ignored list on the configuration, ignored"
63         echo
64         echo "You can configure it with :"
65         echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.hxx' "
66         echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.cpp' "
67         echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.c' "
68         echo
69         
70         ASTYLE_IGNORED=""
71 else
72         ASTYLE_IGNORED="$(find $(git config --get-all astyle.ignored))"
73 fi
74
75 # indent / format file by type
76 #
77 indent() {
78         # getting against as the current commit
79         if git rev-parse --verify HEAD >/dev/null 2>&1
80         then
81                 local against=HEAD
82         else
83                 # Initial commit: diff against an empty tree object
84                 local against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
85         fi
86
87         # loop on modified files
88         git diff --cached --name-only $against |while read file;
89         do
90                 local ext=$(expr "$file" : ".*\(\..*\)")
91                 case $ext in
92                 .xcos|.xml)
93                         __indent_Xml;
94                 ;;
95                 .h|.c|.hxx|.cpp)
96                         __indent_C;
97                 ;;
98                 .java)
99                         __indent_java;
100                 ;;
101                 esac
102         done
103
104     return 0;
105 }
106
107 # Indent the file with xmlindent if this is an xcos file
108 __indent_Xml() {
109
110         if test ! -x "$XMLINDENT"
111         then
112                 return 1;
113         fi
114         if test ! -f $file
115         then
116                 return 2;
117         fi
118
119         # ignored globs
120         if test -n "$XMLINDENT_IGNORED"
121         then
122                 echo $XMLINDENT_IGNORED |grep -q $file
123                 if test $? -eq 0
124                 then
125                         echo "Formatting" $file ": ignored"
126                         return 3;
127                 fi
128         fi
129
130         echo "Formatting" $file
131         "$XMLINDENT" -i 2 -o "$file" "$file" ||┬áreturn 4;
132         git add "$file" ||┬áreturn 5;
133 }
134
135 # Pre process before the indent
136 __pre_indent() {
137         if test ! -x "$ASTYLE"
138         then
139                 return 1;
140         fi
141         if test ! -f $file
142         then
143                 return 2;
144         fi
145
146         # ignored globs
147         if test -n "$ASTYLE_IGNORED"
148         then
149                 echo $ASTYLE_IGNORED |grep -q "$file"
150                 if test $? -eq 0
151                 then
152                         echo "Indenting" $file  ": ignored"
153                         return 3;
154                 fi
155         fi
156
157         echo "Indenting" $file
158     return 0;
159 }
160
161 # post process after the indent
162 __post_indent() {
163         git add "$file"
164 }
165
166 COMMON_ASTYLE_ARGS="--pad-header -n --pad-oper --indent-col1-comments --indent-switches"
167
168 # Indent the file with `astyle' if this is a C/CPP file
169 __indent_C() {
170         __pre_indent || return 1
171         $ASTYLE $COMMON_ASTYLE_ARGS --style=linux --indent=spaces=4 -A1 "$file" || return 2
172         __post_indent || return 3
173     return 0
174 }
175
176 # Indent the file with `astyle' if this is a Java file
177 __indent_java() {
178         __pre_indent || return 1
179         $ASTYLE $COMMON_ASTYLE_ARGS --style=java --indent=spaces=4 "$file" || return 2
180         __post_indent || return 3
181     return 0
182 }
183
184 indent
185