Switch to astyle for the C, C++ & Java indentation
[scilab.git] / git_hooks / pre-commit
1 #!/bin/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
24 if test ! -x "$XMLINDENT"
25 then
26         echo "Unable to find xmlindent executable on the configuration."
27         echo
28         echo "Please configure it with :"
29         echo "  git config --global hooks.xmlindent C:/path/to/xmlindent"
30         echo " or "
31         echo "  git config --global hooks.xmlindent /usr/bin/xmlindent"
32         echo
33 fi
34
35 if test -z "$(git config --get-all xmlindent.ignored)"
36 then
37         echo "Unable to find xmlindent ignored list on the configuration, ignored"
38         echo
39         echo "You can configure it with :"
40         echo "  git config --add xmlindent.ignored 'scilab/Visual-Studio-settings/*.xml' "
41         echo "  git config --add xmlindent.ignored 'scilab/checkstyle/*.xml' "
42         echo
43         
44         XMLINDENT_IGNORED=""
45 else
46         XMLINDENT_IGNORED="$(find $(git config --get-all xmlindent.ignored))"
47 fi
48
49 INDENT="$(git config --get hooks.astyle)"
50 if test ! -x "$INDENT"
51 then
52         echo "Unable to find astyle executable on the configuration."
53         echo
54         echo "Please configure it with :"
55         echo "  git config --global hooks.astyle C:/path/to/astyle"
56         echo " or "
57         echo "  git config --global hooks.astyle /usr/bin/astyle"
58         echo
59 fi
60
61 if test -z "$(git config --get-all astyle.ignored)"
62 then
63         echo "Unable to find astyle ignored list on the configuration, ignored"
64         echo
65         echo "You can configure it with :"
66         echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.hxx' "
67         echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.cpp' "
68         echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.c' "
69         echo
70         
71         ASTYLE_IGNORED=""
72 else
73         ASTYLE_IGNORED="$(find $(git config --get-all astyle.ignored))"
74 fi
75
76 # indent / format file by type
77 #
78 indent() {
79         # getting against as the current commit
80         if git rev-parse --verify HEAD >/dev/null 2>&1
81         then
82                 local against=HEAD
83         else
84                 # Initial commit: diff against an empty tree object
85                 local against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
86         fi
87
88         # loop on modified files
89         git diff --cached --name-only $against |while read file;
90         do
91                 local ext=$(expr "$file" : ".*\(\..*\)")
92                 case $ext in
93                 .xcos|.xml)
94                         __indent_Xml;
95                 ;;
96                 .h|.c|.hxx|.cpp)
97                         __indent_C;
98                 ;;
99                 .java)
100                         __indent_java;
101                 ;;
102                 esac
103         done
104 }
105
106 # Indent the file with xmlindent if this is an xcos file
107 __indent_Xml() {
108
109         if test ! -x "$XMLINDENT"
110         then
111                 return;
112         fi
113         if test ! -f $file
114         then
115                 return;
116         fi
117
118         # ignored globs
119         if test -n "$XMLINDENT_IGNORED"
120         then
121                 echo $XMLINDENT_IGNORED |grep -q $file
122                 if test $? -eq 0
123                 then
124                         echo "Formatting" $file ": ignored"
125                         return
126                 fi
127         fi
128
129         echo "Formatting" $file
130         "$XMLINDENT" -i 2 -o "$file" "$file"
131         git add "$file"
132 }
133
134 # Pre process before the indent
135 __pre_indent() {
136
137         if test ! -x "$ASTYLE"
138         then
139                 return;
140         fi
141         if test ! -f $file
142         then
143                 return;
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
154                 fi
155         fi
156
157         echo "Indenting" $file
158
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
171         astyle $COMMON_ASTYLE_ARGS --style=linux --indent=spaces=4 -A1 "$file"
172         __post_indent
173 }
174
175 # Indent the file with `astyle' if this is a Java file
176 __indent_java() {
177         __pre_indent
178         astyle $COMMON_ASTYLE_ARGS --style=java --indent=tab "$file"
179         __post_indent
180
181 }
182
183 indent