support for normalize
[infrastructure.git] / scripts / svn-keywords.sh
1 #!/bin/bash
2 # $Id$
3 # $URL$
4
5 COMMAND=$(basename $0)
6
7 usage () {
8
9    echo "Usage: $COMMAND keywords -- files or directories"
10    exit 1
11
12 }
13
14 [[ -z "$@" ]] && usage
15
16 mode=keywords
17
18 while [[ "$@" ]] ; do
19
20   case "$1" in
21     --)
22       mode=dirs ; shift ;;
23     *)
24       case $mode in
25         keywords)
26           keywords="$keywords $1" ; shift ;;
27         dirs)
28           dirs="$dirs $1" ; shift ;;
29         *)
30           usage ;;
31       esac
32       ;;
33   esac
34 done
35   
36 if [ "$mode" == keywords -o -z "$dirs" -o -z "$keywords" ] ; then
37   usage
38 fi
39
40 function run_keyword_on_file () {
41     file=$1; shift
42     echo -n "$file "
43     if [ ! -f $file ] ; then
44         echo "NOT FOUND - skipped"
45         continue
46     fi
47     current_keywords=$(svn propget svn:keywords $file)
48     has_keyword=$(echo $current_keywords | grep $keyword)
49     if [ -z "$has_keyword" ] ; then
50         echo "+$keyword"
51         svn propset svn:keywords "$current_keywords $keyword" $file
52     else
53         echo "="
54     fi
55 }    
56
57 # figures what files need to have the svn:keywords set, and adds it when missing
58 function run_keywords () {
59     for dir in $dirs; do
60         cd $here
61         if [ -d $dir ] ; then
62             cd $dir
63             echo "xxxxxxxxxxxxxxxxxxxx Fixing keywords props in $(pwd)"
64             echo -n "xxxxxxxxxx Gathering files under subversion "
65             svnfiles=$(svn list -R)
66             echo $(ls -1 $svnfiles | wc -l) files found
67             
68             for keyword in $keywords ; do
69                 
70                 files=$(grep -l '$'"$keyword" $svnfiles)
71                 nbfiles=$(ls -1 $files | wc -l)
72                 echo Found $nbfiles with \$$keyword
73             
74                 for file in $files ; do
75                     run_keywords_on_file $file
76                 done
77             done
78         else 
79             for keyword in $keywords ; do
80                 run_keyword_on_file $dir
81             done
82         fi
83     done
84 }
85
86 # removes expansion of the specified keywords for diff
87 # useful when comparing with another codebase
88 function run_normalize_on_files () {
89     for keyword in $keywords ; do
90         echo "Deflating \$$keyword on $# files"
91         sed -i -e 's,$'"$keyword"'.*\$,\$'"$keyword"'$,' "$@"
92     done
93 }    
94
95 function run_normalize () {
96     for dir in $dirs; do
97         cd $here
98         if [ -d $dir ] ; then
99             cd $dir
100             echo "xxxxxxxxxxxxxxxxxxxx Normalizing keywords $keywords in $dir(pwd) "
101             echo -n "xxxxxxxxxx Gathering actual files under subversion "
102             svnfiles=$(svn list -R)
103
104             files=""
105             for scan in $svnfiles; do
106                 if [ -d $scan ] ; then continue
107                 elif [ -L $scan ] ; then continue
108                 else files="$files $scan"
109                 fi
110             done
111             echo $(ls -1 $files |wc -l) files found
112             run_normalize_on_files$files
113             echo Done
114         else
115             run_normalize_on_files $dir
116         fi
117     done
118 }
119
120 here=$(pwd -P)
121
122 case $0 in
123     *keywords*)
124         run_keywords ;;
125     *normalize*)
126         run_normalize ;;
127     *)
128         echo Unsupported command $0 ;;
129 esac