Skip the indentation for deleted files
[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 "  git config --add astyle.ignored 'scilab/modules/javasci/src/java/org/scilab/modules/javasci/Call_Scilab*.java' "
69     echo "  git config --add astyle.ignored 'scilab/modules/renderer/src/java/org/scilab/modules/renderer/FigureScilabCall*.java' "
70     echo
71     
72     ASTYLE_IGNORED=""
73 else
74     ASTYLE_IGNORED="$(find $(git config --get-all astyle.ignored))"
75 fi
76
77 # indent / format file by type
78 #
79 indent() {
80     # getting against as the current commit
81     if git rev-parse --verify HEAD >/dev/null 2>&1
82     then
83         local against=HEAD
84     else
85         # Initial commit: diff against an empty tree object
86         local against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
87     fi
88
89     # loop on modified files
90     git diff --cached --name-status $against |while read st file;
91     do
92         # skip deleted files
93         if [ "$st" == 'D' ]; then continue; fi
94         local ext=$(expr "$file" : ".*\(\..*\)")
95         case $ext in
96         .xcos|.xml)
97             __indent_Xml;
98         ;;
99         .h|.c|.hxx|.cpp)
100             __indent_C;
101         ;;
102         .java)
103             __indent_java;
104         ;;
105         esac
106     done
107
108     return 0;
109 }
110
111 # Indent the file with xmlindent if this is an xcos file
112 __indent_Xml() {
113
114     if test ! -x "$XMLINDENT"
115     then
116         return 1;
117     fi
118     if test ! -f $file
119     then
120         return 2;
121     fi
122
123     # ignored globs
124     if test -n "$XMLINDENT_IGNORED"
125     then
126         echo $XMLINDENT_IGNORED |grep -q $file
127         if test $? -eq 0
128         then
129             echo "Formatting" $file    ": ignored"
130             return 3;
131         fi
132     fi
133
134     echo "Formatting" $file
135     "$XMLINDENT" -i 2 -o "$file" "$file" ||┬áreturn 4;
136     git add "$file" ||┬áreturn 5;
137 }
138
139 # Pre process before the indent
140 __pre_indent() {
141     if test ! -x "$ASTYLE"
142     then
143         return 1;
144     fi
145     if test ! -f $file
146     then
147         return 2;
148     fi
149
150     # ignored globs
151     if test -n "$ASTYLE_IGNORED"
152     then
153         echo $ASTYLE_IGNORED |grep -q "$file"
154         if test $? -eq 0
155         then
156             echo "Indenting" $file    ": ignored"
157             return 3;
158         fi
159     fi
160
161     echo "Indenting" $file
162     return 0;
163 }
164
165 # post process after the indent
166 __post_indent() {
167     git add "$file"
168 }
169
170 COMMON_ASTYLE_ARGS="--pad-header -n --pad-oper --indent-col1-comments --indent-switches"
171
172 # Indent the file with `astyle' if this is a C/CPP file
173 __indent_C() {
174     __pre_indent || return 1
175     $ASTYLE $COMMON_ASTYLE_ARGS --style=linux --indent=spaces=4 -A1 "$file" || return 2
176     __post_indent || return 3
177     return 0
178 }
179
180 # Indent the file with `astyle' if this is a Java file
181 __indent_java() {
182     __pre_indent || return 1
183     $ASTYLE $COMMON_ASTYLE_ARGS --style=java --indent=spaces=4 "$file" || return 2
184     __post_indent || return 3
185     return 0
186 }
187
188 indent
189