scripts/unify-sources.sh
author Peter Kovacs <kpeter@inf.elte.hu>
Tue, 24 Mar 2009 00:18:25 +0100
changeset 596 8c3112a66878
parent 341 f8832dc16d45
child 544 6b9c1f6eb1e5
permissions -rwxr-xr-x
Use XTI implementation instead of ATI in NetworkSimplex (#234)

XTI (eXtended Threaded Index) is an imporved version of the widely
known ATI (Augmented Threaded Index) method for storing and updating
the spanning tree structure in Network Simplex algorithms.

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