minor improvements
[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     keyword=$1; shift
42     file=$1; shift
43     echo -n "$file "
44     if [ ! -f $file ] ; then
45         echo "NOT FOUND - skipped"
46         continue
47     fi
48     current_keywords=$(svn propget svn:keywords $file)
49     has_keyword=$(echo $current_keywords | grep $keyword)
50     if [ -z "$has_keyword" ] ; then
51         echo "+$keyword"
52         svn propset svn:keywords "$current_keywords $keyword" $file
53     else
54         echo "="
55     fi
56 }    
57
58 # figures what files need to have the svn:keywords set, and adds it when missing
59 function run_keywords () {
60     for dir in $dirs; do
61         cd $here
62         if [ -d $dir ] ; then
63             cd $dir
64             echo "xxxxxxxxxxxxxxxxxxxx Fixing keywords props in $(pwd)"
65             echo -n "xxxxxxxxxx Gathering files under subversion "
66             svnfiles=$(svn list -R | grep -v '/$')
67             
68             # handle this, as otherwise grep hangs on stdin
69             if [ -z "$svnfiles" ] ; then
70                 echo "xxxxx Nothing applicable in $dir - skipping"
71                 continue
72             fi
73                 
74             echo $(ls -1 $svnfiles | wc -l) files found
75
76             for keyword in $keywords ; do
77                 
78                 files=$(grep -l '$'"$keyword" $svnfiles)
79                 if [ -z "$files" ] ; then
80                     echo "xxxxx No file found with \$$keyword"
81                     continue
82                 fi
83                 nbfiles=$(ls -1 $files | wc -l)
84                 echo "xxxxx Found" $nbfiles "with \$$keyword"
85             
86                 for file in $files ; do
87                     run_keyword_on_file $keyword $file
88                 done
89             done
90         else 
91             for keyword in $keywords ; do
92                 grep '$'"$keyword" $dir > /dev/null && run_keyword_on_file $keyword $dir
93             done
94         fi
95     done
96 }
97
98 # removes expansion of the specified keywords for diff
99 # useful when comparing with another codebase
100 function run_normalize_on_files () {
101     for keyword in $keywords ; do
102         echo "Deflating \$$keyword on $# files"
103         for file in "$@" ; do
104             sed -e 's,$'"$keyword"'.*\$,\$'"$keyword"'$,' $file > $file.new
105             mv $file.new $file
106         done
107     done
108 }    
109
110 function run_normalize () {
111     for dir in $dirs; do
112         cd $here
113         if [ -d $dir ] ; then
114             cd $dir
115             echo "xxxxxxxxxxxxxxxxxxxx Normalizing keywords $keywords in $(pwd) "
116             echo -n "xxxxxxxxxx Gathering actual files under subversion "
117             svnfiles=$(svn list -R)
118
119             files=""
120             for scan in $svnfiles; do
121                 if [ -d $scan ] ; then continue
122                 elif [ -L $scan ] ; then continue
123                 else files="$files $scan"
124                 fi
125             done
126             echo $(ls -1 $files |wc -l) files found
127             run_normalize_on_files $files
128             echo Done
129         else
130             run_normalize_on_files $dir
131         fi
132     done
133 }
134
135 here=$(pwd -P)
136
137 case $0 in
138     *keywords*)
139         run_keywords ;;
140     *normalize*)
141         run_normalize ;;
142     *)
143         echo Unsupported command $0 ;;
144 esac