1 #!/bin/bash |
1 #!/bin/bash |
2 |
2 |
3 YEAR=`date +2003-%Y` |
3 YEAR=`date +2003-%Y` |
4 HGROOT=`hg root` |
4 HGROOT=`hg root` |
5 |
5 |
6 function update_header() { |
6 # file enumaration modes |
|
7 |
|
8 function all_files() { |
|
9 hg status -a -m -c | |
|
10 cut -d ' ' -f 2 | grep -E '(\.(cc|h|dox)$|Makefile\.am$)' | |
|
11 while read file; do echo $HGROOT/$file; done |
|
12 } |
|
13 |
|
14 function modified_files() { |
|
15 hg status -a -m | |
|
16 cut -d ' ' -f 2 | grep -E '(\.(cc|h|dox)$|Makefile\.am$)' | |
|
17 while read file; do echo $HGROOT/$file; done |
|
18 } |
|
19 |
|
20 function changed_files() { |
|
21 { |
|
22 if [ -n "$HG_PARENT1" ] |
|
23 then |
|
24 hg status --rev $HG_PARENT1:$HG_NODE -a -m |
|
25 fi |
|
26 if [ -n "$HG_PARENT2" ] |
|
27 then |
|
28 hg status --rev $HG_PARENT2:$HG_NODE -a -m |
|
29 fi |
|
30 } | cut -d ' ' -f 2 | grep -E '(\.(cc|h|dox)$|Makefile\.am$)' | |
|
31 sort | uniq | |
|
32 while read file; do echo $HGROOT/$file; done |
|
33 } |
|
34 |
|
35 function given_files() { |
|
36 for file in $GIVEN_FILES |
|
37 do |
|
38 echo $file |
|
39 done |
|
40 } |
|
41 |
|
42 # actions |
|
43 |
|
44 function update_action() { |
|
45 if ! diff -q $1 $2 >/dev/null |
|
46 then |
|
47 echo -n " [$3 updated]" |
|
48 rm $2 |
|
49 mv $1 $2 |
|
50 CHANGED=YES |
|
51 fi |
|
52 } |
|
53 |
|
54 function update_warning() { |
|
55 echo -n " [$2 warning]" |
|
56 WARNED=YES |
|
57 } |
|
58 |
|
59 function update_init() { |
|
60 echo Update source files... |
|
61 TOTAL_FILES=0 |
|
62 CHANGED_FILES=0 |
|
63 WARNED_FILES=0 |
|
64 } |
|
65 |
|
66 function update_done() { |
|
67 echo $CHANGED_FILES out of $TOTAL_FILES files has been changed. |
|
68 echo $WARNED_FILES out of $TOTAL_FILES files has been warned. |
|
69 } |
|
70 |
|
71 function update_begin() { |
|
72 ((TOTAL_FILES++)) |
|
73 CHANGED=NO |
|
74 WARNED=NO |
|
75 } |
|
76 |
|
77 function update_end() { |
|
78 if [ $CHANGED == YES ] |
|
79 then |
|
80 ((++CHANGED_FILES)) |
|
81 fi |
|
82 if [ $WARNED == YES ] |
|
83 then |
|
84 ((++WARNED_FILES)) |
|
85 fi |
|
86 } |
|
87 |
|
88 function check_action() { |
|
89 if ! diff -q $1 $2 >/dev/null |
|
90 then |
|
91 echo -n " [$3 failed]" |
|
92 FAILED=YES |
|
93 fi |
|
94 } |
|
95 |
|
96 function check_warning() { |
|
97 echo -n " [$2 warning]" |
|
98 WARNED=YES |
|
99 } |
|
100 |
|
101 function check_init() { |
|
102 echo Check source files... |
|
103 FAILED_FILES=0 |
|
104 WARNED_FILES=0 |
|
105 TOTAL_FILES=0 |
|
106 } |
|
107 |
|
108 function check_done() { |
|
109 echo $FAILED_FILES out of $TOTAL_FILES files has been failed. |
|
110 echo $WARNED_FILES out of $TOTAL_FILES files has been warned. |
|
111 |
|
112 if [ $FAILED_FILES -gt 0 ] |
|
113 then |
|
114 return 1 |
|
115 elif [ $WARNED_FILES -gt 0 ] |
|
116 then |
|
117 if [ "$WARNING" == 'INTERACTIVE' ] |
|
118 then |
|
119 echo -n "Assume as normal behaviour? (yes/no) " |
|
120 while read answer |
|
121 do |
|
122 if [ "$answer" == 'yes' ] |
|
123 then |
|
124 return 0 |
|
125 elif [ "$answer" == 'no' ] |
|
126 then |
|
127 return 1 |
|
128 fi |
|
129 echo -n "Assume as normal behaviour? (yes/no) " |
|
130 done |
|
131 elif [ "$WARNING" == 'WERROR' ] |
|
132 then |
|
133 return 1 |
|
134 fi |
|
135 fi |
|
136 } |
|
137 |
|
138 function check_begin() { |
|
139 ((TOTAL_FILES++)) |
|
140 FAILED=NO |
|
141 WARNED=NO |
|
142 } |
|
143 |
|
144 function check_end() { |
|
145 if [ $FAILED == YES ] |
|
146 then |
|
147 ((++FAILED_FILES)) |
|
148 fi |
|
149 if [ $WARNED == YES ] |
|
150 then |
|
151 ((++WARNED_FILES)) |
|
152 fi |
|
153 } |
|
154 |
|
155 |
|
156 |
|
157 # checks |
|
158 |
|
159 function header_check() { |
|
160 if echo $1 | grep -q -E 'Makefile\.am$' |
|
161 then |
|
162 return |
|
163 fi |
|
164 |
7 TMP_FILE=`mktemp` |
165 TMP_FILE=`mktemp` |
8 FILE_NAME=$1 |
|
9 |
166 |
10 (echo "/* -*- mode: C++; indent-tabs-mode: nil; -*- |
167 (echo "/* -*- mode: C++; indent-tabs-mode: nil; -*- |
11 * |
168 * |
12 * This file is a part of LEMON, a generic C++ optimization library. |
169 * This file is a part of LEMON, a generic C++ optimization library. |
13 * |
170 * |
23 * express or implied, and with no claim as to its suitability for any |
180 * express or implied, and with no claim as to its suitability for any |
24 * purpose. |
181 * purpose. |
25 * |
182 * |
26 */ |
183 */ |
27 " |
184 " |
28 awk 'BEGIN { pm=0; } |
185 awk 'BEGIN { pm=0; } |
29 pm==3 { print } |
186 pm==3 { print } |
30 /\/\* / && pm==0 { pm=1;} |
187 /\/\* / && pm==0 { pm=1;} |
31 /[^:blank:]/ && (pm==0 || pm==2) { pm=3; print;} |
188 /[^:blank:]/ && (pm==0 || pm==2) { pm=3; print;} |
32 /\*\// && pm==1 { pm=2;} |
189 /\*\// && pm==1 { pm=2;} |
33 ' $1 |
190 ' $1 |
34 ) >$TMP_FILE |
191 ) >$TMP_FILE |
35 |
192 |
36 HEADER_CH=`diff -q $TMP_FILE $FILE_NAME >/dev/null&&echo NO||echo YES` |
193 "$ACTION"_action "$TMP_FILE" "$1" header |
37 |
194 } |
38 rm $FILE_NAME |
195 |
39 mv $TMP_FILE $FILE_NAME |
196 function tabs_check() { |
40 } |
197 if echo $1 | grep -q -v -E 'Makefile\.am$' |
41 |
198 then |
42 function update_tabs() { |
199 OLD_PATTERN=$(echo -e '\t') |
|
200 NEW_PATTERN=' ' |
|
201 else |
|
202 OLD_PATTERN=' ' |
|
203 NEW_PATTERN=$(echo -e '\t') |
|
204 fi |
43 TMP_FILE=`mktemp` |
205 TMP_FILE=`mktemp` |
44 FILE_NAME=$1 |
206 cat $1 | sed -e "s/$OLD_PATTERN/$NEW_PATTERN/g" >$TMP_FILE |
45 |
207 |
46 cat $1 | |
208 "$ACTION"_action "$TMP_FILE" "$1" 'tabs' |
47 sed -e 's/\t/ /g' >$TMP_FILE |
209 } |
48 |
210 |
49 TABS_CH=`diff -q $TMP_FILE $FILE_NAME >/dev/null&&echo NO||echo YES` |
211 function spaces_check() { |
50 |
|
51 rm $FILE_NAME |
|
52 mv $TMP_FILE $FILE_NAME |
|
53 } |
|
54 |
|
55 function remove_trailing_space() { |
|
56 TMP_FILE=`mktemp` |
212 TMP_FILE=`mktemp` |
57 FILE_NAME=$1 |
213 cat $1 | sed -e 's/ \+$//g' >$TMP_FILE |
58 |
214 |
59 cat $1 | |
215 "$ACTION"_action "$TMP_FILE" "$1" 'spaces' |
60 sed -e 's/ \+$//g' >$TMP_FILE |
216 } |
61 |
217 |
62 SPACES_CH=`diff -q $TMP_FILE $FILE_NAME >/dev/null&&echo NO||echo YES` |
218 function long_lines_check() { |
63 |
219 if cat $1 | grep -q -E '.{81,}' |
64 rm $FILE_NAME |
220 then |
65 mv $TMP_FILE $FILE_NAME |
221 "$ACTION"_warning $1 'long lines' |
66 } |
222 fi |
67 |
223 } |
68 function long_line_test() { |
224 |
69 cat $1 |grep -q -E '.{81,}' |
225 # process the file |
70 } |
226 |
71 |
227 function process_file() { |
72 function update_file() { |
228 echo -n " $ACTION " $1... |
73 echo -n ' update' $i ... |
229 |
74 |
230 CHECKING="header tabs spaces long_lines" |
75 update_header $1 |
231 |
76 update_tabs $1 |
232 "$ACTION"_begin $1 |
77 remove_trailing_space $1 |
233 for check in $CHECKING |
78 |
234 do |
79 CHANGED=NO; |
235 "$check"_check $1 |
80 if [[ $HEADER_CH = YES ]]; |
236 done |
81 then |
237 "$ACTION"_end $1 |
82 echo -n ' [header updated]' |
|
83 CHANGED=YES; |
|
84 fi |
|
85 if [[ $TABS_CH = YES ]]; |
|
86 then |
|
87 echo -n ' [tabs removed]' |
|
88 CHANGED=YES; |
|
89 fi |
|
90 if [[ $SPACES_CH = YES ]]; |
|
91 then |
|
92 echo -n ' [trailing spaces removed]' |
|
93 CHANGED=YES; |
|
94 fi |
|
95 if long_line_test $1 ; |
|
96 then |
|
97 echo -n ' [LONG LINES]' |
|
98 ((LONG_LINE_FILES++)) |
|
99 fi |
|
100 echo |
238 echo |
101 if [[ $CHANGED = YES ]]; |
239 } |
102 then |
240 |
103 ((CHANGED_FILES++)) |
241 function process_all { |
104 fi |
242 "$ACTION"_init |
105 } |
243 while read file |
106 |
|
107 CHANGED_FILES=0 |
|
108 TOTAL_FILES=0 |
|
109 LONG_LINE_FILES=0 |
|
110 if [ $# == 0 ]; then |
|
111 echo Update all source files... |
|
112 for i in `hg manifest|grep -E '\.(cc|h|dox)$'` |
|
113 do |
244 do |
114 update_file $HGROOT/$i |
245 process_file $file |
115 ((TOTAL_FILES++)) |
246 done < <($FILES) |
116 done |
247 "$ACTION"_done |
117 echo ' done.' |
248 } |
118 else |
249 |
119 for i in $* |
250 while [ $# -gt 0 ] |
120 do |
251 do |
121 update_file $i |
252 |
122 ((TOTAL_FILES++)) |
253 if [ "$1" == '--help' ] || [ "$1" == '-h' ] |
123 done |
254 then |
|
255 echo -n \ |
|
256 "Usage: |
|
257 $0 [OPTIONS] [files] |
|
258 Options: |
|
259 --dry-run|-n |
|
260 Check the given files, but do not modify them. |
|
261 --interactive|-i |
|
262 If --dry-run is specified and files are warned then a message is |
|
263 prompted whether the warnings should be turned to errors. |
|
264 --werror|-w |
|
265 If --dry-run is specified and the warnings are turned to errors. |
|
266 --all|-a |
|
267 All files in the repository will be checked. |
|
268 --modified|-m |
|
269 Check only the modified source files. This option is proper to |
|
270 use before a commit. E.g. all files which are modified or added |
|
271 into the repository will be updated. |
|
272 --changed|-c |
|
273 Check only the changed source files compared to the parent(s) of |
|
274 the current hg node. This option is proper to use as hg hook |
|
275 script. E.g. to check all your commited source files with this |
|
276 script add the following section to the appropriate .hg/hgrc |
|
277 file. |
|
278 |
|
279 [hooks] |
|
280 pretxncommit.checksources = scripts/unify-sources.sh -c -n -i |
|
281 |
|
282 --help|-h |
|
283 Print this help message. |
|
284 files |
|
285 The files to check/unify. If no file names are given, the |
|
286 modified source will be checked/unified |
|
287 |
|
288 " |
|
289 exit 0 |
|
290 elif [ "$1" == '--dry-run' ] || [ "$1" == '-n' ] |
|
291 then |
|
292 [ -n "$ACTION" ] && echo "Invalid option $1" >&2 && exit 1 |
|
293 ACTION=check |
|
294 elif [ "$1" == "--all" ] || [ "$1" == '-a' ] |
|
295 then |
|
296 [ -n "$FILES" ] && echo "Invalid option $1" >&2 && exit 1 |
|
297 FILES=all_files |
|
298 elif [ "$1" == "--changed" ] || [ "$1" == '-c' ] |
|
299 then |
|
300 [ -n "$FILES" ] && echo "Invalid option $1" >&2 && exit 1 |
|
301 FILES=changed_files |
|
302 elif [ "$1" == "--modified" ] || [ "$1" == '-m' ] |
|
303 then |
|
304 [ -n "$FILES" ] && echo "Invalid option $1" >&2 && exit 1 |
|
305 FILES=modified_files |
|
306 elif [ "$1" == "--interactive" ] || [ "$1" == "-i" ] |
|
307 then |
|
308 [ -n "$WARNING" ] && echo "Invalid option $1" >&2 && exit 1 |
|
309 WARNING='INTERACTIVE' |
|
310 elif [ "$1" == "--werror" ] || [ "$1" == "-w" ] |
|
311 then |
|
312 [ -n "$WARNING" ] && echo "Invalid option $1" >&2 && exit 1 |
|
313 WARNING='WERROR' |
|
314 elif [ $(echo $1 | cut -c 1) == '-' ] |
|
315 then |
|
316 echo "Invalid option $1" >&2 && exit 1 |
|
317 else |
|
318 [ -n "$FILES" ] && echo "Invalid option $1" >&2 && exit 1 |
|
319 GIVEN_FILES=$@ |
|
320 FILES=given_files |
|
321 break |
|
322 fi |
|
323 |
|
324 shift |
|
325 done |
|
326 |
|
327 if [ -z $FILES ] |
|
328 then |
|
329 FILES=modified_files |
124 fi |
330 fi |
125 echo $CHANGED_FILES out of $TOTAL_FILES files has been changed. |
331 |
126 if [[ $LONG_LINE_FILES -gt 1 ]]; then |
332 if [ -z $ACTION ] |
127 echo |
333 then |
128 echo WARNING: $LONG_LINE_FILES files contains long lines! |
334 ACTION=update |
129 echo |
|
130 elif [[ $LONG_LINE_FILES -gt 0 ]]; then |
|
131 echo |
|
132 echo WARNING: a file contains long lines! |
|
133 echo |
|
134 fi |
335 fi |
|
336 |
|
337 process_all |