COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • scripts/unify-sources.sh

    r341 r208  
    44HGROOT=`hg root`
    55
    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 triggered warnings.
    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 [ "$3" == 'tabs' ]
    90     then
    91         PATTERN=$(echo -e '\t')
    92     elif [ "$3" == 'trailing spaces' ]
    93     then
    94         PATTERN='\ +$'
    95     else
    96         PATTERN='*'
    97     fi
    98 
    99     if ! diff -q $1 $2 >/dev/null
    100     then
    101         if [ "$PATTERN" == '*' ]
    102         then
    103             diff $1 $2 | grep '^[0-9]' | sed "s|^\(.*\)c.*$|$2:\1: check failed: $3|g" |
    104               sed "s/:\([0-9]*\),\([0-9]*\):\(.*\)$/:\1:\3 (until line \2)/g"
    105         else
    106             grep -n -E "$PATTERN" $2 | sed "s|^\([0-9]*\):.*$|$2:\1: check failed: $3|g"
    107         fi
    108         FAILED=YES
    109     fi
    110 }
    111 
    112 function check_warning() {
    113     if [ "$2" == 'long lines' ]
    114     then
    115         grep -n -E '.{81,}' $1 | sed "s|^\([0-9]*\):.*$|$1:\1: warning: $2|g"
    116     else
    117         echo "$1: warning: $2"
    118     fi
    119     WARNED=YES
    120 }
    121 
    122 function check_init() {
    123     echo Check source files...
    124     FAILED_FILES=0
    125     WARNED_FILES=0
    126     TOTAL_FILES=0
    127 }
    128 
    129 function check_done() {
    130     echo $FAILED_FILES out of $TOTAL_FILES files has been failed.
    131     echo $WARNED_FILES out of $TOTAL_FILES files triggered warnings.
    132 
    133     if [ $FAILED_FILES -gt 0 ]
    134     then
    135         return 1
    136     elif [ $WARNED_FILES -gt 0 ]
    137     then
    138         if [ "$WARNING" == 'INTERACTIVE' ]
    139         then
    140             echo -n "Are the files with warnings acceptable? (yes/no) "
    141             while read answer
    142             do
    143                 if [ "$answer" == 'yes' ]
    144                 then
    145                     return 0
    146                 elif [ "$answer" == 'no' ]
    147                 then
    148                     return 1
    149                 fi
    150                 echo -n "Are the files with warnings acceptable? (yes/no) "
    151             done
    152         elif [ "$WARNING" == 'WERROR' ]
    153         then
    154             return 1
    155         fi
    156     fi
    157 }
    158 
    159 function check_begin() {
    160     ((TOTAL_FILES++))
    161     FAILED=NO
    162     WARNED=NO
    163 }
    164 
    165 function check_end() {
    166     if [ $FAILED == YES ]
    167     then
    168         ((++FAILED_FILES))
    169     fi
    170     if [ $WARNED == YES ]
    171     then
    172         ((++WARNED_FILES))
    173     fi
    174 }
    175 
    176 
    177 
    178 # checks
    179 
    180 function header_check() {
    181     if echo $1 | grep -q -E 'Makefile\.am$'
    182     then
    183         return
    184     fi
    185 
     6function update_header() {
    1867    TMP_FILE=`mktemp`
     8    FILE_NAME=$1
    1879
    18810    (echo "/* -*- mode: C++; indent-tabs-mode: nil; -*-
     
    20426 */
    20527"
    206     awk 'BEGIN { pm=0; }
     28        awk 'BEGIN { pm=0; }
    20729     pm==3 { print }
    20830     /\/\* / && pm==0 { pm=1;}
     
    21032     /\*\// && pm==1 { pm=2;}
    21133    ' $1
    212     ) >$TMP_FILE
     34        ) >$TMP_FILE
    21335
    214     "$ACTION"_action "$TMP_FILE" "$1" header
     36    HEADER_CH=`diff -q $TMP_FILE $FILE_NAME >/dev/null&&echo NO||echo YES`
     37
     38    rm $FILE_NAME
     39    mv $TMP_FILE $FILE_NAME
    21540}
    21641
    217 function tabs_check() {
    218     if echo $1 | grep -q -v -E 'Makefile\.am$'
    219     then
    220         OLD_PATTERN=$(echo -e '\t')
    221         NEW_PATTERN='        '
    222     else
    223         OLD_PATTERN='        '
    224         NEW_PATTERN=$(echo -e '\t')
    225     fi
     42function update_tabs() {
    22643    TMP_FILE=`mktemp`
    227     cat $1 | sed -e "s/$OLD_PATTERN/$NEW_PATTERN/g" >$TMP_FILE
     44    FILE_NAME=$1
    22845
    229     "$ACTION"_action "$TMP_FILE" "$1" 'tabs'
     46    cat $1 |
     47    sed -e 's/\t/        /g' >$TMP_FILE
     48
     49    TABS_CH=`diff -q $TMP_FILE $FILE_NAME >/dev/null&&echo NO||echo YES`
     50
     51    rm $FILE_NAME
     52    mv $TMP_FILE $FILE_NAME
    23053}
    23154
    232 function spaces_check() {
     55function remove_trailing_space() {
    23356    TMP_FILE=`mktemp`
    234     cat $1 | sed -e 's/ \+$//g' >$TMP_FILE
     57    FILE_NAME=$1
    23558
    236     "$ACTION"_action "$TMP_FILE" "$1" 'trailing spaces'
     59    cat $1 |
     60    sed -e 's/ \+$//g' >$TMP_FILE
     61
     62    SPACES_CH=`diff -q $TMP_FILE $FILE_NAME >/dev/null&&echo NO||echo YES`
     63
     64    rm $FILE_NAME
     65    mv $TMP_FILE $FILE_NAME
    23766}
    23867
    239 function long_lines_check() {
    240     if cat $1 | grep -q -E '.{81,}'
     68function long_line_test() {
     69    cat $1 |grep -q -E '.{81,}'
     70}
     71
     72function update_file() {
     73    echo -n '    update' $i ...
     74
     75    update_header $1
     76    update_tabs $1
     77    remove_trailing_space $1
     78
     79    CHANGED=NO;
     80    if [[ $HEADER_CH = YES ]];
    24181    then
    242         "$ACTION"_warning $1 'long lines'
     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
     101    if [[ $CHANGED = YES ]];
     102    then
     103        ((CHANGED_FILES++))
    243104    fi
    244105}
    245106
    246 # process the file
    247 
    248 function process_file() {
    249     if [ "$ACTION" == 'update' ]
    250     then
    251         echo -n "    $ACTION $1..."
    252     else
    253         echo "    $ACTION $1..."
    254     fi
    255 
    256     CHECKING="header tabs spaces long_lines"
    257 
    258     "$ACTION"_begin $1
    259     for check in $CHECKING
     107CHANGED_FILES=0
     108TOTAL_FILES=0
     109LONG_LINE_FILES=0
     110if [ $# == 0 ]; then
     111    echo Update all source files...
     112    for i in `hg manifest|grep -E  '\.(cc|h|dox)$'`
    260113    do
    261         "$check"_check $1
     114        update_file $HGROOT/$i
     115        ((TOTAL_FILES++))
    262116    done
    263     "$ACTION"_end $1
    264     if [ "$ACTION" == 'update' ]
    265     then
    266         echo
    267     fi
    268 }
    269 
    270 function process_all {
    271     "$ACTION"_init
    272     while read file
     117    echo '  done.'
     118else
     119    for i in $*
    273120    do
    274         process_file $file
    275     done < <($FILES)
    276     "$ACTION"_done
    277 }
    278 
    279 while [ $# -gt 0 ]
    280 do
    281    
    282     if [ "$1" == '--help' ] || [ "$1" == '-h' ]
    283     then
    284         echo -n \
    285 "Usage:
    286   $0 [OPTIONS] [files]
    287 Options:
    288   --dry-run|-n
    289      Check the files, but do not modify them.
    290   --interactive|-i
    291      If --dry-run is specified and the checker emits warnings,
    292      then the user is asked if the warnings should be considered
    293      errors.
    294   --werror|-w
    295      Make all warnings into errors.
    296   --all|-a
    297      Check all source files in the repository.
    298   --modified|-m
    299      Check only the modified (and new) source files. This option is
    300      useful to check the modification before making a commit.
    301   --changed|-c
    302      Check only the changed source files compared to the parent(s) of
    303      the current hg node.  This option is useful as hg hook script.
    304      To automatically check all your changes before making a commit,
    305      add the following section to the appropriate .hg/hgrc file.
    306 
    307        [hooks]
    308        pretxncommit.checksources = scripts/unify-sources.sh -c -n -i
    309 
    310   --help|-h
    311      Print this help message.
    312   files
    313      The files to check/unify. If no file names are given, the modified
    314      source files will be checked/unified (just like using the
    315      --modified|-m option).
    316 "
    317         exit 0
    318     elif [ "$1" == '--dry-run' ] || [ "$1" == '-n' ]
    319     then
    320         [ -n "$ACTION" ] && echo "Conflicting action options" >&2 && exit 1
    321         ACTION=check
    322     elif [ "$1" == "--all" ] || [ "$1" == '-a' ]
    323     then
    324         [ -n "$FILES" ] && echo "Conflicting target options" >&2 && exit 1
    325         FILES=all_files
    326     elif [ "$1" == "--changed" ] || [ "$1" == '-c' ]
    327     then
    328         [ -n "$FILES" ] && echo "Conflicting target options" >&2 && exit 1
    329         FILES=changed_files
    330     elif [ "$1" == "--modified" ] || [ "$1" == '-m' ]
    331     then
    332         [ -n "$FILES" ] && echo "Conflicting target options" >&2 && exit 1
    333         FILES=modified_files
    334     elif [ "$1" == "--interactive" ] || [ "$1" == "-i" ]
    335     then
    336         [ -n "$WARNING" ] && echo "Conflicting warning options" >&2 && exit 1
    337         WARNING='INTERACTIVE'
    338     elif [ "$1" == "--werror" ] || [ "$1" == "-w" ]
    339     then
    340         [ -n "$WARNING" ] && echo "Conflicting warning options" >&2 && exit 1
    341         WARNING='WERROR'
    342     elif [ $(echo x$1 | cut -c 2) == '-' ]
    343     then
    344         echo "Invalid option $1" >&2 && exit 1
    345     else
    346         [ -n "$FILES" ] && echo "Invalid option $1" >&2 && exit 1
    347         GIVEN_FILES=$@
    348         FILES=given_files
    349         break
    350     fi
    351    
    352     shift
    353 done
    354 
    355 if [ -z $FILES ]
    356 then
    357     FILES=modified_files
     121        update_file $i
     122        ((TOTAL_FILES++))
     123    done
    358124fi
    359 
    360 if [ -z $ACTION ]
    361 then
    362     ACTION=update
     125echo $CHANGED_FILES out of $TOTAL_FILES files has been changed.
     126if [[ $LONG_LINE_FILES -gt 1 ]]; then
     127    echo
     128    echo WARNING: $LONG_LINE_FILES files contains long lines!   
     129    echo
     130elif [[ $LONG_LINE_FILES -gt 0 ]]; then
     131    echo
     132    echo WARNING: a file contains long lines!
     133    echo
    363134fi
    364 
    365 process_all
Note: See TracChangeset for help on using the changeset viewer.