Xcos superblock: fix the modified status
[scilab.git] / git_hooks / pre-commit
1 #!/usr/bin/env sh
2 #
3 # Hook used to indent 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 if test ! -x "$XMLINDENT"
23 then
24     XMLINDENT="$(git config --get hooks.xmlindent)"
25 fi
26 if test ! -x "$XMLINDENT"
27 then
28     echo "Unable to find xmlindent executable on the configuration."
29     echo
30     echo "Please configure it with :"
31     echo "  git config --global hooks.xmlindent C:/path/to/xmlindent"
32     echo " or "
33     echo "  git config --global hooks.xmlindent /usr/bin/xmlindent"
34     echo
35 fi
36
37 if test -z "$(git config --get-all xmlindent.ignored)"
38 then
39     echo "Unable to find xmlindent ignored list on the configuration, ignored"
40     echo
41     echo "You can configure it with :"
42     echo "  git config --add xmlindent.ignored 'scilab/Visual-Studio-settings/*.xml' "
43     echo "  git config --add xmlindent.ignored 'scilab/checkstyle/*.xml' "
44     echo
45
46     XMLINDENT_IGNORED=""
47 else
48     XMLINDENT_IGNORED="$(find $(git config --get-all xmlindent.ignored))"
49 fi
50
51 if test ! -x "$ASTYLE"
52 then
53     ASTYLE="$(git config --get hooks.astyle)"
54 fi
55 if test ! -x "$ASTYLE"
56 then
57     echo "Unable to find astyle executable on the configuration."
58     echo
59     echo "Please configure it with :"
60     echo "  git config --global hooks.astyle C:/path/to/astyle"
61     echo " or "
62     echo "  git config --global hooks.astyle /usr/bin/astyle"
63     echo
64 fi
65
66 if test -z "$(git config --get-all astyle.ignored)"
67 then
68     echo "Unable to find astyle ignored list on the configuration, ignored"
69     echo
70     echo "You can configure it with :"
71     echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.hxx' "
72     echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.cpp' "
73     echo "  git config --add astyle.ignored 'scilab/modules/*/src/jni/*.c' "
74     echo "  git config --add astyle.ignored 'scilab/modules/javasci/src/java/org/scilab/modules/javasci/Call_Scilab*.java' "
75     echo "  git config --add astyle.ignored 'scilab/modules/renderer/src/java/org/scilab/modules/renderer/FigureScilabCall*.java' "
76     echo "  git config --add astyle.ignored 'scilab/modules/helptools/src/java/org/scilab/modules/helptools/SynopsisLexer.java' "
77     echo "  git config --add astyle.ignored 'scilab/modules/helptools/src/java/org/scilab/modules/helptools/XML/XMLLexer.java' "
78     echo "  git config --add astyle.ignored 'scilab/modules/helptools/src/java/org/scilab/modules/helptools/c/CLexer.java' "
79     echo "  git config --add astyle.ignored 'scilab/modules/helptools/src/java/org/scilab/modules/helptools/java/JavaLexer.java' "
80     echo "  git config --add astyle.ignored 'scilab/modules/helptools/src/java/org/scilab/modules/helptools/scilab/ScilabLexer.java' "
81     echo "  git config --add astyle.ignored 'scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/FunctionScanner.java' "
82     echo "  git config --add astyle.ignored 'scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/IndentScanner.java' "
83     echo "  git config --add astyle.ignored 'scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/MatchingBlockScanner.java' "
84     echo "  git config --add astyle.ignored 'scilab/modules/scinotes/src/java/org/scilab/modules/scinotes/ScilabLexer.java' "
85     echo "  git config --add astyle.ignored 'scilab/modules/xcos/src/java/org/scilab/modules/xcos/Controller.java' "
86     echo "  git config --add astyle.ignored 'scilab/modules/xcos/src/java/org/scilab/modules/xcos/JavaController.java' "
87     echo "  git config --add astyle.ignored 'scilab/modules/xcos/src/java/org/scilab/modules/xcos/Kind.java' "
88     echo "  git config --add astyle.ignored 'scilab/modules/xcos/src/java/org/scilab/modules/xcos/ObjectProperties.java' "
89     echo "  git config --add astyle.ignored 'scilab/modules/scicos/src/scicos_sundials/*' "
90
91     echo
92
93     ASTYLE_IGNORED=""
94 else
95     ASTYLE_IGNORED="$(find $(git config --get-all astyle.ignored))"
96 fi
97
98 # indent / format file by type
99 #
100 indent() {
101     # getting against as the current commit
102     if git rev-parse --verify HEAD >/dev/null 2>&1
103     then
104         local against=HEAD
105     else
106         # Initial commit: diff against an empty tree object
107         local against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
108     fi
109
110     # get the modified files per kind filtering out ignored files and call the
111     # __indent_XXX helper
112
113     FILES=$(git diff --cached --name-only --diff-filter=ACM $against |grep -E "\.(xcos|xml|xsl)$" |grep -v -F "$XMLINDENT_IGNORED")
114     [ -z "$FILES" ] || __indent_xml;
115
116     FILES=$(git diff --cached --name-only --diff-filter=ACM $against |grep -E "\.(h|c|hxx|cpp)$" |grep -v -F "$ASTYLE_IGNORED")
117     [ -z "$FILES" ] || __indent_C;
118
119     FILES=$(git diff --cached --name-only --diff-filter=ACM $against |grep -E "\.java$" |grep -v -F "$ASTYLE_IGNORED")
120     [ -z "$FILES" ] || __indent_java;
121
122     FILES=$(git diff --cached --name-only --diff-filter=ACM $against |grep -E "\.(sce|sci|tst)$")
123     [ -z "$FILES" ] || __indent_scilab;
124
125     return 0;
126 }
127
128 # Indent the file with xmlindent if this is an xcos file
129 __indent_xml() {
130     if test ! -x "$XMLINDENT"
131     then
132         return 1;
133     fi
134
135     echo "Formatting" "$FILES"
136     "$XMLINDENT" -w -i 4 $FILES || return 2;
137     # xmlindent does not remove trailing whitespaces
138     # and might add some on empty lines
139     sed -i -e 's/[ \t]*$//' $FILES || return 2;
140     git add $FILES || return 3;
141 }
142
143 # Pre process before the indent
144 __pre_indent() {
145     if test ! -x "$ASTYLE"
146     then
147         return 1;
148     fi
149
150     echo "Indenting" $FILES
151     return 0;
152 }
153
154 # post process after the indent
155 __post_indent() {
156     git add $FILES
157 }
158
159 COMMON_ASTYLE_ARGS="--pad-header --suffix=none --pad-oper --indent-col1-comments --indent-switches --indent=spaces=4 --add-brackets --formatted"
160
161 # Indent the file with `astyle' if this is a C/CPP file
162 __indent_C() {
163     __pre_indent || return 1
164     $ASTYLE $COMMON_ASTYLE_ARGS --style=bsd $FILES || return 2
165     __post_indent || return 3
166     return 0
167 }
168
169 # Indent the file with `astyle' if this is a Java file
170 __indent_java() {
171     __pre_indent || return 1
172     $ASTYLE $COMMON_ASTYLE_ARGS --style=java $FILES || return 2
173     __post_indent || return 3
174     return 0
175 }
176
177 # Indent the file with `scinotes' if this is a Scilab file
178 __indent_scilab() {
179     __pre_indent || return 1
180
181     TMPFILE="scinotes_indent.sce"
182     echo "files = [" >$TMPFILE
183     printf "'%s'\n" $FILES >>$TMPFILE
184     echo "];" >>$TMPFILE
185
186     echo "scinotes(files, ['indent','trailing','quote'])" >>$TMPFILE
187     echo "exit(0)" >>$TMPFILE
188
189     if test -f scilab/scilab-bin; then
190         scilab/bin/scilab -nw -f $TMPFILE || return 2
191     else
192         if test -f scilab/bin/WScilex.exe; then
193             scilab/bin/scilex.exe -f $TMPFILE || return 2
194         else
195             echo "Scilab has not been built."
196             rm $TMPFILE
197             return 4
198         fi
199     fi
200     rm $TMPFILE
201
202     __post_indent || return 3
203     return 0
204 }
205
206 indent